GPU HLSL 计算着色器警告 int 和 uint 除法

GPU HLSL compute shader warnings int and uint division

我一直收到来自计算着色器编译的警告,因为建议我使用 uint 而不是带除法的 int。

默认情况下,从数据类型来看,我假设 uint 更快;然而,各种在线测试似乎指向相反的方向;也许这种矛盾仅在 CPU 一方,而 GPU 并行化有一些未知的优势? (或者只是不好的建议?)

我知道这是一个非常晚的答案,但这也是我遇到的一个问题,我想为将来看到这个问题的任何人提供一些信息。

我最近找到了这个资源 - https://arxiv.org/pdf/1905.08778.pdf

最下面的table列出了几款显卡基本操作的延迟。通过在所有测量的硬件上使用 uint 可以找到小而一致的节省。但是,警告没有说明的是,如果可能的话,可以通过用乘法代替除法来找到更大的优化。

https://www.slideshare.net/DevCentralAMD/lowlevel-shader-optimization-for-nextgen-and-dx11-by-emil-persson 声明类型转换是一个 full-rate 操作,如 int/float 减法、加法和乘法,而除法非常慢。

我看到它建议为了提高性能,应该转换为 float,除法,然后转换回 int,但如第一个来源所示,这充其量只会给你带来小的收益,而实际上最坏的情况是降低性能。

你说得对,它因 CPU 上的操作性能而异,尽管我不完全确定原因。

查看 https://www.agner.org/optimize/instruction_tables.pdf 似乎哪个操作更快(MUL 与 IMUL)从 CPU 到 CPU 不等 - 在列表顶部的几个中,IMUL 实际上是更快,尽管指令数更高。其他 CPU 根本不区分 MUL 和 IMUL。

TL;DR uint 除法在 GPU 上更快,但在 CPU YMMV