как получить доступную память на устройстве

Я пытаюсь получить, сколько свободной памяти у меня есть на устройстве. Для этого я вызываю функцию cuda cuMemGetInfo из кода на фортране, но она возвращает отрицательные значения свободного объема памяти, поэтому явно что-то не так. Кто-нибудь знает, как я могу это сделать? Спасибо

РЕДАКТИРОВАТЬ:

Извините, на самом деле мой вопрос был не очень ясен. Я использую OpenACC в Fortran и вызываю функцию cuda C++ cudaMemGetInfo. Наконец-то я смог исправить код, проблема заключалась в типе переменных, которые я использовал. Переключение на size_ все исправило. Это интерфейс в фортране, который я использую:

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, затем вычислил его размер, считая количество байтов, но у меня не тот же ответ, почему? В первом случае это 3052мб, во втором 3051мб. Эта разница в 1 мб может быть размером дескриптора массива? Вот код, который я использовал:

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)

person rosilho    schedule 19.12.2013    source источник
comment
можете ли вы показать простой код, воспроизводящий ошибку? Вы выполняете проверку ошибок cuda для кода возврата из вызова cuMemGetInfo?   -  person Robert Crovella    schedule 19.12.2013
comment
Вы упоминаете fortran, но ваш вопрос также помечен как openacc. Вы используете OpenACC (Fortran) или используете CUDA Fortran?   -  person Robert Crovella    schedule 19.12.2013
comment
Как спросил @RobertCrovella, можем ли мы увидеть код? Я вижу, что cuMemGetInfo ожидает size_t, вы им это даете (используя iso_c_binding и C_SIZE_T)? Или это может вернуть вам unsigned ints, которые вы интерпретируете как целые числа со знаком.   -  person Timothy Brown    schedule 19.12.2013
comment
Почему люди так быстро минусуют этот вопрос? Конечно, это нуждается в улучшении, но дайте парню немного поблажки, он / она новичок в SO.   -  person einpoklum    schedule 20.12.2013
comment
Причина, по которой распределение не соответствует вашему расчету размера, заключается в накладных расходах. Накладные расходы представлены в виде накладных расходов на выделение (поскольку выделение обычно выполняется не в единицах байтов, а в более крупных размерах, таких как килобайты или выше), а также в общей служебной деятельности. Память графического процессора используется драйвером CUDA для хранения общей служебной информации, точно так же, как ОС Windows или Linux используют часть системной памяти для своих служебных целей.   -  person Robert Crovella    schedule 21.12.2013


Ответы (1)


Итак, как предположили комментаторы, мы не уверены, что именно вы используете, но заполняем недостающие детали, угадывая, вот снимок:

Большинство вызовов CUDA API возвращают код состояния (или код ошибки, если хотите); это верно как для C/C++, так и для Fortran, как мы можем видеть в CUDA Portland Group. Руководство по Фортрану:

Большинство подпрограмм API времени выполнения представляют собой целочисленные функции, которые возвращают код ошибки; они возвращают нулевое значение, если вызов был успешным, и ненулевое значение, если произошла ошибка. Чтобы интерпретировать коды ошибок, обратитесь к разделу «Обработка ошибок» на стр. 48.

В частности, это относится к cudaMemGetInfo():

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

Два целых числа для free и total - это cuda_count_kind, которые, если я не ошибаюсь, фактически беззнаковые... в любом случае, я бы предположил, что вы получаете код ошибки. Взгляните на раздел «Обработка ошибок» на странице 48 руководства.

person einpoklum    schedule 20.12.2013