如果没有检查生成的实际程序集,是否有任何方法可以确定OpenMP在特定用例中将使用哪些特定于平台的指令?
例如,我已经将pcmpeqq
,即64位整数字相等(SSE 4.1)识别为期望指令而不是pcmpeqd
,即32位字相等(SSE 2)。有没有办法知道OpenMP 4.0会产生前者而不是后者? (spec未涉及此类细节。)
答案 0 :(得分:3)
保证任何编译器都会发出特定汇编指令的唯一方法是对其进行硬编码。世界上没有规范限制编译器为给定语言特性生成特定指令。
话虽如此,如果在命令行中隐式或显式地指定对SSE4.1或更高版本的支持,如果许多编译器在后面的指令工作的情况下发出SSE2指令,那将会让我大吃一惊。
检查装配并不困难:
$ cat foo.c
#include <stdio.h>
int main(int argc, char **argv) {
const int n=128;
long x[n];
long y[n];
for (int i=0; i<n/2; i++) {
x[i] = y[i] = 1;
x[i+n/2] = 2;
y[i+n/2] = 2;
}
#pragma omp simd
for (int i=0; i<n; i++)
x[i] = (x[i] == y[i]);
for (int i=0; i<n; i++)
printf("%d: %ld\n", i, x[i]);
return 0;
}
$ icc -openmp -msse4.1 -o foo41.s foo.c -S -std=c99 -qopt-report-phase=vec -qopt-report=2
icc: remark #10397: optimization reports are generated in *.optrpt files in the output location
$ icc -openmp -msse2 -o foo2.s foo.c -S -std=c99 -qopt-report-phase=vec -qopt-report=2 -o foo2.s
icc: remark #10397: optimization reports are generated in *.optrpt files in the output location
果然:
$ grep pcmp foo41.s
pcmpeqq (%rax,%rsi,8), %xmm0 #18.25
$ grep pcmp foo2.s
pcmpeqd (%rax,%rsi,8), %xmm2 #18.25