当c#程序试图在c++ dll方法中使用cudaMalloc分配超过2GB时终止
C#-program terminates when trying to allocate more than 2GB with cudaMalloc within a C++DLL-method
我有一个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();
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- CudaMalloc 在分配内存时失败
- 使用 cudaMalloc() 在使用 std::vector<int *时进行分配>
- 了解 cudaMalloc 分配矩阵的用法
- 分配两个调用cudaMalloc一次的数组
- 当c#程序试图在c++ dll方法中使用cudaMalloc分配超过2GB时终止