0

开发商,

有人可以给我一个提示吗?我没有找到任何关于如何在同一个内核中分配常量和动态共享内存的信息,或者让我们更珍贵地问:如何调用一个内核,其中需要分配的共享内存量在编译时只是部分知道?以分配共享内存为例,如何进行动态分配变得非常明显。但是让我们假设我有以下内核:

__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)) ?

请赐教或只是简单地指向一些代码片段。提前非常感谢。

欢呼格雷格

4

2 回答 2

3

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

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

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

请注意,我没有测试它。

是非常有用的帖子。

于 2013-03-18T17:06:11.457 回答
1

来自CUDA 编程指南

[kernel's] 执行配置是通过在函数名和带括号的参数列表之间插入 <<< Dg, Db, Ns, S >>> 形式的表达式来指定的,其中:

  • Ns 是 size_t 类型,指定除了静态分配的内存之外,每个块动态分配的共享内存中的字节数;这个动态分配的内存被声明为外部数组的任何变量使用,如__ shared __中所述;Ns 是一个可选参数,默认为 0;

所以基本上,您在内核调用期间指定的共享内存大小与动态分配的共享内存有关。您不必在共享内存中手动添加静态分配数组的大小。

于 2013-03-18T17:05:37.017 回答