Memory 如何获取设备上的可用内存

Memory 如何获取设备上的可用内存,memory,cuda,fortran,openacc,Memory,Cuda,Fortran,Openacc,我正在尝试获取设备上有多少可用内存。为此,我从fortran代码中调用cuda函数cuMemGetInfo,但它返回可用内存量的负值,因此显然有问题。 有人知道我怎么做吗? 谢谢 编辑: 对不起,事实上我的问题不是很清楚。我在FORTRAN中使用OpenACC,我调用C++ cUDA函数CUADAMEMGETFION。最后我可以修复代码,问题在于我使用的变量类型。切换到大小-修复了所有问题。这是我正在使用的fortran接口: interface subroutine get_dev_mem(t

我正在尝试获取设备上有多少可用内存。为此,我从fortran代码中调用cuda函数cuMemGetInfo,但它返回可用内存量的负值,因此显然有问题。 有人知道我怎么做吗? 谢谢

编辑:

对不起,事实上我的问题不是很清楚。我在FORTRAN中使用OpenACC,我调用C++ cUDA函数CUADAMEMGETFION。最后我可以修复代码,问题在于我使用的变量类型。切换到大小-修复了所有问题。这是我正在使用的fortran接口:

interface
subroutine get_dev_mem(total,free) bind(C,name="get_dev_mem")
    use iso_c_binding
        integer(kind=c_size_t)::total,free
end subroutine get_dev_mem
end interface
这就是cuda代码

#include <cuda.h>
#include <cuda_runtime.h>

extern "C" {
void get_dev_mem(size_t& total, size_t& free) 
{
    cuMemGetInfo(&free, &total);
}
}

好的,所以,正如评论员所建议的,我们不确定你到底在运行什么,但通过猜测来填补缺少的细节,下面是一个镜头:

大多数CUDAAPI调用都会返回一个状态码(或者错误码,如果您愿意的话);这在C/C++和Fortran中都是正确的,正如我们在波特兰集团的:

大多数运行时API例程都是返回错误代码的整数函数;如果调用成功,它们将返回一个零值;如果出现错误,它们将返回一个非零值。要解释错误代码,请参阅第48页的“错误处理”

cudaMemGetInfo()的情况就是这样:

integer function cudaMemGetInfo( free, total )
    integer(kind=cuda_count_kind) :: free, total

free
total
的两个整数是
cuda\u count\u kind
,如果我没有弄错的话,它们实际上是无符号的。。。无论如何,我猜你得到的是一个错误代码。请查看本手册第48页的错误处理部分。

您能给出一个简单的代码来重现错误吗?您是否正在对cuMemGetInfo调用的返回代码执行cuda错误检查?您提到fortran,但您的问题也标记为openacc。您是在使用OpenACC(Fortran)还是在使用CUDA Fortran?正如@RobertCrovella所问的,我们能看到一些代码吗?我看到
cuMemGetInfo
期望
size\u t
,您是否给了它们(使用
iso\u c\u绑定
c\u size\u t
)?或者它可能会把你解释为有符号整数的
unsigned int
s返回给你。为什么人们这么快就否决了这个问题?当然,这需要改进,但是让他/她放松一些,他/她是新来的。分配与您的尺码计算不匹配的原因是存在开销。开销的形式包括分配开销(因为分配通常不是以字节为单位,而是以更大的粒度大小(如千字节或更高)以及一般的内务管理。CUDA驱动程序使用GPU内存来存储常规内务管理信息,就像windows或linux操作系统使用一些系统内存进行内务管理一样。
integer function cudaMemGetInfo( free, total )
    integer(kind=cuda_count_kind) :: free, total