使用cudaLaunchCooperativeKernel及-rdc=true时内存分配不允许问题排查
问题分析与解决办法
核心原因
你碰到的"operation not permitted"错误,本质是开启RDC(可重定位设备代码)后,未链接设备端Runtime API所需的库,导致内核里调用的cudaMalloc(设备端Runtime API)无法正常执行。
关闭RDC时,nvcc会将设备代码与主机代码合并编译,自动处理设备端Runtime API的依赖;但开启RDC后,设备代码被编译为可重定位目标文件,必须显式链接cudadevrt库,才能支持设备端的Runtime API调用(比如内核中的cudaMalloc)。
解决步骤
修改编译命令,添加-lcudadevrt链接选项:
nvcc test.cu -rdc=true -lcudadevrt
额外提醒
- 设备端调用
cudaMalloc要求设备计算能力≥6.0,你的7.5设备符合要求。 - 合作内核本身支持设备端Runtime API调用,但需确保编译链接时正确引入依赖库。
- 注意:内核中分配的内存要在设备端显式释放(比如调用
cudaFree(x)),否则会造成内存泄漏。
内容的提问来源于stack exchange,提问作者Pierre T.
相关产品推荐
相关产品推荐

