Я пытаюсь получить, сколько свободной памяти у меня есть на устройстве. Для этого я вызываю функцию 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)
cuMemGetInfo
ожидаетsize_t
, вы им это даете (используяiso_c_binding
иC_SIZE_T
)? Или это может вернуть вамunsigned int
s, которые вы интерпретируете как целые числа со знаком. - person Timothy Brown   schedule 19.12.2013