use*_*112 3 c++ sse simd vectorization avx
我正在看英特尔内在指南:
https://software.intel.com/sites/landingpage/IntrinsicsGuide/
虽然他们有_mm_dp_ps和_mm_dp_pd计算浮点数和双打的点积我看不到计算整数点积的任何东西.
我有两个unsigned int[8]数组,我想:
(a [0] xb [0])+(a [1]*b [1])....... +(a [num_elements_in_array-1]*b [num_elements_in_array-1])
(分四批)和产品总和?
har*_*old 12
每次有人这样做:
temp_1 = _mm_set_epi32(x[j], x[j+1], x[j+2], x[j+3]);
Run Code Online (Sandbox Code Playgroud)
一只小狗死了
使用以下其中一个:
temp_1 = _mm_load_si128(x); // if aligned
temp_1 = _mm_loadu_si128(x); // if not aligned
Run Code Online (Sandbox Code Playgroud)
铸造x是必要的.
没有整数版本_mm_dp_ps.但你可以做你将要做的事情:乘以4乘4整数,积累产品的总和.
所以像这样(没有测试,不编译)
while(j < num_elements_in_array){
//Load the 4 values from x
temp_1 = _mm_load_si128(x + j); // add cast
//Load the 4 values from y
temp_2 = _mm_load_si128(y + j); // add cast
j += 4;
//Multiply x[0] and y[0], x[1] and y[1] etc
temp_products = _mm_mullo_epi32(temp_1, temp_2);
//Sum temp_sum
temp_sum = _mm_add_epi32(temp_sum, temp_products);
}
// take horizontal sum of temp_sum
temp_sum = _mm_add_epi32(temp_sum, _mm_srli_si128(temp_sum, 8));
temp_sum= _mm_add_epi32(temp_sum, _mm_srli_si128(temp_sum, 4));
sum = _mm_cvtsi128_si32(temp_sum);
Run Code Online (Sandbox Code Playgroud)
正如评论和聊天中所讨论的那样,通过垂直地做大多数总和,以最小化所需的水平和的数量重新排序总和.