我想在我的代码中重新定义malloc()和free(),但是当我运行时,会出现两个错误:
allowing all exceptions is incompatible with previous function "malloc";
allowing all exceptions is incompatible with previous function "free";
然后我搜索这个错误,似乎CUDA不允许我们重新定义libary函数,这是真的吗?如果我们无法重新定义这些函数,我该如何解决错误?
答案 0 :(得分:1)
答案非常简短,你做不到。
malloc
基本上是一个C ++标准库函数,CUDA工具链在内部用设备代码中的设备挂钩重载。尝试定义您自己的设备版本malloc
或free
可以并且将打破工具链的内部。究竟如何取决于平台和编译器。
在上一个问题中,你有这样的代码:
__device__ void* malloc(size_t)
{ return theHeap.alloc(t); }
__device__ void free(void* p)
{ the Heap.dealloc(p); }
由于现有的标准库要求,malloc
和free
必须在全局命名空间范围内定义为__device__ __host__
。在CUDA中,对同一函数具有单独的__device__
和__host__
定义是非法的。您可以通过为自定义分配器使用私有命名空间或使用不同的函数名来绕过此限制。但是,不要尝试从设备或主机代码中的标准库重新定义任何内容。它会破坏事物。