【发布时间】:2020-12-26 20:42:01
【问题描述】:
在 x64/sse 上使用向量指令计算 x % M 的最佳/最快方法是什么? (我的意思是 mod/remainder)。
我找不到打包 mod 的任何操作码,所以我认为我能做的最好的是将 int 提升为浮点数,然后使用 DIVPS 和 ROUNDPS 计算 x - m * floor(x / m)。
或者有没有更好的选择我错过了?
UPDATE:M 只在运行时知道,实际循环如下所示:
unsigned x[SIZE], M[SIZE], answer[SIZE];
for (int i = 0; i < SIZE; i++) {
answer[i] = x[i] % M[i];
}
如果有任何帮助,M 也已知在 1 - 640000000 范围内。
【问题讨论】:
-
没有比这更快的了。此外,您可能需要检查一次舍入错误。如果小数部分非常接近
0.5,您计算的商可能并不总是四舍五入到正确的整数。 -
除非 M 是 2 的幂,否则我认为你不走运。
-
M是编译时间常数吗? -
好的,我现在明白了,M 每次迭代都会改变
M[i]。那我回答的方法对你没用。