c++ - 使用 GPU Ocelot 时出现 GCC 链接器错误 (cudaMemGetInfo)

标签 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)似乎工作得很好。

如有任何帮助,我们将不胜感激。

最佳答案

如您所见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/

相关文章:

c++ - 创建 std::shared_ptr 以分配成员变量时内存泄漏

c++ - 静态库 - 调试还是发布?

c++ - SDL(简单媒体直接层)尝试缩放我的 Sprite (角色)

c - 在 CUDA 中使用全局内存初始化共享内存时出错

cuda - GPU 中工作项负载的限制? CUDA/OpenCL

c++ - CUDA 条件线程同步

c++ - 如何将内置类型转换为用户定义类型

c++ - 如何使用 Win32/GDI 加载 PNG 图像(如果可能,不要使用 GDI+)?

gcc - 为什么链接库的顺序有时会导致 GCC 出错?

c - OSX 10.11 上的 OpenMP 支持,gcc 错误 "file omp.h not found"