PGI 上 OpenMP 目标指令的结果
Results of OpenMP target directives on PGI
我正在使用 PGI 编译以下程序,该程序使用 OpenMP 的目标指令将工作卸载到 GPU:
#include <iostream>
#include <cmath>
int main(){
const int SIZE = 400000;
double *m;
m = new double[SIZE];
#pragma omp target teams distribute parallel for
for(int i=0;i<SIZE;i++)
m[i] = std::sin((double)i);
for(int i=0;i<SIZE;i++)
std::cout<<m[i]<<"\n";
}
我的编译字符串如下:
pgc++ -omp -ta=tesla,pinned,cc60 -Minfo=accel -fast test2.cpp
编译成功,但它缺少我使用 OpenACC 获得的一系列输出,这些输出告诉我编译器实际对指令做了什么,如下所示:
main:
8, Accelerator kernel generated
Generating Tesla code
11, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
8, Generating implicit copyout(m[:400000])
如何获取 OpenMP 的类似信息? -Minfo
本身似乎没有产生任何有用的东西。
“-Minfo”(与“-Minfo=all”相同)或“-Minfo=mp”将为您提供 OpenMP 编译的编译器反馈消息。
不过,PGI 仅支持 OpenMP 4.5 指令与我们的 LLVM 后端编译器。默认情况下,这些在基于 IBM Power 的系统上可用,或者作为我们在 x86 上的 LLVM beta 编译器的一部分。 x86 测试版编译器可在 http://www.pgroup.com/support/download_llvm.php 找到,但需要专业版许可证。
此外,我们当前的 OpenMP 4.5 仅针对多核 CPU。我们也在致力于 GPU 目标卸载,但暂时不会提供此支持。
我正在使用 PGI 编译以下程序,该程序使用 OpenMP 的目标指令将工作卸载到 GPU:
#include <iostream>
#include <cmath>
int main(){
const int SIZE = 400000;
double *m;
m = new double[SIZE];
#pragma omp target teams distribute parallel for
for(int i=0;i<SIZE;i++)
m[i] = std::sin((double)i);
for(int i=0;i<SIZE;i++)
std::cout<<m[i]<<"\n";
}
我的编译字符串如下:
pgc++ -omp -ta=tesla,pinned,cc60 -Minfo=accel -fast test2.cpp
编译成功,但它缺少我使用 OpenACC 获得的一系列输出,这些输出告诉我编译器实际对指令做了什么,如下所示:
main:
8, Accelerator kernel generated
Generating Tesla code
11, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
8, Generating implicit copyout(m[:400000])
如何获取 OpenMP 的类似信息? -Minfo
本身似乎没有产生任何有用的东西。
“-Minfo”(与“-Minfo=all”相同)或“-Minfo=mp”将为您提供 OpenMP 编译的编译器反馈消息。
不过,PGI 仅支持 OpenMP 4.5 指令与我们的 LLVM 后端编译器。默认情况下,这些在基于 IBM Power 的系统上可用,或者作为我们在 x86 上的 LLVM beta 编译器的一部分。 x86 测试版编译器可在 http://www.pgroup.com/support/download_llvm.php 找到,但需要专业版许可证。
此外,我们当前的 OpenMP 4.5 仅针对多核 CPU。我们也在致力于 GPU 目标卸载,但暂时不会提供此支持。