Tag: 矩阵乘法

计算矩阵产品AXA’的有效方法?

我目前正在使用BLAS函数DSYMM计算Y = AX然后使用DGEMM计算YA’ ,但我想知道是否有一些更有效的方法来计算矩阵乘积AXA T ,其中A是任意n×n矩阵和X是一个对称的n×n矩阵?

使用multithreading的矩阵乘法?

我应该使用线程乘以2个矩阵。 两件事:我在运行程序时一直保持0。 我也得到消息错误(对于每一个,它都说“警告:在粗体线上传递’printMatrix’的参数1来自不兼容的指针类型”(我尝试打印输出)。另外要注意,第一个块是粗体,我这是我尝试解决问题。我想我很接近,但我可能不会。有人可以帮忙吗?谢谢:)输出看起来像这样:A = 1 4 2 5 3 6 B = 8 7 6 5 4 3 A * B = 0 0 0 0 0 0 0 0 0 #include #include #include #define M 3 #define K 2 #define N 3 struct v { int i; //row int j; //column }; int A[M][K] […]

通过线程和SIMD并行化矩阵乘法

我正在尝试加速多核架构上的矩阵乘法。 为此,我尝试同时使用线程和SIMD。 但我的结果并不好。 我通过顺序矩阵乘法测试加速: void sequentialMatMul(void* params) { cout << "SequentialMatMul started."; int i, j, k; for (i = 0; i < N; i++) { for (k = 0; k < N; k++) { for (j = 0; j < N; j++) { X[i][j] += A[i][k] * B[k][j]; } } } cout << "\nSequentialMatMul finished."; […]

行主要与列主要矩阵乘法

我目前正在研究一个试图计算矩阵乘法的C程序。我已经通过循环遍历第二个矩阵的每一列来完成这个任务,如下所示。 我将大小设置为1000。 for(i=0;i<size;i++) { for(j=0;j<size;j++) { for(k=0;k<size;k++) { matC[i][j]+=matA[i][k]*matB[k][j]; } } } 我想知道在这个实现中有什么问题的访问模式..什么使行/列访问比另一个更有效? 我试图从使用Caches的逻辑方面理解这一点。请帮助我理解这一点。 非常感谢您的帮助 :)

有效地存储三角矩阵

我需要通过不将所有零存储在内存中来有效地存储下三角矩阵,所以我已经考虑过这种方式:首先我为每一行分配内存,然后为每一行分配i + 1个字节,所以我永远不会不得不担心零,但在第一次分配时出现问题。 我究竟做错了什么? 这是我的代码,编译器在读取矩阵的维度后,在第8行退出程序。 #include #include int main () { int i, j, **mat1, dim; scanf(“%d”,&dim); *mat1 = (int**)calloc(dim, sizeof(int*)); for(i = 0; i<dim; i++) mat1[i] = (int*)calloc(i+1, sizeof(int)); for(i = 0; i < dim; i++) for(j = 0; j < i+1; j++) scanf("%d", &mat1[i][j]); for(i=0; i<dim; i++) for(j=0; j<(i+1); j++) printf("%d%c", mat1[i][j], j […]

矩阵乘法CUDA

我一直在阅读几个网站,甚至使用NVIDA的代码作为指南,但我仍然得到了错误的答案。 main将询问用户的大小,并显示A和B然后显示结果矩阵C.但是,我说A和B都运行2×2矩阵,这是我的示例输出: Matrix A 0.000000 8.000000 2.000000 2.000000 Matrix B 3.000000 1.000000 5.000000 7.000000 Matrix C (Results) 0.000000 9.000000 7.000000 4.000000 但这是不正确的。 它应该是: 40.000 56.000 16.000 16.000 我将它从小数改为整数,以便更容易检查,我发现它是不正确的。 我不明白为什么它会不正确,特别是即使我从他们的代码示例中采取了它。 #ifndef _MATRIXMUL_KERNEL_H_ #define _MATRIXMUL_KERNEL_H_ #include // Thread block size #define BLOCK_SIZE 16 #define TILE_SIZE 16 // CUDA Kernel __global__ void matrixMul( float* C, float* A, float* […]

C与Python / numpy的数学表现不佳

近似重复/​​相关: BLAS如何获得如此极端的性能? (如果你想在C语言中快速使用matmul,那么除非你想亲自调整自己的asm版本,否则请认真使用一个好的BLAS库。)但这并不意味着看到编译欠优化矩阵代码时会发生什么并不重要。 如何优化矩阵乘法(matmul)代码,以便在单个处理器内核上快速运行 矩阵乘法与块 出于兴趣,我决定比较(不熟练的)手写C与Python / numpy的性能,执行两个大的方形矩阵的简单矩阵乘法,填充从0到1的随机数。 我发现python / numpy超过我的C代码超过10,000x这显然是不对的,所以我的C代码导致它执行得如此糟糕? (甚至用-O3或-Ofast编译) python: import time import numpy as np t0 = time.time() m1 = np.random.rand(2000, 2000) m2 = np.random.rand(2000, 2000) t1 = time.time() m3 = m1 @ m2 t2 = time.time() print(‘creation time: ‘, t1 – t0, ‘ \n multiplication time: ‘, t2 – t1) […]

矩阵乘法与块

这是我加速矩阵乘法的代码,但它比简单乘法快5%。 我能做些什么来尽可能地提升它? *正在访问这些表格,例如: C [i,j,n]]用于C [i,j]位置。 void matrixMultFast(float * const C, /* output matrix */ float const * const A, /* first matrix */ float const * const B, /* second matrix */ int const n, /* number of rows/cols */ int const ib, /* size of i block */ int const jb, /* size […]

如何优化矩阵乘法(matmul)代码,以便在单个处理器内核上快速运行

我正在研究并行编程概念,并尝试在单核上优化矩阵乘法示例。 到目前为止我提出的最快的实现如下: /* This routine performs a dgemm operation * C := C + A * B * where A, B, and C are lda-by-lda matrices stored in column-major format. * On exit, A and B maintain their input values. */ void square_dgemm (int n, double* A, double* B, double* C) { /* For each […]

使用涂料矢量来访问多维数组的任意轴向切片?

我正在构建一组函数来处理多维数组数据结构 ,我希望能够定义数组的任意切片 ,这样我就可以实现两个任意矩阵(又名Tensors或nd数组 )的广义内积。 我读过的一篇APL论文(我老实说找不到哪篇 – 我读过这么多篇幅)定义了左边矩阵X上的矩阵乘积,其尺寸为A;B;C;D;E;F和右矩阵Y尺寸G;H;I;J;K其中F==G as Z <- X +.× Y Z[A;B;C;D;E;H;I;J;K] <- +/ X[A;B;C;D;E;*] × Y[*;H;I;J;K] 其中+/是和的和 ,并且×将逐个元素应用于两个相同长度的向量。 所以我需要左边的“行”切片和右边的“列”切片。 我当然可以使用转置,然后使用“行”切片来模拟“列”切片,但我宁愿更优雅地做。 维基百科关于切片的文章引出了关于涂料载体的存根,这似乎是我正在寻找的奇迹治疗方法,但是没有太多可以继续下去。 如何使用涂料矢量来实现任意切片? (很久以后我注意到Stride的一个数组有一些细节。)