CUDA:标识符“;cudaMemGetInfo“;是未定义的

CUDA:标识符“;cudaMemGetInfo“;是未定义的,cuda,Cuda,为了估计程序在一次内核启动中可以处理多少数据,我尝试使用cudaMemGetInfo()获取一些内存信息。但是,编译器告诉我: 错误:标识符“cudaMemGetInfo”未定义 其他函数,如cudaGetDeviceProperties()工作正常。我必须安装某个CUDA版本吗?不包含有关版本等的信息。 编辑:尽可能小的代码cudaSetDevice()不会生成编译器错误,而cudaMemGetInfo()不会生成编译器错误 #include <cuda.h> #include

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

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

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

int main(){
   unsigned int f, t;
   cudaSetDevice(0);
   cudaMemGetInfo(&f, &t);
   return 0;
}
#包括
#包括
int main(){
无符号整数f,t;
cudaSetDevice(0);
cudaMemGetInfo&f&t;
返回0;
}
编辑2:
我在Linux上使用“Cuda编译工具,2.0版,V0.2.1221”(nvcc)
当我试图用
cudaDriverGetVersion()
安装cuda驱动程序版本时,发生了相同的错误(当我使用驱动程序函数
cuDriverGetVersion()
时也是如此)

似乎系统不会让我知道任何关于自身的细节…

对于您正在使用的非常旧的CUDA版本,
cudaMemGetInfo
不是运行时API的一部分。它在driver
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;
}
在你的例子失败的地方会起作用。注意,<>代码> NVCC 使用主机C++编译器编译宿主代码,不会发现API函数的实例不正确的参数。请注意,的原型是

参数应该是
size\t
,这与许多平台上的
unsigned int
不同。

要修复此错误:

错误:“unsigned int*”类型的参数与“size\u t*”类型的参数不兼容

我从中发现: 接受或返回内存大小的驱动程序API函数,如cumeAlloc()和cumeGetInfo(),现在使用size\t而不是unsigned int

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

错误代码: 无符号整型,总计; cuMemGetInfo(&免费,&总计)

正确代码: 无尺寸,总尺寸;
cuMemGetInfo(&免费,&总计)

你包括cuda_runtime_api.h了吗?@Pavan:到目前为止,我只包括cuda.h。如果我包括cuda_runtime_api.h,那么错误仍然存在。您是否可以发布一个可由其他人编译的concept repo案例来说明问题?该函数在CUDA 1.0之前就已经存在于API中,因此肯定有其他错误。请粘贴确切的编译器警告。@Callahan:我在这里的初始注释中有点错误-
cuMemGetInfo
已经永远存在于驱动程序API中,但CUDA 3.0中只添加了等效的运行时API。因为您使用的是真正古老的CUDA版本,所以无法访问该API调用。你最初对版本的怀疑被证明是正确的。这是一个很好的观点。但这并不能解决问题。。。我尝试给
cudaSetDevice()
一个指针,而不是一个整数,编译器识别它:“错误:类型为“size\u t*”的参数与类型为“int”的参数不兼容”@Callahan:那么你是说我发布的代码没有为你编译?您在哪个编译器、操作系统和CUDA版本上执行此操作?是的,它不会编译并显示与以前相同的错误。我在编辑2下发布了我问题中询问的信息。链接驱动程序API,将-lcuda添加到编译标准。如果这不起作用,CUDA安装或您使用的工具包不知何故被破坏。这与原来的问题甚至不再有切身关系,因此继续下去也没有多大意义,
// 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;
}
cudaError_t cudaMemGetInfo(size_t * free, size_t * total)