我正在使用 GPU Ocelot为了构建 CUDA 程序,因为我无法访问 NVIDIA GPU。我正在使用 nvcc
编译示例代码并使用 g++
进行链接。我这样做是因为我需要将 C++ 程序链接到使用 nvcc
构建的静态库。
这是我正在使用的命令:
$ nvcc -c cudaMemCheck.cu
$ g++ -o cudaMemCheck cudaMemCheck.o -locelot
这会导致以下错误:
cudaMemCheck.o: In function `main':
tmpxft_00006ca0_00000000-1_cudaMemCheck.cudafe1.cpp:(.text+0x2e): undefined reference to `cudaMemGetInfo'
collect2: ld returned 1 exit status
我在 cudaMemCheck.cu
中有以下代码:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
size_t free, total;
cudaMemGetInfo(&free, &total);
fprintf(stdout, "free = %zu | total = %zu\n", free, total);
return 0;
}
奇怪的是,如果我用 nvcc
链接,这种编译和链接的方法似乎有效。我链接 CUDA 库的程序是一个 MPI 程序,它使用 mpic++
包装器进行编译,所以我不确定我是否可以使用 nvcc
进行链接。
我还想指出,使用 g++
链接使用 CUDA 运行时中其他函数的源文件(例如 cudaMalloc
)似乎工作得很好。
如有任何帮助,我们将不胜感激。
最佳答案
如您所见here , Ocelot 开发人员从未将 cudaMemGetInfo
添加到他们的运行时实现中。 cudaMemGetInfo
是对运行时 API 的一个相对较新的补充(出现在 CUDA 4 IIRC 中),Ocelot 是针对 CUDA 2 和 CUDA 3 最积极地开发的。
您只有两个选择:不使用它,或者添加您自己的实现(如果您愿意,它可以是一个空 stub )并链接它。
关于c++ - 使用 GPU Ocelot 时出现 GCC 链接器错误 (cudaMemGetInfo),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233771/