2012-08-22 68 views
2

如何在CUDA中分配共享变量?我有一个内核需要在属于特定块的线程之间共享数据。我需要两个名为sideid的共享变量。我用这样的:在CUDA中分配共享变量

extern __shared__ int sid, eid 

,但它给我一个错误,__shared__变量不能有外部链接。

+0

的可能重复的[分配共享存储器(http://stackoverflow.com/questions/5531247/allocating-shared-memory) – talonmies

回答

8

有两种方式来分配共享存储器:静态和动态

1,静态

__shared__ int Var1[10] 

2,动态:应该添加 “外部” 关键字

extern __shared__ int Var1[] 

如果您使用动态方式分配共享内存,则应该设置共享内存si当你调用函数时。例如:
testKernel <<< grid, threads, size>>>(...)
第三段是共享内存的大小。这样所有的共享内存都从同一个地址开始。所以如果你想定义几个共享内存。你应该写如下代码。

__global__ void func(...) 
{ 
    extern __shared__ char array[]; 
    short * array0 = (short*)array; 
    float * array1 = (float*)(&array0[128]); 
} 
+0

现在,如果该功能是__device__功能和即时从一些__global__调用它那么如何实现这个功能呢? –

+0

如果你在全局函数之外声明你的共享内存,那么你可以将共享内存地址传递给设备函数 – Samuel

+0

@Samuel,它应该在文件中的其他__device__函数中可见,否? – Seltymar