"cuMemGetAddressRange" 存在时 Cuda 编译错误

Cuda compile error when "cuMemGetAddressRange" exists

示例代码来了:

#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

谁能帮忙指出问题所在吗?

留言:

error: ld returned 1 exit status

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

要看是这样的话,可以运行

nvcc -c main.cu -o main.o

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

解法:

您需要使用 CUDA 驱动程序存根库明确指定 link年龄:

nvcc main.cu -o main -lcuda

那是因为 cuMemGetAddressRange() 是 CUDA Driver API 的一部分,而不是 CUDA 运行time API.

注意:您没有cudaFree()分配的内存,您可能需要解决这个问题!

编辑:(归功于@talonmies 评论)您不必明确地link 反对 CUDA 运行 时间库(-lcudart), 因为 nvcc 会自动 link 反对它。