c - 使用 CUDA 在本地内存中定义数组的可变大小

标签 c arrays cuda

是否有可能在设备函数中创建一个列表、数组、某些东西,列表/数组的大小在调用中作为参数……或者在调用时初始化的全局变量?

我希望这些列表中的一个能够工作:

unsigned int size1;

__device__ void function(int size2) {

    int list1[size1];
    int list2[size2];
}

有没有可能做一些聪明的事情来让这样的东西发挥作用?

最佳答案

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

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

许多数组都有一个 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];
    // . . .
}

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

关于c - 使用 CUDA 在本地内存中定义数组的可变大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220553/

相关文章:

c++ - va_start - 32 位和 64 位构建之间的区别

c - 使用时区在纯 C 中进行日期格式化

arrays - 在 Swift 中比较 n 个整数数组的最快方法

opencv - 即使在成功构建后,CUDA 也没有在 OpenCV 中运行

cuda - 使用 Thrust 的向量数组

visual-studio - 在Visual Studio 2017中使用CUDA

c - 什么是最小化 RAM 消耗的良好实现实践

c - 在对程序进行 n 次模拟时打印到文件(C 语言)

objective-c - sortedArrayUsingSelector 它在做什么?

javascript - 什么值会使这个函数崩溃?