CUDA:标识符“cudaMemGetInfo”未定义

时间:2011-09-12 11:15:22

标签: cuda

为了估计程序在一次内核启动时可以处理多少数据,我尝试使用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上使用&#34; Cuda编译工具,版本2.0,V0.2.1221&#34; (NVCC)。
当我试图用cudaDriverGetVersion()安装cuda驱动程序版本时发生了同样的错误(当我使用驱动程序函数cuDriverGetVersion()时同样的事情)。
系统似乎不会让我知道任何关于它自己的细节......

2 个答案:

答案 0 :(得分:7)

对于您使用的旧版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不同。

答案 1 :(得分:1)

修复此错误:

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

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

因此您必须更改* .cu代码,如下所示:

代码不正确:  unsigned int free,total;  cuMemGetInfo(&amp; free,&amp; total);

正确的代码:  size_t free,total;  cuMemGetInfo(&amp; free,&amp; total);