当c#程序试图在c++ dll方法中使用cudaMalloc分配超过2GB时终止

C#-program terminates when trying to allocate more than 2GB with cudaMalloc within a C++DLL-method

本文关键字:分配 cudaMalloc 终止 2GB 程序 方法 dll c++      更新时间:2023-10-16

我有一个c#程序调用一个用c++编写的dll方法,使用cudaMalloc获得一个指向我的显卡上分配的内存的指针。后来我把这个指针传递给同一个DLL的一些cuda方法。对于最大2GB的数据,这可以很好地工作。但是,只要我试图保持指向两个以上1gb数据块的指针,程序就会终止,没有任何错误消息:

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,这似乎导致程序被终止。当我通过在第三次调用getDeviceCharPointerTo1GBData时传递bool值而不调用cudaMalloc时,程序不再终止。

我正在运行Windows 7,现在,我想知道,WDDM的2gb限制是否使我的生活变得困难。但我预计cudaMalloc会失败,而不是整个调用c#应用程序被终止。当Windows 7试图分配超过2 GB限制的显卡内存时,它会终止我的程序吗?我怎么能防止这样的崩溃返回一个空指针代替?

终止导致__debugbreak();

在内存太少的情况下被击中,这会导致未处理的异常,从而导致程序终止。