C #-program завершается при попытке выделить более 2 ГБ с помощью cudaMalloc в рамках C DLL-метода

#c# #c #windows #cuda #dynamic-memory-allocation

#c# #c #Windows #cuda #динамическое выделение памяти #c

Вопрос:

У меня есть C #-program, вызывающая DLL-метод, написанный на C , чтобы получить указатель на память, выделенную на моей видеокарте с помощью cudaMalloc. Позже я передаю этот указатель на некоторый CUDA-метод той же DLL. Это отлично работает для данных объемом до 2 ГБ. Но как только я пытаюсь сохранить указатели более чем на два блока данных объемом 1 ГБ, программа завершается без какого-либо сообщения об ошибке:

 char*_test1 = CudaDllWrapper.getDeviceCharPointerTo1GBData(filename);
char* test2 = CudaDllWrapper. getDeviceCharPointerTo1GBData (filename);
char* test3 = CudaDllWrapper.. getDeviceCharPointerTo1GBData (filename); //program terminates in this line
  

Cuda-DLL-код таков:

 char* getDeviceCharPointerTo1GBData (const char*  a_pcFileName) {
char* pcLargeData  = ReadPreRasteredImageAsChar(a_pcFileName);
char* pcPrerasteredImage_dyn = NULL;
unsigned long long iSourceImageSize_byte = getFileSize(a_pcFileName);
size_t freeMem, total;
cudaMemGetInfo(amp;freeMem, amp;total);
if (freeMem > iSourceImageSize_byte)
cudasafe(cudaMalloc((void **)amp;pcPrerasteredImage_dyn, iSourceImageSize_byte), "Original image allocation ", __FILE__, __LINE__);
else
return NULL;
}
  

Как вы видите, я проверяю, достаточно ли памяти осталось на видеокарте, но, похоже, памяти все еще достаточно, и поэтому DLL-метод, похоже, вызывает cudaMalloc , что, похоже, приводит к завершению программы. Когда я оставляю cudaMalloc не вызываемым, передавая bool при третьем вызове getDeviceCharPointerTo1GBData , программа больше не завершается.

Я использую Windows 7, и теперь мне интересно, не усложняет ли WDDM мою жизнь своим ограничением в 2 ГБ. Но я ожидал, что cudaMalloc просто завершится сбоем, но не того, что все вызывающее C #-приложение будет завершено. Может ли быть так, что Windows 7 завершает работу моей программы, когда она пытается выделить память видеокарты сверх этого предела в 2 ГБ? И как я могу предотвратить такой сбой, возвращающий вместо этого nullpointer?

Комментарии:

1. Достаточно ли в системе памяти графического процессора?

Ответ №1:

Завершение было вызвано __debugbreak(); срабатывание в случае слишком малого объема памяти, что вызвало необработанное исключение и, следовательно, завершение программы.