【发布时间】:2016-03-24 17:27:22
【问题描述】:
我花了 2 天时间试图弄清楚这一点,但一无所获。假设我有一个如下所示的结构:
struct Thing {
bool is_solid;
double matrix[9];
}
我想创建一个名为 things 的结构数组,然后在 GPU 上处理该数组。比如:
Thing *things;
int num_of_things = 100;
cudaMallocManaged((void **)&things, num_of_things * sizeof(Thing));
// Something missing here? Malloc individual structs? Everything I try doesn't work.
things[10].is_solid = true; // Segfaults
最好的做法是这样做而不是传递具有num_of_things 大数组的单个结构?在我看来,这可能会变得非常讨厌,尤其是当您已经拥有数组时(例如 matrix,它需要是 9 * num_of_things。
任何信息将不胜感激!
【问题讨论】:
-
您的代码对我来说很好用。 Here is my full test case(你应该提供这样的东西)。你的方法没有错;这将是您在托管场景中的典型做法。很可能您犯了以下几个错误之一: 1. 您没有为 cc3.0+ 设备进行编译。 2.你没有在cc3.0+设备上运行。 3.你的环境does not support managed memory usage.
-
无论如何,最好的建议是在遇到 cuda 代码问题时使用proper cuda error checking,我已经在我的测试用例中证明了这一点。尝试在我的测试用例中运行代码,看看你得到什么样的输出;我认为这对于正在发生的事情具有指导意义。
-
非常感谢!事实证明我做错了,因为编译器说没有足够的参数,所以我将第三个参数
0传递给cudaMallocManaged。我不认为它是相关的,所以我把它排除在外。它必须是cudaMemAttachGlobal或cudaMemAttachHost,正如一位非常善良的人在 freenode/#cuda 上指出的那样。 -
您使用的是 CUDA 7.5 吗?尽管文档在这方面尚不清楚,但编译器将/应该接受仅带有 2 个参数的
cudaMallocManaged调用(正如您在这个问题中所指出的那样,正如我在示例中所指出的那样);在这种情况下,flags变量将默认为cudaMemAttachGlobal。如果您说“编译器说的参数不够”,我只能假设这是 Visual Studio Intellisense? (实际上不是编译器)无论如何,您可以通过检查 cuda 包含目录中的cuda_runtime.h来说服自己相信flags参数的默认参数 -
谢谢,我检查了一下,它确实默认为
cuda_runtime.h中的那个,但仍然无法仅使用 2 个 args 进行编译。不知道为什么。我的设置是纯命令行、g++、CMake 的 FindCuda 和带有标志-gencode arch=compute_30,code=sm_30的 nvcc。 IRC 的那个家伙提到这可能是 C 的东西,但我认为不是这样,因为文件是 .cu 而其他的都是 c++。
标签: c++ pointers image-processing cuda parallel-processing