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
上
我一直收到来自计算着色器编译的警告,因为建议我使用 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
上