0

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

1 回答 1

1

是的,所以,就像评论者建议的那样,我们不确定你在运行什么,但是通过猜测来填补缺失的细节,这里有一个镜头:

大多数 CUDA API 调用都会返回一个状态码(或者错误码,如果你愿意的话);正如我们在 Portland Group 的CUDA Fortran 手册中看到的那样,在 C/C++ 和 Fortran 中都是如此:

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

cudaMemGetInfo() 就是这种情况:

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

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

于 2013-12-20T06:53:35.893 回答