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


相关推荐

  • 图片加载失败替换图片解决方案

    图片加载失败替换图片解决方案图片加载失败在不同浏览器表现有差异,比如google可能会一片空白、img的宽高是0*0,ie会在图片位置会出现一个碎片图标,火狐会显示一个边框像这样:一个页面如果很多这种好难看,一般会用默认图片替换显示,解决方法:1、css方案:不好使。在img的伪类加替换图片,但火狐的img没有伪类,google有,有时候就算给img标签加了width、height也没有,图片加载失败img的宽高…

    2022年6月2日
    129
  • Edge breaker记录

    Edge breaker记录和代码相关性非常强的是这篇文章,几乎就是伪代码了:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.58.7918&rep=rep1&type=pdf一、Compression阶段命令参数为umbrellla_times4.offB第一个参数就是输入网格,目前支持OFF和OVTable两种文件格式,这里…

    2022年6月1日
    37
  • 文件上传linux文件名乱码_java导出文件名中文乱码

    文件上传linux文件名乱码_java导出文件名中文乱码从网上下了一个zip文件,unzip解压后发现中文显示都是乱码,以前也遇到过打开Windows系统下目录文件名也是乱码的问题。这是什么原因呢?文件是在Windows下创建的,而Windows的文件名中文编码默认GBK,Linux中默认文件名编码为UTF-8,编码不一致导致了文件名乱码的问题,解决这个问题需要对文件名进行转码,这个工具就是convmv。SYNOPSIS:convmv…

    2022年8月31日
    3
  • MyBatis-Plus 之逻辑删除

    MyBatis-Plus 之逻辑删除MyBatis-Plus之逻辑删除实现概念逻辑删除:文件没有被真正的删除,只不过是文件名的第一个字节被改成操作系统无法识别的字符,通常这种删除操作是可逆的,就是说用适当的工具或软件可以把删除的文件恢复出来。物理删除:指文件存储所用到的存储区域被真正的擦除或清零,这样删除的文件是不可以恢复的,物理删除是计算机处理数据时的一个概念。逻辑删除就是对要被删除的数据打上一个删除标记,在逻辑上,数据是被删除了,但数据本身依然存在!而物理删除则是把数据从介质上彻底删除掉。正文首先创建一个数据库表,如下图

    2022年5月20日
    46
  • Linux下文件系统监控神器Inotify

    Linux下文件系统监控神器Inotify

    2021年9月13日
    47
  • sql清空表数据命令

    sql清空表数据命令有三种清空方式:1.delete逐行删除表数据速度比较慢,不适合删除数据量大的表。2.truncate删除表中所有数据并且保留表结构,但是不能撤消还原。3.drop表数据和表结构一起删除,在实践过程中删除大数据量表数据。使用1,2这两种方法需要等待好久才能清空完成。有一个较快的方法是先导出表结构,首先对原先表进行删除,然后再重建。…

    2022年6月13日
    106

发表回复

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

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