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 中无效?的主要内容,如果未能解决你的问题,请参考以下文章

OS X 上的 malloc 问题

sizeof运算符malloc函数及free函数

数组打印出垃圾值

C、memset一个双数组失败

C语言,realloc动态内存申请,出现报错double free or corruption (!prev)

linux调试工具glibc的演示分析-core dump double free