Cuda 快速计算连续指数之间的差异
考虑到我有数组Cuda 快速计算连续指数之间的差异,cuda,gpu,nvidia,Cuda,Gpu,Nvidia,考虑到我有数组 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 + thre
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个问题:
这个内核快吗。你能提出一个更快的实施方案吗?
我想这个内核可以处理任意大小的数组吗
我要咬
__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];
}
既然您说您显式地设置了最后一个元素的值,而您没有在内核中设置它,那么我也没有在这里设置它
我看不出在这个内核中使用共享内存有什么好处:费米上的一级缓存应该给你带来几乎相同的好处,因为你的位置高,重用率低
您和我的内核似乎都可以处理任意大小的数组。但是,您的代码似乎假定blockDim.x==256。您是否测试/计时/分析了代码?你学到了什么?@programmer:我想你遗漏了第三个问题,那就是代码是否正确,答案是否定的,因为有一个潜在的死锁。我认为它还假设块大小为256。@Talonmes:很好的建议!通过将第二个同步线程转移到ifid