【问题标题】:CUDA: identifier "cudaMemGetInfo" is undefinedCUDA:标识符“cudaMemGetInfo”未定义
【发布时间】:2012-02-11 01:25:20
【问题描述】:

为了估计程序在一次内核启动中可以处理多少数据,我尝试使用cudaMemGetInfo() 获取一些内存信息。但是,编译器告诉我:
错误:标识符“cudaMemGetInfo”未定义
cudaGetDeviceProperties(); 等其他功能可以正常工作。我必须安装某个 CUDA 版本吗? library description 不包含版本等信息。

编辑:尽可能小的代码。 cudaSetDevice() 不会生成编译器错误,而 cudaMemGetInfo() 会生成

#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
   unsigned int f, t;
   cudaSetDevice(0);
   cudaMemGetInfo(&f, &t);
   return 0;
}

编辑 2:
我在 Linux 上使用“Cuda 编译工具,版本 2.0,V0.2.1221”(nvcc)。
当我尝试使用cudaDriverGetVersion() 安装cuda 驱动程序版本时,发生了同样的错误(当我使用驱动程序函数cuDriverGetVersion() 时也是如此)。
好像系统不会让我知道任何关于它自己的细节...

【问题讨论】:

  • 你是否包含了 cuda_runtime_api.h ?
  • @Pavan:到目前为止,我只包括 cuda.h。如果我也包含 cuda_runtime_api.h 错误仍然存​​在。
  • 你能发布一个可以由其他人编译的 concede repro 案例来证明这个问题吗?该函数在 CUDA 1.0 之前就已经在 API 中了,所以肯定有其他问题。
  • 请粘贴确切的编译器警告。
  • @Callahan:我在这里最初的评论有点错误 - cuMemGetInfo 一直在驱动程序 API 中,但运行时 API 等效项仅在 CUDA 3.0 中添加。因为您使用的是真正古老的 CUDA 版本,所以您无权访问该 API 调用。您最初对版本的怀疑被证明是正确的。

标签: cuda


【解决方案1】:

对于您使用的非常旧版本的 CUDA,cudaMemGetInfo 不是运行时 API 的一部分。它在驱动程序cuMemGetInfo 中有一个对应项,可以使用它来代替。请注意,使用此调用的驱动程序 API 版本需要先建立上下文。这应该适用于 CUDA 2.x:

// CUDA 2.x version
#include <cstdio>
#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
    unsigned int f, t;
    cudaSetDevice(0);
    cudaFree(0); // This will establish a context on the device
    cuMemGetInfo(&f, &t);
    fprintf(stdout,"%d %d\n",f/1024,t/1024);
    return 0;
}

编辑:此答案适用于 CUDA 3.0 及更高版本:

您的问题不是cudaMemGetInfo,而是您提供的参数。我会预测:

// CUDA 3.0 or later version
#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
    size_t f, t;
    cudaSetDevice(0);
    cudaMemGetInfo(&f, &t);
    return 0;
}

将在您的示例失败的地方工作。请注意,nvcc 使用主机 C++ 编译器来编译主机代码,它不会找到参数不正确的 API 函数实例。注意cudaMemGetInfo的原型是

cudaError_t cudaMemGetInfo(size_t * free, size_t * total)       

而且参数应该是size_t,在很多平台上这和unsigned int是不一样的。

【讨论】:

  • 这是一个很好的观点。但这并没有解决问题......我尝试给cudaSetDevice()一个指针而不是一个整数,编译器识别它:'错误:“size_t *”类型的参数与“int”类型的参数不兼容'跨度>
  • @Callahan:所以你是说我发布的代码不能为你编译?您在哪个编译器、操作系统和 CUDA 版本上执行此操作?
  • 是的,它不会编译显示与以前相同的错误。我在 EDIT 2 下的问题中发布了询问的信息。
  • 链接驱动API,在编译语句中添加-lcuda
  • 如果这不起作用,CUDA 安装或您正在使用的工具包以某种方式损坏。这甚至不再与原始问题切线相关,因此继续没有太大意义,
【解决方案2】:

修复此错误:

错误:“unsigned int *”类型的参数与“size_t *”类型的参数不兼容。

我从nvidia technical report for cuda 3.2 发现: 接受或返回内存大小的驱动程序 API 函数,例如 cuMemAlloc() 和 cuMemGetInfo(),现在为此使用 size_t 而不是 unsigned int。

所以你必须更改 *.cu 代码,如下几行:

不正确的代码: 无符号整数免费,总计; cuMemGetInfo(&free, &total);

正确代码: size_t 免费,总计; cuMemGetInfo(&free, &total);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多