为了并行化我的基于数组的代码,我试图弄清楚如何利用英特尔AVX内在函数在大型数组上执行并行操作.
从我已经阅读的文档中可以看出,256位AVX向量将支持多达8个并行32位整数/ 32位浮点数或最多4个并行64位双精度数.浮动部分没有给我任何问题,工作正常,但整数AVX函数让我头疼,让我用以下代码来演示:
命令行选项-mavx与符合AVX的Intel处理器一起使用.我不会使用AVX2功能.编译将在Ubuntu 16.04上使用GNU99 C完成.
AVX FP:
#include <stdio.h>
#include <stdlib.h>
#include <immintrin.h>
int main()
{
float data[8] = {1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f};
__m256 points = _mm256_loadu_ps(&data[0]);
for(int i = 0; i < 8; i++)
printf("%f\n",points[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
Run Code Online (Sandbox Code Playgroud)
这完全是应该的,但是当使用整数加载AVX函数时不是这种情况:
AVX INT:
#include <stdio.h>
#include <stdlib.h>
#include <immintrin.h>
int main()
{
int data[8] = {1,2,3,4,5,6,7,8};
__m256i points = _mm256_loadu_si256((__m256i *)&data[0]);
for(int i = 0; i < 8; i++)
printf("%d\n",points[i]);
return 0; …
Run Code Online (Sandbox Code Playgroud)