5

このコードを取ると

#include <cmath>

void compute_sqrt(const double* x, double* y, int n) {
  int i;
#pragma omp simd linear(i)
  for (i=0; i<n; ++i) {
    y[i] = std::sqrt(x[i]);
  }
}

でコンパイルするとg++ -S -c -O3 -fopenmp-simd -march=cascadelake、ループで次のような命令が得られます ( compiler-explorer )

...
  vsqrtsd %xmm0, %xmm0, %xmm0
...

XMM は 128 ビット レジスタですが、cascadelake は avx-512 をサポートしています。gcc で 256 (YMM) または 512 ビット (ZMM) レジスタを使用する方法はありますか?

比較すると、ICC はデフォルトで cascadelake に 256 個のレジスタを使用icc -c -S -O3 -march=cascadelake -qopenmp-simdます。

...
  vsqrtpd 32(%rdi,%r9,8), %ymm1 #7.12
...

-qopt-zmm-usage=highまた、 512 ビット レジスタを使用するオプションを追加できます( compiler-explorer ) 。

...
  vrsqrt14pd %zmm4, %zmm1 #7.12
...
4

2 に答える 2