Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda 快速计算连续指数之间的差异_Cuda_Gpu_Nvidia - Fatal编程技术网

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