AVX2浮点向量运算[通俗易懂]

AVX2浮点向量运算[通俗易懂]在C/C++程序中,使用AVX2指令有很多种方法。嵌入汇编是一般的方法,但是对于不熟悉汇编语言的人来说,有点勉为其难。gcc编译支持AVX2指令的编程。程序中需要使用头文件和,这样通过调用其中定义的一些函数,达到使用AVX2指令的目的,即用C/C++调用SIMD指令(单指令多数据)。这里给出的样例程序是有关浮点向量运算的例子。其中函数_mm_add_ps()实现的是浮点向量(4个数

大家好,又见面了,我是你们的朋友全栈君。

在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 <iostream>
#include <immintrin.h>
#include <avx2intrin.h>

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.000000
1: 6.000000
2: 4.000000
3: 2.000000

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

/* 浮点向量运算 */

#include <iostream>
#include <immintrin.h>
#include <avx2intrin.h>

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.300000
1: 5.500000
2: 7.700000
3: 9.900000
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139262.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux history 历史命令行查询和使用

    linux history 历史命令行查询和使用history命令:用于显示历史记录和执行过的指令命令,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2。history命令:是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。默认是不显示命令的执行时间,命令的执行时间,history已经记录,只是没有显示。注:如想查询某个用户在系统上执行了什么命令,可以使用root用户身份登录系统,检查Hom…

  • lede旁路由作用,【旁路由】LEDE/OpenWrt作为旁路由辅助网关(目前最优解)OpenWrt网关旁路由设置…

    lede旁路由作用,【旁路由】LEDE/OpenWrt作为旁路由辅助网关(目前最优解)OpenWrt网关旁路由设置…主路由一般安装爱快或者ROS,主要负责PPPOE拨号、实现多拨、流控、宽带叠加等功能,辅路由一般安装OpenWrt用于实现去广告、网易云音乐听歌等功能。旁路由一般选择单网口的设备安装OpenWrt,也可以使用群晖主机虚拟一个OpenWrt软路由。主路由:192.168.10.1旁路由:192.168.10.200第一步:设置OpenWrt旁路由1、登录OpenWrt后台,关闭DHCP,DHCP由主…

  • fileinput.js php,fileinput

    fileinput.js php,fileinput$(“#uploadfile”).fileinput({theme:’explorer-fa’,uploadUrl:upload_url+”?catalog=9″,language:’zh’,overwriteInitial:false,initialPreviewAsData:true,maxFileCount:3,initialPreview:pics,initialPrev…

  • 常见的图像增强方法有_图像中值滤波的算法实现

    常见的图像增强方法有_图像中值滤波的算法实现1.对比度拉升采用了线性函数对图像的灰度值进行变换2.Gamma校正采用了非线性函数(指数函数)对图像的灰度值进行变换这两种方式的实质是对感兴趣的图像区域进行展宽,对不感兴趣的背景区域进行

  • C语言背包问题的算法(附完整源码)

    C语言背包问题的算法(附完整源码)C语言背包问题的算法背包问题引出C语言背包问题的算法完整源码(定义,实现,main函数测试)背包问题引出想象你是一个小偷,你想从房间里偷东西。您有一个可以处理最大重量W的背包,并且您想把它装满它的价值是最大的。作为一个聪明的小偷,您知道房间里每个物品的重量和价值。您将如何填充背包,从而使容量为W的背包得到最大可能的值。C语言背包问题的算法完整源码(定义,实现,main函数测试)#include<iostream>#include<vector>intmax

  • mycat如何实现读写分离_数据库读写分离中间件

    mycat如何实现读写分离_数据库读写分离中间件前言众所周知,随着用户量的增多,数据库操作往往会成为一个系统的瓶颈所在,而且一般的系统“读”的压力远远大于“写”,因此我们可以通过实现数据库的读写分离来提高系统的性能。基础知识要实现读写分离,就要解决主从数据库数据同步的问题,在主数据库写入数据后要保证从数据库的数据也要更新。实现思路一个主数据库用来写数据,一个或多个从数据库用来读数据,将主数据库的数据同步到从数据库中。一,主从同步的原理主服务器master记录数据库操作日志到Binarylog,从服务器开启i/o线程将二进制日志记录的

    2022年10月13日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号