知道 OpenMP 4.0 会产生啥 SIMD 指令吗?

Posted

技术标签:

【中文标题】知道 OpenMP 4.0 会产生啥 SIMD 指令吗?【英文标题】:Knowing what SIMD instructions OpenMP 4.0 will produce?知道 OpenMP 4.0 会产生什么 SIMD 指令吗? 【发布时间】:2015-04-04 06:07:40 【问题描述】:

除了检查实际生成的程序集之外,是否有任何方法可以确定 OpenMP 将针对给定用例使用哪些特定于平台的指令?

例如,我已将 pcmpeqq 即 64 位整数字相等 (SSE 4.1) 确定为理想指令,而不是 pcmpeqd 即 32 位字相等 (SSE 2)。有没有办法知道 OpenMP 4.0 会产生前者而不是后者? (spec 不涉及此类细节。)

【问题讨论】:

【参考方案1】:

保证任何编译器都会发出特定汇编指令的唯一方法是对其进行硬编码。世界上没有规范限制编译器为给定的语言功能生成特定指令。

话虽如此,如果在命令行上隐式或显式指定对 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

【讨论】:

以上是关于知道 OpenMP 4.0 会产生啥 SIMD 指令吗?的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 为内联函数声明 SIMD

嵌套循环的 OpenMP SIMD 矢量化

使用 Rcpp 和 OpenMP 在 R 中多线程和 SIMD 矢量化 Mandelbrot

使用 OpenMP 4.0 (gcc 4.8.4) 而不是 OpenMP 3.1 (gcc 4.9.2) 时速度会降低

Study Notes: OpenMP gramma and notes

GCC 中的 OpenMP 4.0:卸载到 nVidia GPU