我对并行编程和堆栈溢出非常陌生。我正在使用 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
每个线程都添加到一个初始化为 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();
}