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

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

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

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

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

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

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

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

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

浮点向量运算样例程序1:

/* 浮点向量运算 */#include 
#include
#include
using namespace std;int main(){ __m128 a; __m128 b; __m128 c; float op1[4] = {1.1, 2.2, 3.3, 4.4}; float op2[4] = {2.2, 3.3, 4.4, 5.5}; float result[4]; // Load a = _mm_load_ps(op1); b = _mm_load_ps(op2); // Calculate c = _mm_add_ps(a, b); // c = a + b // Store _mm_store_ps(result, c); printf("0: %lf\n", result[0]); printf("1: %lf\n", result[1]); printf("2: %lf\n", result[2]); printf("3: %lf\n", result[3]); return 0;}
运算结果:

0: 8.0000001: 6.0000002: 4.0000003: 2.000000
浮点向量运算样例程序2:

/* 浮点向量运算 */#include 
#include
#include
using namespace std;int main(){ __m128 a; __m128 b; __m128 c; float op1[4] = {1.1, 2.2, 3.3, 4.4}; float op2[4] = {2.2, 3.3, 4.4, 5.5}; float result[4]; // Load a = _mm_load_ps(op1); b = _mm_load_ps(op2); // Calculate c = _mm_add_ps(a, b); // c = a + b // Store _mm_store_ps(result, c); printf("0: %lf\n", result[0]); printf("1: %lf\n", result[1]); printf("2: %lf\n", result[2]); printf("3: %lf\n", result[3]); return 0;}
运算结果:

0: 3.3000001: 5.5000002: 7.7000003: 9.900000

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

你可能感兴趣的文章
用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
查看>>
wampserver 运行橙色,80端口没有被占用,查看错误日志方法
查看>>
Adwords Campaign network & placement
查看>>
java查询图片显示无图片显示项目默认图片
查看>>
page1201未完成
查看>>
oracle数据库命令-持续更新
查看>>
0106递归下降语意分析
查看>>
自动脚本工具新版 v2.0
查看>>
AngularJS理论基础
查看>>
WSTMart开源商城
查看>>
红黑树的性质
查看>>
Diablo 大菠萝
查看>>
AC 自动机
查看>>
float,double和decimal类型
查看>>
使用MapReduce实现一些经典的案例
查看>>
5 . 4 . 3 架构
查看>>
类静态和实例化执行顺序优先级(静态构造函数、静态变量、静态方法)
查看>>
【翻译】jQuery是有害的
查看>>
ajax提交param 后台接受是对象
查看>>
ajax基础一
查看>>