我想对 Core2 的代码进行矢量化。我认为,我可以使用 gcc 或 icc 的内在函数,并且允许使用 SSE、SSE2、SSE3、SSSE3 指令。
我的代码适用于 8 个 uint32_t 元素的数组,就像这样(这里只有热点):
const uint32_t p[8] = {2147483743, 2147483713, 2147483693, 2147483659,
2147483647, 2147483629, 2147483587, 2147483579};
void vector_mod_add(uint32_t *a /* a[8] */, uint32_t *b /* b[8] */) {
int n;
for(n=0;n<8;n++)
a[n]+=b[n];
for(n=0;n<8;n++)
if(a[n]>=p[n])
a[n]-=p[n];
}
加法相当容易,但我不知道如何进行条件减法。
另外,我没有使用 SSE2 进行手动矢量化的经验,所以请告诉我应该如何在这里定义所有类型。