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を使用した手動ベクトル化の経験がないので、ここですべての型を定義する方法を教えてください。