我正在使用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
)似乎工作正常。
非常感谢任何帮助。
答案 0 :(得分:1)
正如您自己看到的那样here,Ocelot开发人员从未将print
添加到其运行时实现中。 cudaMemGetInfo
是运行时API的一个相对较新的补充(出现在CUDA 4 IIRC中),而Ocelot最积极地针对CUDA 2和CUDA 3进行开发。
你只有两个选择是不使用它,或者添加你自己的实现(如果你愿意,它可以是一个空的存根)并链接它。