#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(); срабатывание в случае слишком малого объема памяти, что вызвало необработанное исключение и, следовательно, завершение программы.