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); 正如评论和聊天中所讨论的那样,通过垂直地做大多数总和,以最小化所需的水平和的数量重新排序总和. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- PostgreSql 获取所有的表、视图、字段、 主键
- 从引擎核心谈页游处理 flash平台和 webgl_html平台的硬件加
- Flash地图控件AnyMap使用Thresholds为地图着色
- ajax的异步提交以及返回数据的处理,重点json
- 【cocos2d-x 024】 LINK : fatal error LNK1123: 转换到 CO
- SQLite在多线程环境下的应用
- 设计模式六大原则(3):依赖倒置原则
- Postgresql plpgsql / sql是否支持where子句中的短路?
- iphone – XCode for iOS的编译/运行时间非常慢
- nosql – Cassandra cli:将十六进制值转换为人类可读的格式