在我们的 上一篇博文 关于visualstudio中改进的OpenMP支持,我们宣布添加 -openmp:llvm 切换到Visual Studio 2019版本16.9,以使编译的程序以LLVM的OpenMP运行库为目标,用于x64体系结构。此开关支持 -openmp接口 支持循环的并行无符号整数索引,以及下支持的SIMD指令的子集 -openmp:experimental . 它还启用了一些正确性修复。开始于 Visual Studio 2019版本16.10预览版2 ,的 -openmp:llvm 交换机现在适用于x86和arm64。我们还修复了16.10预览版3中的几个错误。
从VisualStudio2019版本16.10预览版2开始,除了X64支持之外,我们还添加了针对LLVM的OpenMP运行时库的支持 -openmp:llvm 对于x86和ARM64体系结构。编译 -openmp:llvm 将自动添加到libomp140.i386.dll(或下的libomp140d.i386.dll)的动态链接 /调试 )以x86或libomp140.aarch64.dll(或libomp140d.aarch64.dll)为目标时 /调试 )当瞄准ARM64时。您可以在visualstudio安装目录下的 VCRedistMSVC<version>debug_nonredist<arch>Microsoft.VC142.OpenMP.LLVM
.
作为提醒 -openmp:llvm 开关是实验性的,OpenMP 3.0的特性是随 -openmp:llvm visualstudio版本16.9中的开关仍然只支持附加的 -openmp:experimental visualstudio版本16.10中的标志,因此在16.10中提供了某些限制。特别地, #pragma omp任务 在x86或arm64上还不可用,在16.10版本的x64上只有有限的功能。最后,LLVM OpenMP运行时DLL的未来版本可能不向后兼容,并且这些DLL的当前版本不可再发行。
- 返回 平行区域内的语句现在发出一条有用的错误消息,因为它们是不一致的。下面的代码段以前会使用 编译器内部错误 .
#include <iostream> int main() { std::cout << "Hello World!"; #pragma omp parallel for schedule(dynamic) for (auto i = 0; i < 100; ++i) { // should issue error C3010: 'return': jump out of OpenMP structured block not allowed return -1; } return 0; }
- 这个 如果 子句现在为变量选择正确的范围。在下面的片段中,内部 如果 子句引用了外部共享变量 我 它的值为1,而不是内部私有变量 我 它的值为0,导致程序打印“嵌套”四次而不是一次。类似的修正也适用于 线程数 条款。
#include <stdio.h> #include <omp.h> int main(void) { int i = 1; int retVal = 0; #pragma omp parallel if(retVal) default(none) private(i) { printf("hello"); i = 0; #pragma omp parallel if(i) default(none) num_threads(4) { printf("nested"); } } return 0; }
截至16.10版本,目前支持的标准仍然是OpenMP 2.0,尽管我们已经做了一些改进并修复了一些长期存在的错误。我们已经开始了一个漫长的过程来支持更新版本的OpenMP标准。我们的目标是支持最新的OpenMP标准,这将一步一步地完成,新功能将利用LLVM的OpenMP运行时。OpenMP的下一步将是支持OpenMP 3.1标准中添加的附加功能。然后,我们将添加对openmp4.5标准中添加的pragma和子句的支持,这些pragma和子句不涉及卸载。之后先添加哪些功能将取决于您的反馈。我们很乐意听到您的具体OpenMP功能,您希望看到第一。
我们鼓励您在最新版本中尝试此更新 Visual Studio 2019版本16.10预览版 . 如果在使用 -openmp:llvm visualstudio附带的libomp140 dll中的开关或错误,请告诉我们。我们可以通过下面的评论和twitter联系到我们( @视觉 ),或通过 开发者社区 .