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

时间:2013-12-19 18:22:02

标签: memory cuda fortran openacc

我正在尝试获取设备上有多少可用内存。为此,我从fortran代码调用cuda函数cuMemGetInfo,但它返回了可用内存量的负值,所以显然有些错误。 有谁知道我怎么做到这一点? 感谢

编辑:

对不起,其实我的问题不是很清楚。我在Fortran中使用OpenACC,我调用C ++ cuda函数cudaMemGetInfo。最后我可以修复代码,问题实际上是我正在使用的那种变量。切换到size_修复了一切。这是我正在使用的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);
}
}

还有最后一个问题:我在gpu上推了一个数组并使用cuMemGetInfo检查了它的大小,然后我计算了它的大小,计算了字节数,但我没有相同的答案,为什么?在第一种情况下,它是3052mb大,在后者3051mb。这个1mb的差异可能是数组描述符的大小?这里有我使用的代码:

integer, parameter:: long = selected_int_kind(12)
integer(kind=c_size_t) :: total, free1,free2
real(8), dimension(:),allocatable::a
integer(kind=long)::N, eight, four

allocate(a(four*N))

!some OpenACC stuff in order to init the gpu
call get_dev_mem(total,free1)

!$acc data copy(a)

call get_dev_mem(total,free2) 
print *,"size a in the gpu = ",(free1-free2)/1024/1024, " mb"
print *,"size a in theory  = ", (eight*four*N)/1024/1024, " mb"

!$acc end data
deallocate(a)

1 个答案:

答案 0 :(得分:1)

是的,所以,就像评论者提出的那样,我们不确定你到底在做什么,但是通过猜测来填补遗漏的细节,这是一个镜头:

大多数CUDA API调用返回状态代码(如果愿意,则返回错误代码);在C / C ++和Fortran中都是如此,正如我们在波特兰集团的CUDA Fortran Manual中看到的那样:

  

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

cudaMemGetInfo()的具体情况如下:

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

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