CUDA中的float和int的区别

4

在CUDA中,使用float是否比int更好?

float是否可以减少银行冲突并确保合并(或与此无关)?


它们的大小相同,但用途不同。 - Anycorn
4个回答

5
读取共享内存时的银行冲突都与读取的数据量有关。因此,由于在所有CUDA平台上,intfloat的大小相同(至少我认为是这样),所以没有区别。
合并通常是指全局内存访问 - 同样,这与读取的字节数有关,而不是数据类型。

2

intfloat都是四个字节,所以如果你以相同的方式访问它们,使用哪种类型在全局内存访问合并或共享内存访问中的bank冲突方面并没有区别。

话虽如此,由于设备旨在尽可能快地处理float,因此使用float可能会获得更好的性能,而int通常用于控制和索引等,因此性能较低。当然,情况比这更复杂 - 如果你只有浮点数,那么整数硬件将闲置,这将是一种浪费。


整数在典型的GTX卡上大约慢10倍。典型GPU上的整数单元要少得多。除非您有特定的原因,否则不要使用整数或双宽浮点数。 - Katastic Voyage
@KatasticVoyage 这取决于你对它们的操作。对于加法和减法,在计算能力>= 5.0的设备上,浮点数和整数是相同的(我已经通过测试确认了这一点),在其他设备上它们之间的差距不超过20%。请参见此处 - Gumby The Green

1

银行冲突和合并都与内存访问模式有关(即warp内的线程是否以统一步幅读/写不同位置)。因此,这些问题与数据类型(float、int、double等)无关。

请注意,数据类型确实会影响计算性能。单精度浮点比双精度浮点更快等。GPU中强大的浮点运算器通常意味着在定点数中进行计算是不必要的,甚至可能是有害的。


0
请查看CUDA开发人员指南中的“数学函数”部分。使用设备运行时函数(内置函数)可能会为各种类型提供更好的性能。您可以在较少的时钟周期内执行多个操作。
对于第C.1节中的某些函数,设备运行时组件存在一个精度较低但速度更快的版本;它具有相同的名称,前缀为__(例如__sinf(x))。编译器有一个选项(-use_fast_math),它强制表中的每个函数编译为其内在对应项...仅在性能收益值得和可以容忍降低精度和不同特殊情况处理等更改属性的情况下,才有选择地将数学函数调用替换为内置函数调用。
例如,不要使用=>使用:x/y => __fdividef(x, y); sinf(x) => __sinf(x)
您还可以找到更多类似于x+c*y的方法,可以使用一个函数来执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接