【发布时间】:2014-01-08 10:46:42
【问题描述】:
我正在尝试获取设备上有多少可用内存。为此,我从 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)
【问题讨论】:
-
你能展示一个重现错误的简单代码吗?您是否对 cuMemGetInfo 调用的返回码进行 cuda 错误检查?
-
您提到了fortran,但您的问题也被标记为openacc。您使用的是 OpenACC (Fortran) 还是使用 CUDA Fortran?
-
正如@RobertCrovella 所问,我们能看到一些代码吗?我看到
cuMemGetInfo期望size_t,你给他们了吗(使用iso_c_binding和C_SIZE_T)?或者它可能会给你unsigned ints 你正在解释为有符号整数。 -
为什么人们这么快就否决了这个问题?当然,它需要改进,但让这个家伙放松一下,他/她是 SO 的新手。
-
分配与你的大小计算不匹配的原因是有开销。开销是分配开销的形式(因为分配通常不是以字节为单位,而是以更大的粒度,例如千字节或更高),以及一般的内务管理。 CUDA 驱动程序使用 GPU 内存来存储一般的内务管理信息,就像 Windows 或 linux 操作系统使用一些系统内存来进行内务管理一样。
标签: memory cuda fortran openacc