【发布时间】:2017-02-26 09:49:09
【问题描述】:
我不熟悉 x86_64 内在函数,我想使用 256 位向量寄存器进行以下操作。 我正在使用 _mm256_maddubs_epi16(a, b);但是,该指令似乎存在溢出问题,因为 char*char 可以超过 16 位最大值。我对 _mm256_unpackhi_epi32 和相关说明有问题。
谁能详细说明我并告诉我通往目的地的光?谢谢!
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版本,e.g.解压到 16 位,然后使用
_mm_madd_epi16进行繁重的工作。对于初学者来说,这可能是一个足够的挑战,没有 AVX 上所有繁琐的分道问题。如果您觉得需要,您可以随时从 SSE 转到 AVX。
标签: c++ algorithm x86-64 simd intrinsics