针对链接问题,进行了更新。
我目前正在尝试在CUDA中重新实现基本的矩阵乘法,虽然我的代码适用于方阵和行列数为8的倍数的长方形矩阵,但似乎无法处理长宽不是8的倍数的矩阵。
以下是我的核心乘法函数:
__global__ void matrixMultiply(float * A, float * B, float * C,
int numARows, int numAColumns,
int numBRows, int numBColumns,
int numCRows, int numCColumns) {
int Row = blockIdx.y * blockDim.y + threadIdx.y;
int Col = blockIdx.x * blockDim.x + threadIdx.x;
if (numAColumns != numBRows) return ;
if ((Row < numARows) && (Col < numBColumns)){
float Cvalue = 0;
for (int k = 0 ; k < numAColumns ; ++k )
Cvalue += A[Row*numAColumns + k] * B[k * numBColumns + Col];
C[Row*numCColumns + Col] = Cvalue;
}
}
以下是内存分配(为了易读性,我省略了错误检查):
cudaMalloc((void**) &deviceA, ARows*sizeof(float)*AColumns);
cudaMalloc((void**) &deviceB, BRows*sizeof(float)*BColumns);
cudaMalloc((void**) &deviceC, CRows*sizeof(float)*CColumns);
cudaMemcpy(deviceA, hostA, ARows*sizeof(float)*AColumns, cudaMemcpyHostToDevice);
cudaMemcpy(deviceB, hostB, BRows*sizeof(float)*BColumns, cudaMemcpyHostToDevice);
cudaMemcpy(deviceC, hostC, CRows*sizeof(float)*CColumns, cudaMemcpyHostToDevice);
以下是调用的内容:
dim3 dimGrid((int)ceil(numCRows / 8.0) , (int)ceil(numCColumns / 8.0), 1);
dim3 dimBlock(8 , 8, 1);
multiplyMatrices<<<dimGrid,dimBlock>>>(deviceA, deviceB, deviceC, numARows, AColumns, BRows, BColumns, CRows, CColumns);
最后是将内存移回:
cudaMemcpy(hostC, deviceC, CRows*sizeof(float)*CColumns, cudaMemcpyDeviceToHost);
我已经反复追踪了我的算法,我认为它没有任何问题,因此我个人认为可能是我使用的块/网格大小方案有问题。如果有任何比我更懂CUDA/C(我是Ruby/JavaScript程序员)的人可以看一下,并帮助我解决具体问题,我会非常感激。
if ((Row < numARows) && (Col < numBColumns)){
如果将其更改为:if ((Row < numCRows) && (Col < numCColumns)){
会发生什么?或者,我想看到每个行和列变量的数值。 - Robert Crovella