如何在CUDA中将展平的2D阵列从全局内存复制到共享内存

时间:2013-03-22 13:06:22

标签: c cuda parallel-processing nvidia

我有一个内核接收一个扁平的2D数组,我想每次共享内存时复制一行数组,我的内核如下所示:

__global__ void searchKMP(char *test,size_t pitch_test,int ittNbr){
    int  tid = blockDim.x * blockIdx.x + threadIdx.x;
    int strideId = tid * 50;

    int m = 50;

    __shared__ char s_test[m];

    int j;
               //this loops over the number of lines in my 2D array           
                   for(int k=0; k<ittNbr; k++){

                   //this loops to store my flattened (basically threats 1 line at a time) array into shared memory     
                   if(threadIdx.x==0){
                     for(int n =0; n<50; ++n){
                    s_test[n] = *(((char*)test + k * pitch_test) + n);

                }
             }
            __syncthreads();


             j=0;

            //this is loop to process my shared memory array against another 1D array
             for(int i=strideID; i<(strideID+50); i++{
             ...dosomething...
             (increment x if a condition is met) 
             ...dosomething...
             }
             __syncthreads();
             if(x!=0)
                cache[0]+=x;

            ...dosomething...

}

虽然当我验证x的值时,x的值会随着线程数的不同而变化。例如,当20个250个线程的块根据执行返回值7或6时,10个500个线程的块返回9。我想知道问题是来自在共享内存中复制的2D扁平化数组,还是在这段代码中出错了。

2 个答案:

答案 0 :(得分:1)

看起来共享内存中的数组有20个元素:

   int m = 20;
   __shared__ char s_test[m];

但是在你的内循环中,你试图写出50个元素:

   for(int n =0; n<50; ++n){
      s_test[n] = *(((char*)test + k * pitch_test) + n);

我不知道这是否是您正在寻找的问题,但看起来它不会起作用。

答案 1 :(得分:0)

共享内存在同一块中的所有线程之间共享

目前还不是很清楚,为什么你需要共享内存以及你在做什么:

在你的代码中,块中的所有线程多次向共享内存写入相同的值,但它是冗余的

使用共享记忆的常用方法是这样的:

if(threadIdx.x < m)
  s_test[threadIdx.x] = *(global_mem_pointer + threadIdx.x);

__syncthreads();

块中的所有线程“在同一时刻”写入自己的值,并且在__syncthreads();之后,您的内存充满了您需要的内容并且对于块中的所有线程都可见