快速计算连续指数之间的差异



假设我有数组

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个问题:

  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];
}

(因为你说你"显式"设置了最后一个元素的值,而你没有在内核中设置,所以我也没有在这里设置它。)

我看不出在这个内核中使用共享内存有多大优势:费米上的L1缓存应该会给你带来几乎相同的优势,因为你的局部性很高,重用率很低。

您的内核和我的内核似乎都可以处理任意大小的数组。然而,您的假设似乎是blockDim.x==256。

最新更新