使用CUDA在本地内存中的数组上定义变量大小

Sen*_*ter 6 c arrays cuda

是否有可能在设备函数中创建列表,数组,列表/数组的大小,以及调用中的参数...或者在调用时初始化的全局变量?

我想像这些列表中的一个工作:

unsigned int size1;

__device__ void function(int size2) {

    int list1[size1];
    int list2[size2];
}
Run Code Online (Sandbox Code Playgroud)

有可能做一些聪明的事情来做这样的工作吗?

小智 4

有 1 种方法可以分配动态共享内存量 - 使用第三个启动内核参数:

__global__ void kernel (int * arr) 
{
    extern __shared__ int buf []; // size is not stated
    // copy data to shared mem:
    buf[threadIdx.x] = arr[blockIdx.x * blockDim.x + threadIdx.x];
    // . . . 
}
// . . . 
// launch kernel, set size of shared mem in bytes (k elements in buf):
kernel<<<grid, threads, k * sizeof(int)>>> (arr);
Run Code Online (Sandbox Code Playgroud)

许多数组都有一个 hack:

__device__ void function(int * a, int * b, int k) // k elements in first list
{
    extern __shared__ int list1 [];
    extern __shared__ int list2 []; // list2 points to the same point as list1 does

    list1 [threadIdx.x] = a[blockIdx.x * blockDim.x + threadIdx.x];
    list2 [k + threadIdx.x] = b[blockIdx.x * blockDim.x + threadIdx.x];
    // . . .
}
Run Code Online (Sandbox Code Playgroud)

您必须考虑:分配给所有块的内存。