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


相关推荐

  • 出现将截断字符串或二进制数据怎么办_数据库从字符串转换日期失败

    出现将截断字符串或二进制数据怎么办_数据库从字符串转换日期失败原因是因为在数据库的表中进行了输入字符长度的限制,比如数据库表中的字段长度为5个varchar,而在前台的输入中超出了这个长度就会报这个错。出现此错的原因一般时:在进行数据测试时没有考虑数据的长度,只顾着测试方便乱输一通,稍有不慎就会多出一两个字节(我就是这种情况,在数据库中有一个表示状态的字段,是一个长度的int,但是我输入了双数)解决办法当然简单:只需要更改数据库中的字段长度或者在前台测试输…

    2022年10月7日
  • 进程和线程的深入理解

    进程和线程的深入理解进程和线程的深入理解,从抽象类比到与原理,阐述了两者的区别

    2022年7月25日
  • jquery获取select多选框选中的值

    jquery获取select多选框选中的值

    2021年11月8日
  • 6G要启动了! 6G究竟有多快?你真的应该提前知道

    点击上方蓝色字体,关注我们 写在前面 6G概念研究在今年启动。按照过去通信发展的规律推测,6G的理论下载速度可以达到每秒1TB,预计2020年将正式开始6G研发,2030年投入商用…

    2021年6月21日
  • c语言面试笔试题_c语言面试题库

    c语言面试笔试题_c语言面试题库121、为了避免嵌套的条件语句if-else的二义性,C语言规定:else与(B)匹配。A)缩排位置相同的ifB)其之前最近的ifC)其之后ifD)同一行上的if122、设i和x都是int类型,则对于for循环语句for(i=0,x=0;i<9;i++),下列哪句语正确(B)A)执行8次B)执行9次C)是无限循环D)循环体一次也不执行123、下面程序的运行结果是(C…

    2022年8月27日
  • 如何用正确的姿势发微信群通知?「建议收藏」

    如何用正确的姿势发微信群通知?「建议收藏」人数众多的微信群里,你如何管理通知发放进度?想不想使用更高效的办法发通知?本文推荐给你一款小程序,帮助你轻松搞定微信群通知。(由于微信公众号外部链接的限制,文中的部分链接可能无法正确打开。如有需要,请点击文末的“阅读原文”按钮,访问可以正常显示外链的版本。)两难微信群被用来发通知,其实是工具使用场景错位。因为微信并不是高效办公的工具。否则腾讯也就不必开发企业微信,和

    2022年5月19日

发表回复

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

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