CUDA在输出中共享内存问题,具体取决于外部声明和数组大小

时间:2012-08-10 11:06:32

标签: cuda

如果我在CUDA中试验共享内存,我不理解它在这段代码中的行为。 我有一个非常基本的内核:

__global__ void sum( int* input, int* output, int size){


  int tid = threadIdx.x+blockDim.x*blockIdx.x +
    blockDim.x*gridDim.x*blockIdx.y;

  extern  __shared__ int sdata[];

  sdata[tid] = input[tid];
  __syncthreads();

  output[tid] = input[tid];

}

所有output[]的输出均为0。但是,如果我注释掉sdata[tid] = input[tid];,那么输出就可以了,并且等于input[]

我在这里做错了什么?我错过了什么吗?

[UPDATE]

好吧,如果我删除标记extern并给共享数组一个大小,它似乎工作正常。有什么想法吗?

[UPDATE] 我调用内核的方式来自c ++代码,所以我需要将它包装起来从主代码中调用。

kernel.cu包含内核本身以及包装函数:

void wrapper(int dBlock, int dThread, int* input, int* output, int size){

    sum<<<dBlock,dThread>>>(input, output, size);

}

callerfunction.cpp包含c ++代码和调用包装器的函数。

1 个答案:

答案 0 :(得分:1)

如果使用extern限定符,则需要在启动内核时传递共享内存的大小 kernel<<< blocks, threads, size>>>(...)
size参数是以字节为单位的共享内存大小。

相关问题