x86_64 intrinsics에 익숙하지 않아 256 비트 벡터 레지스터를 사용하여 다음 작업을 수행하고 싶습니다. _mm256_maddubs_epi16 (a, b)를 사용하고있었습니다. 그러나이 명령은 char * char이 16 비트 최대 값을 초과 할 수 있으므로 오버플로 문제가있는 것으로 보입니다. _mm256_unpackhi_epi32 및 관련 지침을 이해하고 있습니다.intrinsics를 사용하여 요소 방향으로 두 개의 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로 이동할 수 있습니다. –