我有配置:Intel(R)Core(TM)i7-4702MQ CPU(带Haswell架构),Windows 8,Intel C++ Compiller XE 13.0.我想用avx2优化运行我的程序并放置编译标志:
/ QaxCORE-AVX2,/ QxCORE-AVX2
但是当我运行程序时,我收到错误:
致命错误:此程序未构建为在您的系统中运行.请确认操作系统和处理器均支持Intel(R)AVX2,BMI,LZCNT,HLE,RTM和FMA指令.
我运行avx2 cpu支持测试,该测试在页面上给出:如何在第4代Intel Core处理器系列中检测新的指令支持.结果:
该CPU支持Haswell中引入的ISA扩展.
如何检查我的操作系统是否支持avx2-extensions以及可能导致错误的原因?为了使用avx2扩展,我需要设置两个/QaxCORE-AVX2和/QxCORE-AVX2标志?
upd:如果我设置了标志
/QxAVX
Run Code Online (Sandbox Code Playgroud)
该计划已成功启动.
有一个循环:
long a* = new long[32];
long b* = new long[32];
double c* = new double[32];
double d = 3.14159268;
//set a, b and c arrays
//.....
for(int i = 0; i < 32; i ++){
d+= (a[i] % b[i])/c[i];
}
Run Code Online (Sandbox Code Playgroud)
我如何使用英特尔 C++ 矢量化功能(例如#pragma simd 或 sse- 指令)来实现此周期?
如果我写:
#pragma simd reduction(+:c)
for(int i = 0; i < 32; i ++){
d+= (a[i] % b[i])/c[i];
}
Run Code Online (Sandbox Code Playgroud)
那么速度不会增加:(
有以下代码在不同的舍入模式下计算相同的表达式:
#include <iostream>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
#define SIZE 8
double foo(double * a, double * b){
double sum = 0.0;
for(unsigned int i = 0; i < SIZE; i++) {
sum+= b[i] / a[i];
}
return sum;
}
int main() {
double a[]={127, 131, 137, 139, 149, 151, 157, 163};
double b[SIZE];
for(unsigned int i = 0; i < SIZE; i++){
b[i] = i+1;
}
printf("to nearest: %.18f \n", foo(a, b));
fesetround(FE_TOWARDZERO);
printf("toward zero: %.18f \n", foo(a, …Run Code Online (Sandbox Code Playgroud)