【发布时间】:2017-10-17 12:33:45
【问题描述】:
我有一个函数:
void Func(const int * a, const int * b, size_t size, int p, int * c)
{
for (size_t i = 0; i < size; ++i)
c[i] = (a[i]*b[i])%p;
}
此函数对整数数组执行多次模乘。 所有整数都是正数。 我需要提高它的性能。
我想到了 SSE 和 AVX。但是他们没有向量化模乘法的操作。 还是我错了?
也许有人知道解决这个问题的任何可能性吗?
【问题讨论】:
-
它是一个素数。
-
您是否重复使用同一个
p?size通常有多大?如果它足够大或使用相同的p重复足够频繁,则甚至可能值得使用硬编码向量移位和the fixed-point multiplicative inverse 来JIT 编译循环。或者使用libdivide.com 在没有 JIT 的情况下使用乘法逆运算,但这会产生更多开销(psrlq最好使用 imm8 计数)。不过,它可能只有 SSE2 版本,而不是 AVX2 或 AVX512。 -
a[i]*b[i]是否会溢出?如果是,那可以吗,还是您想要 64 位结果 modp的结果? -
@chtz:我认为我们可以假设这是现有的工作+测试源,其中带符号的溢出将是 UB(或者实际上会以 32 位包装)。
标签: c++ algorithm sse simd avx