【问题标题】:dynamic allocation of arrays in shared memory with different lengths在共享内存中动态分配不同长度的数组
【发布时间】:2013-07-03 16:17:23
【问题描述】:

我必须在运行时在共享内存中分配 2 个不同长度的数组,如下所示:

__global__ kernel()
{
__shared__ int A[blockDim.x*6]; 
__shared__ int B[8][blockDim.x*3];
}

如何确保在启动像kernel <<<b,t,s>>> 这样的内核时,两者的长度不同?

【问题讨论】:

  • 您显示的代码是非法的,甚至无法编译。您能否向我们展示一个真实的、可编译的示例来说明您的问题?
  • 您的编辑仍然没有使代码合法。 blockDim 不能以您尝试的方式使用。 CUDA 支持动态共享内存分配(请参阅here),但不是您尝试的方式
  • 我知道这是不可编译的。不幸的是,我不知道有什么方法可以实现我想要的。
  • 我需要将一维数组 A 的大小设置为 blockDim.x*6,将二维数组 B 的宽度设置为长度固定的 blockDim.x*3 (8)。 >> 中的第三个参数适用于所有用 extern static 声明的数组。但我需要将 2 个不同的值设置为 2 个不同数组的大小(一个 1D 和一个 2D)。
  • 请添加您想要做的作为问题的编辑。

标签: cuda


【解决方案1】:

如果块大小是常量,您可以将其声明为常量并将其用于静态分配:

const int BLOCK_DIM_X = 512;
__global__ kernel()
{
    __shared__ int A[BLOCK_DIM_X*6]; 
    __shared__ int B[8][BLOCK_DIM_X*3];
}
kernel<<<grid, BLOCK_DIM_X>>>();

如果不是常量,可以使用动态共享内存分配:

__global__ kernel()
{
    extern __shared__ int smem[];
    int* A = smem;
    int* B = A + blockDim.x*6;
    // B[i][j] will be
    int t = B[i * (blockDim.x*3) + j];
}
size_t smem_size = (block.x*6 + 8 * block.x*3) * sizeof(int);
kernel<<<grid, block, smem_size>>>();

【讨论】:

  • 不应该是size_t smem_size = (blockDim.x*6 + 8 * blockDim.x*3) * sizeof(int);size_t smem_size = (block.x*6 + 8 * block.x*3) * sizeof(int);
猜你喜欢
  • 1970-01-01
  • 2012-10-23
  • 2011-12-23
  • 2017-10-25
  • 2013-01-11
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多