私はx86_64の組み込み関数に慣れていないので、私は256ビットのベクトルレジスタを使って次の操作をしたいと思います。 _mm256_maddubs_epi16(a、b)を使用していました。 char * charは16ビットの最大値を超える可能性があるので、この命令はオーバーフローの問題があるようです。 _mm256_unpackhi_epi32とそれに関連する指示を理解している問題があります。intrinsicsを使用して2つのchar配列を要素単位で掛け合わせ、その乗算をintに集計する方法は?
誰も私を詳しく説明し、私に目的地までの光を見せてもらえますか?ありがとうございました!
int sumup_char_arrays(char *A, char *B, int size) {
assert (size % 32 == 0);
int sum = 0;
for (int i = 0; i < size; i++) {
sum += A[i]*B[i];
}
return sum;
}
まず、SSEのバージョンを記述することをお勧めします。 16ビットにアンパックし、 '_mm_madd_epi16'を使って重い作業を行います。それは初心者のための挑戦であろうが、おそらくAVXの激しい分割レーンの問題はないだろう。いつでもSSEからAVXへ行くことができます。 –