鉴于我有数组
Let Sum be 16
dintptr = { 0 , 2, 8,11,13,15}
我想使用GPU计算连续索引之间的差异。所以最终的数组应该如下:
count = { 2, 6,3,2,2,1}
以下是我的内核:
//for this function n is 6
__global__ void kernel(int *dintptr, int * count, int n){
int id = blockDim.x * blockIdx.x + threadIdx.x;
__shared__ int indexes[256];
int need = (n % 256 ==0)?0:1;
int allow = 256 * ( n/256 + need);
while(id < allow){
if(id < n ){
indexes[threadIdx.x] = dintptr[id];
}
__syncthreads();
if(id < n - 1 ){
if(threadIdx.x % 255 == 0 ){
count[id] = indexes[threadIdx.x + 1] - indexes[threadIdx.x];
}else{
count[id] = dintptr[id+1] - dintptr[id];
}
}//end if id<n-1
__syncthreads();
id+=(gridDim.x * blockDim.x);
}//end while
}//end kernel
// For last element explicitly set count[n-1] = SUm - dintptr[n-1]
2个问题:
答案 0 :(得分:2)
我会咬人。
__global__ void kernel(int *dintptr, int * count, int n)
{
for (int id = blockDim.x * blockIdx.x + threadIdx.x;
id < n-1;
id += gridDim.x * blockDim.x)
count[id] = dintptr[id+1] - dintptr[i];
}
(因为你说你“明确地”设置了最后一个元素的值,而你没有在你的内核中,我也没有在这里设置它。)
我没有看到在这个内核中使用共享内存的好处很多:Fermi上的L1缓存应该给你几乎相同的优势,因为你的位置很高并且重用率很低。
你的内核和我的内核似乎都处理任意大小的数组。然而你似乎假设blockDim.x == 256。