如何生成非时间指令?

rni*_*ckb 11 c++ x86 gcc clang icc

Intel 的编译器有一个编译指示,可用于生成非临时存储。例如,我可以写

void square(const double* x, double* y, int n) {
#pragma vector nontemporal
  for (int i=0; i<n; ++i) {
    y[i] = x[i] * x[i];
  }
}

Run Code Online (Sandbox Code Playgroud)

和ICC会产生这样的指令这样(编译器,资源管理器)

...
  vmovntpd %ymm1, (%rsi,%r9,8) #4.5
...
Run Code Online (Sandbox Code Playgroud)

gcc 和 clang 有什么类似的吗?(内在函数除外)

非临时存储使代码更快。使用这个基准

...
  vmovntpd %ymm1, (%rsi,%r9,8) #4.5
...
Run Code Online (Sandbox Code Playgroud)

非时间代码在我的机器上运行速度几乎是它的两倍。以下是完整结果:

国际刑事法院:

> icc -O3 -march=native -std=c++11 benchmark.cpp -lbenchmark -lbenchmark_main
> ./a.out
------------------------------------------------------------
Benchmark                  Time             CPU   Iterations
------------------------------------------------------------
BM_Square/1000000     430889 ns       430889 ns         1372
Run Code Online (Sandbox Code Playgroud)

铛:

> clang++ -O3 -march=native -std=c++11 benchmark.cpp -lbenchmark -lbenchmark_main
> ./a.out
------------------------------------------------------------
Benchmark                  Time             CPU   Iterations
------------------------------------------------------------
BM_Square/1000000     781672 ns       781470 ns          820
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会:

> g++-mp-10 -O3 -march=native -std=c++11 benchmark.cpp -lbenchmark -lbenchmark_main
> ./a.out
------------------------------------------------------------
Benchmark                  Time             CPU   Iterations
------------------------------------------------------------
BM_Square/1000000     681684 ns       681533 ns          782
Run Code Online (Sandbox Code Playgroud)

注意:clang 有__builtin_nontemporal_store;但是当我尝试时,它不会生成非时间指令(编译器资源管理器