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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • xshell连接虚拟机ssh服务器拒绝了密码_finalshell连接不上虚拟机centos

    xshell连接虚拟机ssh服务器拒绝了密码_finalshell连接不上虚拟机centos以下来自博客:xshell连接虚拟机Connectionfailed-金虹巴巴-博客园(cnblogs.com)一、问题描述:xshell连接不了虚拟机,出现错误提示:Couldnotconnectto’192.168.1.100′(port22):Connectionfailed.二、查找错误原因:1、登录虚拟机,打开终端,切换到root用户,输入systemctlstartsshd.service看能否开启sshd服务,提示开启失败,输入system.

    2022年9月22日
    4
  • pycharm2021.10激活码 Ubuntu_在线激活

    (pycharm2021.10激活码 Ubuntu)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年3月28日
    176
  • Python基础知识总结[通俗易懂]

    Python基础知识总结[通俗易懂]一、Python的优缺点优点:1.简单,易学,免费,开源2.高级语言,解释型语言3.可移植性,可拓展性,可读性4.面向对象,丰富的库缺点:1.执行效率慢2.GIL锁限制并发

    2022年7月5日
    23
  • fsd开机启动_怎么取消开机自动启动软件

    fsd开机启动_怎么取消开机自动启动软件一、vi/etc/rc.d/rc.local添加:/usr/local/nginx/sbin/nginx/usr/bin/fdfs_trackerd/etc/fdfs/tracker.confrestart/usr/bin/fdfs_storaged/etc/fdfs/storage.confrestart二、给rc.local赋可执行权限chmo…

    2022年10月19日
    2
  • java uniqueresult_「uniqueresult」hibernate uniqueResult方法 – seo实验室[通俗易懂]

    java uniqueresult_「uniqueresult」hibernate uniqueResult方法 – seo实验室[通俗易懂]uniqueresult数据库中根据你的查询条件只会返回唯一结果,就可以用uniqueresult这个方法!否则就用list();其返回类型为ObjectuniqueResult()方法通常是在业务方法查询语句中用到的,比如(Usersroles)getsession().createQuery(“selecturfromUsersRolesurwhereur.role.id=?…

    2025年10月25日
    3
  • InetAddress 解析

    InetAddress 解析IP地址分为IPv4和IPv6。IPv44字节长的ip称为IPv4.目前大部分ip都是IPv4。IPv4地址一般写为四哥无符号的字节,每个字节范围从0到255,最高字节在前面。为方便人们查看,各字节用点号分割。例如:192.168.1.100.这称为点分四段格式。IPv616字节长的ip成为IPv6.IPv6地址通常些微冒号分割的8个区块,每个区块4个十六进制数字。例如:2400:c

    2022年6月23日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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