CUDA GPU整数/浮点大小约束
这是一个非常简单的问题,但在任何地方都找不到一个好的答案。GPU上浮点类型的大小约束是什么。例如,我需要对许多大数字进行立方运算,比如30000000000^3。当我从GPU得到结果时,我得到了一些荒谬的东西,一个大的负数。我猜这就是溢出的处理方式。非常感谢您的解释和评论。CUDA GPU整数/浮点大小约束,cuda,gpu,gpgpu,Cuda,Gpu,Gpgpu,这是一个非常简单的问题,但在任何地方都找不到一个好的答案。GPU上浮点类型的大小约束是什么。例如,我需要对许多大数字进行立方运算,比如30000000000^3。当我从GPU得到结果时,我得到了一些荒谬的东西,一个大的负数。我猜这就是溢出的处理方式。非常感谢您的解释和评论。float使用主机编译器,GPU上的数字容量和精度与主机上的float相同。23个尾数位、8个指数位和一个符号位。二进制指数范围从-126到+127,对应于大约+/-37(127/log2(10))的十进制指数范围 由于您的3
float
使用主机编译器,GPU上的数字容量和精度与主机上的float
相同。23个尾数位、8个指数位和一个符号位。二进制指数范围从-126到+127,对应于大约+/-37(127/log2(10))的十进制指数范围
由于您的30000000000^3
示例应生成一个十进制正指数约为28的数字,因此它不应“溢出”基本浮点
存储容量
GPU上的int
同样是主机/主机编译器上由int
表示的32位有符号量。因为它是一个有符号的数字,所以它最多可以存储大约+/-2147483640的数字
如果您使用int
处理示例,那么从一开始就有麻烦。即使在对其进行立方运算之前,该数字也不适合int
表示
如果您使用的是
float
,您可能希望检查代码是否存在导致此类意外结果的其他数据处理问题,或者发布一个小样本复制器,与SSCCE.org上的预期一致。当然,如果你将float
解释为int
,或者反之亦然,你会得到奇怪的结果。自己计算,因为这就是我一直在寻找的答案。问题是我使用的是CUDAfy.NET,所以我需要挖掘一下,看看项目中是否有bug。问题很简单,就是将变量传递给函数时产生的。在.NET中,如果未指定float a=30000000000f代码>vs.浮动a=3000000000
.NET将自由地将分配的号码“强制转换”为双精度。很高兴知道。实际上C也是30.0
在C中是一个double
常量。30.0f
在C中是一个float
常量。我不清楚为什么这会产生不同。float
或double
可以表示此数字以及立方结果。当你做float a=3000000000时可能会发生
由于省略了小数点,因此最终得到的常量是nietherfloat
或double
。如果你做float a=30000000000.0代码>我认为它也会正常工作。