每當有人做到這一點:
temp_1 = _mm_set_epi32(x[j], x[j+1], x[j+2], x[j+3]);
..小狗死亡。
使用下列操作之一:
temp_1 = _mm_load_si128(x); // if aligned
temp_1 = _mm_loadu_si128(x); // if not aligned
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);
正如在評論中討論和聊天,那重新排序的款項以這樣的方式,以減少所需的水平總和的數目,通過垂直做大部分的總和。
爲什麼會出現這種問題的不斷變化? – harold