"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 反对它。
示例代码来了:
#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 反对它。