【问题标题】:Allocate shared variables in CUDA在 CUDA 中分配共享变量
【发布时间】:2013-08-08 18:29:19
【问题描述】:

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

extern __shared__ int sid, eid  

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

【问题讨论】:

标签: cuda


【解决方案1】:

有两种分配共享内存的方式:静态和动态

1、静态

  __shared__ int Var1[10]

2、动态:应添加“extern”关键字

extern __shared__ int Var1[]

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

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

【讨论】:

  • 现在如果这个函数是 device 函数并且我从一些 global 函数调用它,那么如何实现这个东西呢?
  • 可以将共享内存地址传递给设备函数
  • @Samuel 如果你在全局函数之外声明你的共享内存,文件中的其他 device 函数应该可以看到它,不是吗?
  • 我认为答案是肯定的。你可以写一个测试平台来测试它。我觉得在全局函数之外声明共享内存不好
  • 这怎么可能有float** array 而不是float* array0float* array1?在这种情况下,float** 的存储空间也应该是动态分配的。
猜你喜欢
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2013-05-23
  • 2013-10-20
  • 1970-01-01
  • 2013-10-12
相关资源
最近更新 更多