开发人员,

有人可以给我一个提示吗?
我没有找到有关如何在同一内核中分配常量和动态共享内存的任何信息,或者让我们更珍贵地询问:
如何在编译时仅部分了解需要分配的共享内存量的内核中调用?
例如,参考allocating shared memory,如何进行动态分配就变得很明显。
但是,假设我具有以下内核:

__global__ void MyKernel(int Float4ArrSize, int FloatArrSize)
{
  __shared__ float Arr1[256];
  __shared__ char  Arr2[256];
  extern __shared_ float DynamArr[];
  float4* DynamArr1 = (float4*) DynamArr;
  float* DynamArr = (float*) &DynamArr1[Float4ArrSize];

  // do something
}


内核调用:

int SharedMemorySize = Float4ArrSize + FloatArrSize;

SubstractKernel<<< numBlocks, threadsPerBlock, SharedMemorySize, stream>>>(Float4ArrSize, FloatArrSize)


我实际上无法弄清楚编译器如何将共享内存的大小仅链接到我要动态分配的部分。
还是参数“ SharedMemeorySize”代表每个块的共享内存总量,所以我需要计算常量内存的大小(int SharedMemorySize = Float4ArrSize + FloatArrSize + 256 * sizeof(float)+ 256 * sizeof(char)) ?

请启发我,或者只是指向一些代码片段。
非常感谢。

干杯格雷格

最佳答案

引用编程指南,SharedMemorySize指定除静态分配的内存外,共享内存中为该调用每个块动态分配的字节数;该动态分配的内存由任何
声明为外部数组的变量。 SharedMemorySize是可选参数,默认为0。

因此,如果我了解您想要做什么,它应该看起来像

extern __shared_ float DynamArr[];
float*  DynamArr1 = DynamArr;
float4* DynamArr2 = (float4*) &DynamArr[DynamArr1_size];


请注意,我没有对其进行测试。

Here是非常有用的帖子。

关于c++ - 如果使用动态共享内存分配,则正确的内核调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15482245/

10-11 20:19
查看更多