使用GPU Ocelot时GCC链接器错误(cudaMemGetInfo)

时间:2015-12-11 22:45:02

标签: c++ gcc cuda

我正在使用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)似乎工作正常。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

正如您自己看到的那样here,Ocelot开发人员从未将print添加到其运行时实现中。 cudaMemGetInfo是运行时API的一个相对较新的补充(出现在CUDA 4 IIRC中),而Ocelot最积极地针对CUDA 2和CUDA 3进行开发。

你只有两个选择是不使用它,或者添加你自己的实现(如果你愿意,它可以是一个空的存根)并链接它。