这是CUDA线程同步问题还是其他问题?
我对并行编程和堆栈溢出非常陌生。我正在使用CUDA实现矩阵乘法。我使用列顺序浮点数组作为矩阵表示 我开发的算法有点独特,如下所示。给定一个矩阵nxm矩阵a和mxk矩阵B,我启动一个nxk块,每个块中有m个线程。本质上,我为结果矩阵中的每个条目启动一个块,每个线程为该条目计算一次乘法。比如说,这是CUDA线程同步问题还是其他问题?,cuda,parallel-processing,matrix-multiplication,Cuda,Parallel Processing,Matrix Multiplication,我对并行编程和堆栈溢出非常陌生。我正在使用CUDA实现矩阵乘法。我使用列顺序浮点数组作为矩阵表示 我开发的算法有点独特,如下所示。给定一个矩阵nxm矩阵a和mxk矩阵B,我启动一个nxk块,每个块中有m个线程。本质上,我为结果矩阵中的每个条目启动一个块,每个线程为该条目计算一次乘法。比如说, 1 0 0 0 1 2 0 1 0 * 3 4 5 0 0 1 6 7 8 对于结果矩阵中的第一个条目,我将使用 线程0计算1*3 线程1计算0*0 线程2计算0*1 每个线程
1 0 0 0 1 2
0 1 0 * 3 4 5
0 0 1 6 7 8
对于结果矩阵中的第一个条目,我将使用
线程0计算1*3
线程1计算0*0
线程2计算0*1
每个线程添加到一个0初始化的矩阵。
现在,我没有得到正确的答案。我一遍又一遍地听到这个
0 0 2
0 0 5
0 0 8
我的内核函数如下。这可能是线程同步问题,还是我搞砸了数组索引之类的
/*@param d_A: Column order matrix
*@param d_B: Column order matrix
*@param d_result: 0-initialized matrix that kernels write to
*@param dim_A: dimensionality of A (number of rows)
*@param dim_B: dimensionality of B (number of rows)
*/
__global__ void dot(float *d_A, float *d_B, float *d_result, int dim_A, int dim_B) {
int n = blockIdx.x;
int k = blockIdx.y;
int m = threadIdx.x;
float a = d_A[(m * dim_A) + n];
float b = d_B[(k * dim_B) + m];
//d_result[(k * dim_A) + n] += (a * b);
syncthreads();
float temp = d_result[(k*dim_A) + n];
syncthreads();
temp = temp + (a * b);
syncthreads();
d_result[(k*dim_A) + n] = temp;
syncthreads();
}
在这种情况下,使用
syncthreads()
的整个想法是错误的。此API调用具有块作用域
1. syncthreads();
2. float temp = d_result[(k*dim_A) + n];
3. syncthreads();
4. temp = temp + (a * b);
5. syncthreads();
6. d_result[(k*dim_A) + n] = temp;
7. syncthreads();
局部变量<代码>浮动温度代码>具有线程作用域,使用此同步屏障毫无意义。
指针d_结果
是全局内存指针,使用此同步屏障也是毫无意义的。请注意,目前还没有一个全局同步线程的屏障(可能永远不会有)
当共享内存用于计算时,通常需要使用syncthreads()
。在这种情况下,您可能需要使用共享内存。您可以看到一个如何正确使用共享内存和syncthreads()
的示例。您有一个共享内存的矩阵乘法示例。在d_result[(k*dim_A)+n]=temp代码>块中的每个线程都在写入相同的位置,从而覆盖彼此的结果。