Нет прямого пути, который я знаю.Мой обычный подход состоял в том, чтобы сделать что-то вроде этого:
const size_t MB = 1<<20;
size_t reserved, total;
cudaMemGetInfo( &reserved, &total );
char fail = 0;
while( cudaMalloc( (void**)&pool, reserved ) != cudaSuccess )
{
reserved -= MB;
if( reserved < MB )
{
fail = 1;
break;
}
}
, который начинается с общего объема свободной памяти, возвращаемого с cudaMemGetInfo
, а затем уменьшается до моего «разумного» размера (насколько я могу сказать вВ эпоху GT200 у графического процессора (GPU) есть пара страниц разного размера (самый большой - 1 МБ).Цикл продолжается до тех пор, пока вы либо не получите выделение, либо память не станет настолько фрагментированной или исчерпанной, что даже одна страница потерпит неудачу.Не очень красиво, но, кажется, работает 99,999% времени.