【发布时间】:2015-10-14 09:18:35
【问题描述】:
我想在我的项目中清理 CUDA 内核的参数。
现在,一个内核需要 3 个uint32_t 数组,这导致代码非常难看:(id 表示全局线程 id,valX 是任意值)
__global__ void some_kernel(uint32_t * arr1, uint32_t * arr2, uint32_t * arr3){arr1[id] = val1; arr2[id] = val2; arr3[id] = val3;}
我想用一个结构来围绕所有这些数组:
typedef struct S{uint_32_t arr1, uint_32_t arr2, uint_32_t arr3, uint32_t size} S;
其中 size 表示结构内每个 arrX 的长度。
我想要的,是这样的:
__global__ void some_kernel(S * s){s->arr1[id] = val1; s->arr2[id] = val2; s->arr3[id] = val3;}
对于这样的结构,对应的 cudaMalloc 和 cudaMemcpy 会是什么样子? 这是否有任何性能缺陷,我还没有看到?
提前致谢!
【问题讨论】:
-
您是否尝试过
cudaMemcpy(dst, src, number_of_Ss * sizeof(S), cudaMemcpyHostToDevice)与dst和src是S*s 和number_of_Ss是您要复制的Ss 的数量? -
是的,我得到了这个:test.cu(27): 错误:不存在从“S”到“const void *”的合适转换函数......就在内存复制中
-
为什么不直接按值传递结构?不需要 cudaMalloc 或 cudaMemcpy。
-
创建一个包含指针的结构。 cudaMalloc 每个指针。按值传递结构。如果您不理解这一点,那么我认为您需要修改 C++ 中的指针、引用和值。 CUDA 在概念上有点复杂,但在尝试编写 CUDA 代码之前,您需要彻底了解 C 或 C++。你的第一个 C++ 程序不应该也是你的第一个 CUDA 程序。
-
我不建议将设备内存分配和释放放在构造函数和析构函数中,除非您在管理范围方面非常小心。它可能导致一些非常难以诊断的运行时错误