如果我在 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++ 代码和调用包装器的函数。