0

如果我在 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];

}

并且所有的输出都是 0 output[]。但是,如果我注释掉sdata[tid] = input[tid];,那么输出是好的和相等的input[]

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

[更新]

好吧,如果我删除标签extern并为共享数组指定大小,它似乎工作正常。任何想法为什么?

[更新] 我调用内核的方式是从 c++ 代码中调用的,所以我需要包装它以便从主代码中调用。

kernel.cu包含内核本身加上包装函数:

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

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

}

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

4

1 回答 1

1

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

于 2012-08-10T11:43:26.353 回答