2014-04-20 76 views
3

我期待在英特爾固有的指南:使用SSE/AVX的整數點積?

https://software.intel.com/sites/landingpage/IntrinsicsGuide/

,並同時他們_mm_dp_ps_mm_dp_pd用於計算和雙精度浮點數的點積我不能看到計算整數點積任何東西。

我有兩個unsigned int[8]陣列和我想:

(A [0] XB [0])+(一個[1] * B [1])....... +(一個[num_elements_in_array-1] * b [num_elements_in_array-1])

(在四批)和求和產品?

+1

爲什麼會出現這種問題的不斷變化? – harold

回答

12

每當有人做到這一點:

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); 

正如在評論中討論和聊天,那重新排序的款項以這樣的方式,以減少所需的水平總和的數目,通過垂直做大部分的總和。

+0

我不意味問這個 - 我知道對齊通常是什麼,但我不知道我是否需要它這個嚇唬你? – user997112

+6

+1爲幼犬垂死。 – Mysticial

+0

@ user997112你是什麼意思? – harold