Tag: matrix

矢量*矩阵产品效率问题

正如Z boson 推荐的那样 ,我使用的是列主矩阵格式,以避免使用点积。 但是,在将矢量与矩阵相乘时,我没有看到避免它的可行方法。 矩阵乘法技巧需要有效提取行(或列,如果我们转置产品)。 为了将矢量乘以矩阵,我们因此转置: (b * A)^T = A^T * b^T A是矩阵, b是行向量,在被转置之后变为列向量。 它的行只是单个标量,矢量*矩阵乘积实现成为(非转置)矩阵A和b的列点积的低效实现。 有没有办法避免执行这些点产品? 我认为可以做到的唯一方法是涉及行提取,这对于列主矩阵格式来说是低效的。

Opencl:确定最佳的local_item_size

我的代码就像2d matrix muliplication( http://gpgpu-computing4.blogspot.de/2009/09/matrix-multiplication-2-opencl.html )。 矩阵的尺寸为(1000 * 1000和10000 * 10000和100000 * 100000)。 我的硬件是:NVIDIA公司GM204 [GeForce GTX 980](MAX_WORK_GROUP_SIZES:1024 1024 64)。 问题是: 我可以使用什么最好的local_item_size? size_t local_item_size[2], global_item_size[2]; global_item_size[0] = number_of_points; global_item_size[1] = number_of_points; local_item_size[0] = 10; local_item_size[1] = 10; 提前致谢,

MPI – 发送和接收列

我需要从一个进程发送一个矩arrays,然后从另一个进程接收它。 我尝试运行以下程序,但是我得到了一个奇怪的结果(至少我是这么认为的); 仅复制矩阵的第一个元素,并且一些矩阵元素意外更改。 #include #include #include #include #include “mpi.h” void swap(int* a,int* b){ int temp; temp=*a; *a=*b; *b=temp; } void print_matrix(double** A,int n){ int i,j; for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%f ",A[i][j]); } printf("\n"); } } int main(int argc, char *argv[]){ int i,j,k,l,n,myid,p,maxp; double **A; MPI_Datatype col_type; MPI_Status status; n=3; A=malloc(n*sizeof(double*)); /*allocating memory */ for(i=0;i<n;i++) A[i]=malloc(n*sizeof(double)); A[0][0]=-1; A[0][1]=2; […]

优化的CUDA矩阵汉明距离

是否有人知道优化的CUDA内核用于计算尺寸为A x N和N x B的两个矩阵之间的GEMM样式汉明距离? 问题几乎与GEMM相同,而是计算每个向量{1 … N}的和(a_n!= b_n),而不是对每个向量元素进行乘法和求和。 我想在编写自己的之前validation,因为这个问题比较常见,但我还没有成功找到它的代码。 修改代码的建议也很好。 编辑: 除了下面的kangshiyin的建议之外,我发现这个优化的SGEMM实现的演绎对于理解CUDA C编程指南中基本共享内存矩阵乘法示例之外的步骤非常有帮助。

复制跨步数据(往返于CUDA设备)的有效方法?

是否有可能有效地将由恒定(或甚至非常数)值跨越的数据复制到CUDA设备和从CUDA设备复制? 我想对角化一个大的对称矩阵。 使用jacobi算法,在每次迭代中使用两行和两列进行一系列操作。 由于Matrix本身太大而无法完全复制到设备,因此我正在寻找将两行和两列复制到设备的方法。 使用三角矩阵forms存储数据会很好,但还有其他缺点 非恒定行长[不是那种问题] 列值的非恒定步幅[每行的步幅增加1。] 出现。 [编辑:即使使用三角形,仍然无法将整个Matrix存储在GPU上。] 我查看了一些时间并认识到逐个复制跨步值非常慢(同步和异步)。 //编辑:删除解决方案 – 添加了答案

如何使用MPI_Scatterv将矩阵行发送到所有进程?

我正在使用MPI接口。 我想分割矩阵(按行)并在每个过程中分配部分。 例如,我有这个7×7方阵M. M = [ 0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00 10.00 11.00 12.00 13.00 14.00 15.00 16.00 17.00 18.00 19.00 20.00 21.00 22.00 23.00 24.00 25.00 26.00 27.00 28.00 29.00 30.00 31.00 32.00 33.00 34.00 35.00 36.00 37.00 38.00 39.00 40.00 41.00 42.00 43.00 44.00 45.00 46.00 47.00 48.00 […]

MPI分区矩阵成块

我想将矩阵分区为块(而不是条带),然后使用MPI_Scatter分配这些块。 我提出了有效的解决方案,但我认为它远非“最佳实践”。 我有8×8矩阵,填充0到63之间的数字。然后我将它分成4个4×4块,使用MPI_Type_vector并通过MPI_Send分配它,但这需要一些额外的计算,因为我必须计算大矩阵中每个块的偏移量。 如果我使用分散,则第一个(左上角)块被传输OK,但是其他块不是(块的开始是错误的偏移)。 那么可以使用MPI_Scatter传输矩阵块,或者进行所需分解的最佳方法是什么? 这是我的代码: #include #include #include #define SIZE 8 int main(void) { MPI_Init(NULL, NULL); int p, rank; MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD, &rank); char i; char a[SIZE*SIZE]; char b[(SIZE/2)*(SIZE/2)]; MPI_Datatype columntype; MPI_Datatype columntype2; MPI_Type_vector(4, 4, SIZE, MPI_CHAR, &columntype2); MPI_Type_create_resized( columntype2, 0, sizeof(MPI_CHAR), &columntype ); MPI_Type_commit(&columntype); if(rank == 0) { for( i = 0; i […]