OpenMP 支持
Clang 编译器中的 OpenMP 支持已完成!所有来自 3.1 版本标准 的预处理指令和子句都得到了完全支持,包括组合指令(例如 ‘#pragma omp parallel for’ 和 ‘#pragma omp parallel sections’)。 此外,还支持 OpenMP 4.0 的某些元素。这包括对 ‘#pragma omp simd’ 的“几乎完全”支持,以及对 ‘#pragma omp atomic’ 的完全支持(组合预处理指令和一些子句仍在缺失)。
OpenMP 使 Clang 用户能够充分利用现代多核处理器和向量单元的强大功能。来自 OpenMP 3.1 的预处理指令提供了一种行业标准的方式来使用任务并行,而 ‘#pragma omp simd’ 则是一种简单而灵活的方式来启用数据并行(也称为向量化)。
Clang 对 OpenMP 标准的实现依赖于 LLVM OpenMP 运行时库,该库可从 http://openmp.llvm.org/ 获取。该运行时支持 ARM® 架构处理器、PowerPC™ 处理器、32 位和 64 位 X86 处理器,并提供与 GCC 和 Intel 的现有 OpenMP 编译器的 ABI 兼容性。
要启用 OpenMP,只需添加 ‘-fopenmp’ 到命令行,并使用 ‘-I <omp.h 文件路径> -L <LLVM OpenMP 库路径>’ 提供 OpenMP 头文件和库的路径。
要运行编译后的程序,您可能还需要提供共享 OpenMP 库的路径
$ export LD_LIBRARY_PATH=<OpenMP 库路径>:$LD_LIBRARY_PATH
或$ export DYLD_LIBRARY_PATH=<OpenMP 库路径>:$DYLD_LIBRARY_PATH
在 Mac OS X 上。您可以尝试运行这个简单的并行 C 程序来确认编译器是否正常工作
#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
}
编译它(您应该不会看到任何错误或警告)
$ clang -fopenmp -I <omp.h 文件路径> -L <LLVM OpenMP 库路径> hello_openmp.c -o hello_openmp
并执行
$ export [DY]LD_LIBRARY_PATH=<OpenMP 库路径>:$[DY]LD_LIBRARY_PATH
$ ./hello_openmp
您将看到多个包含不同线程号的“Hello”行(请注意,这些行可能混合在一起)。如果您只看到一行,请尝试将环境变量 OMP_NUM_THREADS 设置为某个数字(例如 4),然后再次尝试。
希望您能够享受使用 OpenMP,并见证应用程序性能的显著提升!