我不断收到来自计算着色器编译的警告,因为建议我使用 uint 而不是 int 进行除法。
默认情况下,我假设 uint 的数据类型更快;然而,网上的各种测试似乎都指向相反的方向;也许这种矛盾只存在于 CPU 方面,而 GPU 并行化有一些未知的优势?(或者这只是不好的建议?)
我不断收到来自计算着色器编译的警告,因为建议我使用 uint 而不是 int 进行除法。
默认情况下,我假设 uint 的数据类型更快;然而,网上的各种测试似乎都指向相反的方向;也许这种矛盾只存在于 CPU 方面,而 GPU 并行化有一些未知的优势?(或者这只是不好的建议?)
我知道这是一个非常晚的答案,但这也是我提出的一个问题,我想为将来看到这个问题的任何人提供一些信息。
我最近发现了这个资源 - https://arxiv.org/pdf/1905.08778.pdf
底部的表格列出了几款显卡上基本操作的延迟。通过在所有测量的硬件上使用 uint 可以发现少量但一致的节省。但是,警告没有说明的是,如果可能的话,可以通过用乘法替换除法来找到更大的优化。
https://www.slideshare.net/DevCentralAMD/lowlevel-shader-optimization-for-nextgen-and-dx11-by-emil-persson指出类型转换是一种全速率操作,如 int/float 减法、加法和乘法,而除法非常慢。
我已经看到它建议为了提高性能,应该转换为浮点数、除法,然后转换回整数,但如第一个来源所示,这充其量只会给你带来小的收益,而最坏的情况实际上会降低性能。
您说得对,它因 CPU 上的操作性能而异,尽管我不完全确定原因。
查看https://www.agner.org/optimize/instruction_tables.pdf似乎哪个操作更快(MUL 与 IMUL)因 CPU 而异 - 在列表顶部的几个中,IMUL 实际上更快,尽管更高的指令数。其他 CPU 根本不区分 MUL 和 IMUL。
TL;DR uint 除法在 GPU 上更快,但在 CPU 上 YMMV