【问题标题】:float vs int in cudacuda中的float vs int
【发布时间】:2012-08-31 04:44:35
【问题描述】:

在 CUDA 中使用 float 而不是 int 更好吗?

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

【问题讨论】:

  • 它们的大小相同,但用途不同

标签: cuda


【解决方案1】:

读取共享内存时的银行冲突都与读取的数据量有关。因此,由于int 和float 的大小相同(至少我认为它们在所有CUDA 平台上都存在),所以没有区别。

合并通常是指全局内存访问——同样,这与读取的字节数有关,而不是数据类型。

【讨论】:

    【解决方案2】:

    int 和 float 都是四个字节,因此在合并全局内存访问或银行冲突时使用它们没有任何区别(如果您以相同的方式访问它们)共享内存访问。

    话虽如此,floats 的性能可能更好,因为这些设备旨在尽可能快地处理它们,ints 通常用于控制和索引等,因此性能较低。当然,它确实比这更复杂 - 如果你只有浮点数,那么整数硬件将处于空闲状态,这将是一种浪费。

    【讨论】:

    • Int 在典型的 GTX 卡中慢了大约 10 倍。典型 GPU 上的整数单元要少得多。除非您有特定的理由,否则不要使用整数或双宽浮点数。
    • @KatasticVoyage 这取决于你用它们做什么。对于加法和减法,浮点数和整数在计算能力 >= 5.0 的设备上是相同的(我已经通过测试证实了这一点),并且在其他设备上彼此相差 20% 以内。见here。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      查看 CUDA 开发人员指南的“数学函数”部分。使用设备运行时函数(内在函数)可以为各种类型提供更好的性能。您可以在更少的时钟周期内在一个操作中执行多个操作。

      对于SectionC.1的部分功能,设备运行时组件中存在精度较低但速度较快的版本;它具有相同的名称 以 __ 为前缀(如 __sinf(x)).. 编译器有一个选项 (-use_fast_math)强制表中的每个函数编译为其内在对应物......选择性地替换数学函数 仅在需要调用内部函数时才调用内部函数 性能增益以及更改属性的位置,例如减少 可以容忍准确性和不同的特殊情况处理。

      • 例如,不要使用 =>,而是使用:x/y => __fdividef(x, y); sinf(x) => __sinf(x)

      你可能会发现更多的方法,比如 x+c*y 是用一个函数执行的..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 2020-10-22
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 2011-03-22
        • 2011-10-11
        相关资源
        最近更新 更多