system
1
大家好,昨天刚入手cuda,请问一个问题,若有一个矩阵,我想求其和,并返回,怎么做?
手册有例子写vector求和,但还是一头雾水,主要困惑是
1)初学者往往对 gridDim.x blockDim.x 等分不清楚,也就是说,二维矩阵的寻址是一个问题。请不要和我说把矩阵当做向量,我这里说的矩阵,其实 往往是一幅超大的图像。
2)好像规约运算并没有完全返回一个实数,看到的更多程序是一个维度很小的向量,怎么才能返回实数?
我知道这是一个很简单的问题,正因为简单,想不明白才寻求大家的帮助,也因为简单,代码肯定很少,所以能贴上源码就好了,谢谢大家。
system
2
我自己先给出一段代码,该代码 在 维度比较低得时候 可以算出正确结果,维度高了之后,会出错。
求解答
global void SUMLUM(int *dev_ptr, int imgWidth, int imgHeight, float *result) {
__shared__ float cache[BLOCKDIM_X*BLOCKDIM_Y];
int x = blockIdx.x*blockDim.x + threadIdx.x;
int y = blockIdx.y*blockDim.y + threadIdx.y;
int offset = y*blockDim.x*gridDim.x + x;
int cacheIndex = threadIdx.y*BLOCKDIM_X + threadIdx.x;
float tmp = 0;
while(offset<imgHeight*imgWidth) {
//if((int)dev_ptr[offset]>128)
// tmp += 1.0f;
tmp += (float)dev_ptr[offset];
offset += blockDim.x*blockDim.y*gridDim.x;
}
cache[cacheIndex] = tmp;
__syncthreads();
int i = (BLOCKDIM_X*BLOCKDIM_Y)/2;;
while(i!=0) {
if(cacheIndex<i)
cache[cacheIndex] += cache[cacheIndex+i];
__syncthreads();
i /= 2;
}
if(cacheIndex==0)
result[blockIdx.x] = cache[0];
}
system
4
BLOCKDIM_X是否就是blockdim.x,BLOCKDIM_Y就是blockdim.y ?若是,按我的理解,你的cache不应该是BLOCKDIM_XBLOCKDIM_Y,而应该是 BLOCKDIM_XBLOCKDIM_Y*globaldim.x,所以当你维度小于一个块时正确,大于一个块时错误。