大家好,又见面了,我是你们的朋友全栈君。
在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
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141797.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...