代码之家  ›  专栏  ›  技术社区  ›  Richard

CUDA的舍入模式可以为内核全局设置吗?

  •  0
  • Richard  · 技术社区  · 3 年前

    讨论了CUDA对浮点舍入模式的处理 here 以及各种错综复杂的事物,如 __fadd_rn 可以执行四舍五入浮点选项(在这种情况下四舍五舍五入到最接近的值)。

    然而,如果我想为一段代码切换模式,这会变得难以操作。

    在主机端,我可以使用 fesetenv and friends 为线程设置浮点舍入模式。

    是否有方法为流或内核设置CUDA的浮点舍入模式?

    0 回复  |  直到 3 年前
        1
  •  2
  •   talonmies    3 年前

    总之,没有。

    CUDA中的不同浮点舍入模式被实现为不同的指令,而不是像在其他一些硬件上那样实现不同的FPU操作模式。舍入模式在编译时通过使用所需的内部或PTX指令,或通过指示编译器应用翻译单元范围默认舍入行为来静态选择。一旦编译器和汇编器完成,代码将使用的浮点模式将被烘焙到GPU将运行的代码中,并且无法更改。

    假设地,我认为有可能使用运行时触发的JIT传递让驱动程序将代码转换为不同的舍入模式。但如今,该设施并不存在。

        2
  •  2
  •   gfreytag    3 年前

    正如@talonmies所提到的,简短的回答是否定的。但是,CUDA提供了较低级别的算术指令来控制舍入模式。这些指令被称为内部指令,与常规指令不同,它们不太精确,也没有被编译器优化。此外,您需要重写代码以使用这些指令。以下是一个示例:

    // Regular add instruction
    float c = a + b;
    
    // Intrinsic add instruction
    float c = __fadd_rn(a, b);
    

    如您所见, __fadd_rn() 是一个具有四舍五入模式的求和指令。可能的舍入模式有:

    __fadd_rn(); // Round-to-nearest
    __fadd_rz(); // Round-towards-zero
    __fadd_ru(); // Round-up
    __fadd_rd(); // Round-down
    

    所有这些信息以及您可以在中找到的更多信息 CUDA's Math API 文档。