double ** a = malloc() 在 c 中有效,但在 cuda 中无效?
Posted
技术标签:
【中文标题】double ** a = malloc() 在 c 中有效,但在 cuda 中无效?【英文标题】:double ** a = malloc() works in c but not in cuda? 【发布时间】:2021-12-31 00:54:49 【问题描述】:我编写了一个程序,它可以在 C 中运行,但由于某种原因无法在 CUDA 中编译。
问题出现在这里:
int key_size = 1000;
int references = 40;
double **ref_ptr;
ref_ptr = malloc(references * sizeof *ref_ptr);
for(int i = 0; i<references;i++)
ref_ptr[i] = malloc(key_size * sizeof *ref_ptr[i]);
在 C 中这个程序编译得很好,它甚至可以用 NVCC 编译为 C 程序 (nvcc my_program.c)。但是当我尝试将它编译为 CUDA 程序时,我得到了这个错误。
main.cu(191): error: a value of type "void *" cannot be assigned to an entity of type "double **"
main.cu(193): error: a value of type "void *" cannot be assigned to an entity of type "double *"
我尝试将它们转换为指针,但这开始给我带来很多内存访问问题,而且我的程序在用 C 编译时可以正常工作。你能帮我想想这里会发生什么吗?
【问题讨论】:
那是 C++ 编译器吗?演员阵容是必要的。 你是如何投射指针的?你写的是有效的 C,但是在 CUDA(和一般的 C++)中你必须转换指针。为什么不使用“new”而不是“malloc”? 【参考方案1】:这是因为 malloc 返回一个 void*,你需要将它强制转换为适当的指针。
ref_ptr = (double**)malloc(references * sizeof *ref_ptr);
for(int i = 0; i<references;i++)
ref_ptr[i] = (double*)malloc(key_size * sizeof *ref_ptr[i]);
【讨论】:
C 编译器不需要强制转换,实际上不鼓励。以上是关于double ** a = malloc() 在 c 中有效,但在 cuda 中无效?的主要内容,如果未能解决你的问题,请参考以下文章