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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • OleDbDataAdapter具体使用

    OleDbDataAdapter具体使用usingSystem usingSystem Collections Generic usingSystem ComponentMod usingSystem Data usingSystem Data OleDb usingSystem Data SqlClient usingSystem Drawing usingSystem Linq usingSys

    2025年12月6日
    4
  • Oracle与Sql Server复制表结构和数据

    Oracle与Sql Server复制表结构和数据

    2022年1月10日
    52
  • 手机看片神器地址_给我一个可以手机看片的

    手机看片神器地址_给我一个可以手机看片的你是不是想找可以免费在线看电影电视剧的网站,但总是找不到可以正常使用的影视网站。其实要想找可以手机免费看片的电影网站,直接找一些优质的导航网站即可,这些导航网站收录了大量的精品影视资源网站。如果你是自己网上查找,会经常搜到一些假的点网站,个别好用的还经常会失效。而导航网站一般都会筛选测试好用的手机在线看片电影网站,并且会不断的更新完善。推荐两个可以免费手机看片神器电影网址导航网站1.办公人导航办公人导航网是一个实用的办公生活导航网站,收录了大量的办公相关的精品站点。在办公人导航网的影视网站栏目,.

    2025年12月4日
    6
  • ftp工具哪个好用_iis搭建ftp服务器

    ftp工具哪个好用_iis搭建ftp服务器相信很多网友都听说过ftp扫描工具,但是却对其不是很了解,ftp扫描工具是一种ftp账号软件,用户可在ftp扫描工具的帮助下轻松对网站地址进行扫描,从而采集到账号密码、网站收录等多种信息。在对ftp扫描工具做了大概了解之后,小编带大家解读ftp扫描工具如何使用?一、ftp客户端ftp客户端推荐使用iis7服务器管理工具,可以批量管理ftp站点。它是一款服务于windows及linux系统的批量管理工具,同时也是ftp及vnc的客户端。下载地址:http://yczm.iis7.com/?ccxd二

    2022年10月1日
    2
  • Django(76)isort工具对import导入进行排序

    Django(76)isort工具对import导入进行排序前言我们在开发项目时经常会进行导包有import*格式的,还有from*import*格式的,最后就会显示的很乱,那么有没有什么工具能对导包进行一键排序呢?答案是有的,使用isort工具i

    2022年7月30日
    9
  • mysql储存过程怎么写_oracle的存储过程写法

    mysql储存过程怎么写_oracle的存储过程写法存储过程写法是什么存储过程的写作是什么,存储过程的编写如下:1.用代码[创建进程名]创建一个存储过程;2.用[EXECSP_NAME]代码调用存储过程。操作环境:Windows7系统,微软visualc2015版本,戴尔G3电脑。存储过程写法是:1、创建存储过程创建过程sp_name@[参数名][类型],@[参数名][类型]作为开始..结束以上格式也可以缩写为:创建进程sp_nam…

    2025年6月22日
    3

发表回复

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

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