CUDA:大型结构上的编译失败> 4GB

时间:2016-12-15 08:03:33

标签: cuda

我的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。

1 个答案:

答案 0 :(得分:1)

这是两个错误的组合 - 一个在NVCC中,另一个在VS2012中。来自NVIDIA的回复:

发布配置中产生的错误"错误C2089:' cDevData' :' struct'太大"来自主机编译器。所以这个问题是由于Windows上主机编译器的限制。我们将修复Debug配置中公开的其他问题。但是,即使在修复之后,由于主机编译器的限制,编译也会在Windows上失败。

我不知道VS2015或更高版本中是否修复了此问题。 与此同时,我通过勤劳地使用boost::mpl和一些宏来规避问题,保留类似结构的语义(按名称访问字段,复杂字段类型,如多维数组保留其维度等) 。因此,最后我的代码需要进行最少的更改(将字段deref op ->更改为宏,并将sizeof(cDevData)替换为另一个宏)。