2016-10-24 2 views
-1

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

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(&freeMem, &total); 
if (freeMem > iSourceImageSize_byte) 
cudasafe(cudaMalloc((void **)&pcPrerasteredImage_dyn, iSourceImageSize_byte), "Original image allocation ", __FILE__, __LINE__); 
else 
return NULL; 
} 

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

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

+0

Имеет ли система достаточно памяти GPU? – NathanOliver

ответ

0

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