我的CUDA代码中有一个相当大的结构
Amo 3
Lee 3
Marine On Saint Croix 21
Roy 3
我使用cudaMalloc在系统设置期间分配保存该结构所需的空间,因为Windows将静态代码和数据限制为2GB。讨厌,但很好。显然我正在编译一个64位应用程序,但是当我这样做时,我的调试配置出现以下错误:
struct cDevData {
~5GB worth of stuff ...
};
奇怪的是发布配置的另一个:
ptxas C : /Users/user/AppData/Local/Temp/tmpxft_0000123c_00000000-4_kernel.ptx, line 2897; error : Value out of range for type .b32
ptxas fatal : Ptx assembly aborted due to errors
只有当我将这个结构的大小增加到超过4GB时才开始发生。
我还试图编译一个32位应用程序只是为了检查,我得到一个不同的(预期的)错误error C2089: 'cDevData' : 'struct' too large
。
发生了什么事,有没有办法绕过它?
系统:Windows 7,Visual Studio 2012,CUDA工具包8.0,GPU = Titan。
答案 0 :(得分:1)
这是两个错误的组合 - 一个在NVCC中,另一个在VS2012中。来自NVIDIA的回复:
发布配置中产生的错误"错误C2089:' cDevData' :' struct'太大"来自主机编译器。所以这个问题是由于Windows上主机编译器的限制。我们将修复Debug配置中公开的其他问题。但是,即使在修复之后,由于主机编译器的限制,编译也会在Windows上失败。
我不知道VS2015或更高版本中是否修复了此问题。
与此同时,我通过勤劳地使用boost::mpl
和一些宏来规避问题,保留类似结构的语义(按名称访问字段,复杂字段类型,如多维数组保留其维度等) 。因此,最后我的代码需要进行最少的更改(将字段deref op ->
更改为宏,并将sizeof(cDevData)
替换为另一个宏)。