【问题标题】:how to get the available memory on the device如何获取设备上的可用内存
【发布时间】: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_bindingC_SIZE_T)?或者它可能会给你unsigned ints 你正在解释为有符号整数。
  • 为什么人们这么快就否决了这个问题?当然,它需要改进,但让这个家伙放松一下,他/她是 SO 的新手。
  • 分配与你的大小计算不匹配的原因是有开销。开销是分配开销的形式(因为分配通常不是以字节为单位,而是以更大的粒度,例如千字节或更高),以及一般的内务管理。 CUDA 驱动程序使用 GPU 内存来存储一般的内务管理信息,就像 Windows 或 linux 操作系统使用一些系统内存来进行内务管理一样。

标签: memory cuda fortran openacc


【解决方案1】:

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

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

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

cudaMemGetInfo() 就是这种情况:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2020-11-03
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多