AVX2整数向量运算「建议收藏」

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

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

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

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

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

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

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

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

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

整数向量运算样例程序一:

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

using namespace std;

int main()
{
    __m128i x = _mm_set_epi32(1, 2, 3, 4);
    __m128i y = _mm_set_epi32(1, 2, 3, 4);

    __m128i z = _mm_add_epi32(x, y);
    int* pi;
    pi = (int*)(&z);

    printf("0: %d\n", *pi);
    printf("1: %d\n", *(pi+1));
    printf("2: %d\n", *(pi+2));
    printf("3: %d\n", *(pi+3));

    return 0;
}

运算结果:

0: 8
1: 6
2: 4
3: 2

整数向量运算样例程序二:

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

using namespace std;

int main()
{
    __m128i x;
    __m128i y;
    __m128i z;

    int op1[4] = {11, 22, 33, 44};
    int op2[4] = {22, 33, 44, 55};
    int result[4];

    // Load
    x = _mm_loadu_si128((__m128i*)op1);
    y = _mm_load_si128((__m128i*)op2);

    // Calculate
    z = _mm_add_epi32(x, y);   // z = x + y

    // Store
    _mm_store_si128((__m128i*)result, z);

    printf("0: %d\n", result[0]);
    printf("1: %d\n", result[1]);
    printf("2: %d\n", result[2]);
    printf("3: %d\n", result[3]);

    return 0;
}

运算结果:

0: 33
1: 55
2: 77
3: 99

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

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

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


相关推荐

  • SecureCRT中文乱码解决方法

    SecureCRT中文乱码解决方法SecureCRT中文乱码解决方法1、先选中当前的Session地址2、然后点击SercureCRT上排主菜单的“Options”,也就是“选项”的意思3、点击Options之后,会出现一个下拉列表,我们选择第一个“SessionOptions…”4、接着会出现一个弹出框,选择目录中的“Appearance”,该功能可以对SercureCRT的外观进行设置5、此时可以看到SercureCRT的编码格式是“Default”,也就是默认的编码格式,我们改为“UTF-8”6、改完编码格式之后,我们回

    2022年7月17日
    14
  • mysql前缀索引及其选择「建议收藏」

    mysql前缀索引及其选择「建议收藏」有时候需要索引很长的字符列,比如BLOB、TEXT或者很长的VARCHAR类型的列,通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。

    2022年5月23日
    36
  • 通过select 和状态EINPROGRESS 实现socket 连接超时判断

    通过select 和状态EINPROGRESS 实现socket 连接超时判断调用connect连接一般的超时时间是75s,但是在程序中我们一般不希望等这么长时间采取采取动作。可以在调用connect之前设置套接字非阻塞,然后调用connect,此时connect会立刻返回,如果连接成功则直接返回0(成功),如果没有连接成功,也会立即返回并且会设置errno为EINPROCESS,这并不是一个致命错误,仅仅是告知你已经在连接了,你只要判断是它就继续执行后面的逻辑就行

    2022年7月17日
    19
  • 画中画广告..例

    画中画广告..例<!–画中画广告开始–><tableborder=0cellspacing=0cellpadding=0align=left><tr><td&gt

    2022年7月1日
    23
  • RST文件打开_rpt文件

    RST文件打开_rpt文件RST与Python类似Javadoc与Java,如果下载了别人的Python源码,里面有rst文件夹,我们可以转为html后用浏览器打开,具体为:安装python的sphinx模块:pipinstallsphinx,我装的anaconda,其中已经有了,那么在cmd中进入rst的父文件夹,输入:sphinx-build-bhtmldocbuilddoc是含有rst

    2022年10月1日
    3
  • Gradle教程「建议收藏」

    Gradle教程「建议收藏」1.简介在本课程中,我们将学习Gradle,它是一个构建工具和一个依赖管理系统,与Maven和Ant非常相似,并且专门用于构建基于Java的项目。与Maven和Ant构建系统不同,Gradle不使用XML。它实际上是基于Groovy构建在DSL中的。与基于XML的其他构建系统相比,基于Groovy的Gradle脚本的最大优势是可以使构建脚本更小,更简洁。就像Maven构建文件…

    2022年6月28日
    34

发表回复

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

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