我在CUBLAS中编写了一个与cublasSdgmm
相同的CUDA函数,我发现当我增加块编号时,函数性能可能会更差,甚至会失败。
这是代码,M = 9.6e6,S = 3,最佳性能块编号为320,我的GPU为GTX960,X维度的最大块大小为2147483647。
__global__ void DgmmKernel(float *d_y, float *d_r, int M, int S){
int row = blockIdx.x*blockDim.x + threadIdx.x;
int col = blockIdx.y*blockDim.y + threadIdx.y;
while(row < M){
d_y[row + col * M] *= d_r[row];
row += blockDim.x * gridDim.x;
}
}
void Dgmm(float *d_y, float *d_r, int M, int S){
int xthreads_per_block = 1024;
dim3 dimBlock(xthreads_per_block, 1);
dim3 dimGrid(320, S);
DgmmKernel<<<dimBlock, dimGrid>>>(d_y, d_r, M, S);
}
我猜原因是GPU中可能存在资源限制,是不是正确?
如果它是正确的,什么特定资源限制性能,内核函数只读取两个向量并执行乘法运算。是否有任何方法可以提高我的GPU性能。
答案 0 :(得分:2)
您在内核启动时反转了块和网格维度参数,并且您的内核永远不会运行。你应该这样做:
dim3 dimBlock(xthreads_per_block, 1);
dim3 dimGrid(320, S);
DgmmKernel<<<dimGrid, dimBlock>>>(d_y, d_r, M, S);
如果您的代码包含appropriate runtime error checking,则您已经知道内核启动失败,并且对于S&gt; 3的任何值,配置错误都是无效的。