博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AVX2整数向量运算
阅读量:6037 次
发布时间:2019-06-20

本文共 1454 字,大约阅读时间需要 4 分钟。

在C/C++程序中,使用AVX2指令有很多种方法。

嵌入汇编是一般的方法,但是对于不熟悉汇编语言的人来说,有点勉为其难。

gcc编译支持AVX2指令的编程。程序中需要使用头文件<immintrin.h>和<avx2intrin.h>,这样通过调用其中定义的一些函数,达到使用AVX2指令目的,即用C/C++调用SIMD指令(单指令多数据)

这里给出的样例程序是有关浮点向量运算的例子。

其中函数_mm_add_epi32()实现的是整数向量(4个数)加法运算。样例程序中使用了若干有关avx2的函数。

编程是Ubuntu15.10,使用Qt编写程序,编译器是gcc的版本是5.2.1

使用AVX2指令实现向量运算,由于使用的是SIMD指令,其优点在于各个分量是并行计算的,计算速度相对比较快。

整数向量运算样例程序一:

#include 
#include
#include
using namespace std;int main(){ __m128i x = _mm_set_epi32(1, 2, 3, 4); __m128i y = _mm_set_epi32(1, 2, 3, 4); __m128i z = _mm_add_epi32(x, y); int* pi; pi = (int*)(&z); printf("0: %d\n", *pi); printf("1: %d\n", *(pi+1)); printf("2: %d\n", *(pi+2)); printf("3: %d\n", *(pi+3)); return 0;}
运算结果:

0: 81: 62: 43: 2
整数向量运算样例程序二:

#include 
#include
#include
using namespace std;int main(){ __m128i x; __m128i y; __m128i z; int op1[4] = {11, 22, 33, 44}; int op2[4] = {22, 33, 44, 55}; int result[4]; // Load x = _mm_loadu_si128((__m128i*)op1); y = _mm_load_si128((__m128i*)op2); // Calculate z = _mm_add_epi32(x, y); // z = x + y // Store _mm_store_si128((__m128i*)result, z); printf("0: %d\n", result[0]); printf("1: %d\n", result[1]); printf("2: %d\n", result[2]); printf("3: %d\n", result[3]); return 0;}
运算结果:

0: 331: 552: 773: 99

转载于:https://www.cnblogs.com/tigerisland/p/7564242.html

你可能感兴趣的文章
dutacm.club Water Problem(矩阵快速幂)
查看>>
深入JVM内核--GC算法和种类
查看>>
iOS的AssetsLibrary框架访问所有相片
查看>>
读书笔记三
查看>>
数论 - 最小乘法逆元
查看>>
企业架构研究总结(22)——TOGAF架构开发方法(ADM)之信息系统架构阶段
查看>>
接口测试(三)--HTTP协议简介
查看>>
周志华《机器学习》课后答案——第4章.决策树
查看>>
frameset分帧问题
查看>>
特殊样式:ime-mode禁汉字,tabindex焦点
查看>>
linux
查看>>
Layout父元素点击不到的解决办法
查看>>
【面试次体验】堆糖前端开发实习生
查看>>
基于apache实现负载均衡调度请求至后端tomcat服务器集群的实现
查看>>
C#+QQEmail自动发送邮件
查看>>
[Hadoop]MapReduce多输出
查看>>
Android Activity详解(一)
查看>>
快准车服完成3000万元A+轮融资,年底将开始B轮融资
查看>>
让我去健身的不是漂亮小姐姐,居然是贝叶斯统计!
查看>>
MySQL 数据约束
查看>>