【问题标题】:Cuda compile error when "cuMemGetAddressRange" exists [duplicate]当“cuMemGetAddressRange”存在时Cuda编译错误[重复]
【发布时间】:2021-12-27 08:57:56
【问题描述】:

示例代码如下:

#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>

int main() {
    unsigned char* cu_test;
    cudaMalloc((void**)&cu_test, 3200);

    CUdeviceptr pbase;
    size_t psize;
    CUresult res = cuMemGetAddressRange(&pbase, &psize, (CUdeviceptr)cu_test);
    printf("cu_img_yuv size: %ld", psize);

    return 0;
}

虽然在编译任何 cuda 版本时都会引发错误(从 11.3 到 11.5 测试):

$ nvcc main.cu -o main
/tmp/tmpxft_0000e288_00000000-11_main.o: In function `main':
tmpxft_0000e288_00000000-6_main.cudafe1.cpp:(.text+0x54): undefined reference to `cuMemGetAddressRange_v2'
collect2: error: ld returned 1 exit status

有人可以帮忙指出问题所在吗?

【问题讨论】:

  • 如果你使用驱动API,你必须显式链接驱动API库
  • @talonmies 酷!通过nvcc main.cu -lcuda -o main编译时添加了-lcuda,现在可以了!
  • 太棒了。请将其添加为您的问题的答案

标签: c++ cuda


【解决方案1】:

消息:

error: ld returned 1 exit status

表示这是一个链接错误(参见ld)。

要查看是这种情况,您可以运行

nvcc -c main.cu -o main.o

你不会得到任何错误。这是源代码编译步骤!

解决方案:

您需要明确指定与 CUDA 驱动存根库的链接:

nvcc main.cu -o main -lcuda

这是因为cuMemGetAddressRange() 是 CUDA 驱动程序 API 的一部分,而不是 CUDA 运行时 API。

注意:您没有cudaFree() 分配的内存,您可能需要修复此问题!

编辑:(归功于@talonmies 评论)您不必显式链接到 CUDA 运行时库 (-lcudart),因为 nvcc 会自动链接到它。

【讨论】:

  • nvcc 将自动链接运行时库,这不是必需的。缺少驱动程序库存根是唯一的问题
  • 好吧,我不知道!总是这样,还是?
  • 是的,总是如此。如果你纠正你的答案会很好
猜你喜欢
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2011-02-21
  • 2013-08-16
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多