我正在尝试获取设备上有多少可用内存。为此,我从 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)