加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用SSE / AVX的整数点积?

发布时间:2020-12-16 10:26:05 所属栏目:百科 来源:网络整理
导读:我正在看英特尔内在指南: https://software.intel.com/sites/landingpage/IntrinsicsGuide/ 虽然他们有_mm_dp_ps和_mm_dp_pd用于计算浮点数和双精度的点积,但我看不出任何用于计算整数点积的东西. 我有两个unsigned int [8]数组,我想: (a [0] x b [0])(a [
我正在看英特尔内在指南:

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

虽然他们有_mm_dp_ps和_mm_dp_pd用于计算浮点数和双精度的点积,但我看不出任何用于计算整数点积的东西.

我有两个unsigned int [8]数组,我想:

(a [0] x b [0])(a [1] * b [1])…….(a [num_elements_in_array-1] * b [num_elements_in_array-1])

(分四批)和产品总和?

解决方法

每次有人这样做:

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,4));
sum = _mm_cvtsi128_si32(temp_sum);

正如评论和聊天中所讨论的那样,通过垂直地做大多数总和,以最小化所需的水平和的数量重新排序总和.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读