一点OpenMP *运行时

2021-02-09 20:13:36

LOMP是Little OpenMP(运行时)的缩写,是一种小的OpenMP运行时实现,可用于教学或原型制作。目前,它仅为CPU实现了OpenMP应用程序编程接口的一小部分(即,它不支持目标设备的卸载,并且缺少许多仅CPU功能)。

该库使用与clang / LLVM *相同的二进制接口,并且与使用该接口的多个编译器兼容。除非您使用LOMP当前不支持的功能,否则LOMP可以用作兼容编译器的本机OpenMP运行时库的替代品,而无需重新编译应用程序。

运行时大部分是用C ++ 14编写的,尽管具有C ++ 17的某些功能,并且可以针对各种不同的体系结构进行编译。运行时中没有汇编程序文件,并且内联汇编的使用仅限于某些功能(例如读取高分辨率时钟)。对于没有代码路径通过内联汇编访问高分辨率时钟的体系结构,我们依靠C ++功能来测量时间。通过std :: atomic都可以访问原子操作。

除了运行时的来源外,还有一些微基准测试和一些(极其少量的)健全性测试。

顾名思义,LOMP库明显小于生产LLVM OpenMP运行时库。首次签入时,源目录中的cloc实用程序在6,000行C ++代码下显示(并且没有汇编代码)。为了进行比较,在库的CPU部分中,生产LLVM OpenMP运行时具有大约63,500行C / C ++代码和1400行汇编代码。当然,这是不公平的比较,因为LOMP缺少生产运行时支持的许多功能,但是它确实表明,如果您要在某个地方进行实验,或者要设置一个学生项目的环境,则LOMP可能会更容易工作的代码库!

LOMP运行时支持以下目标体系结构(在括号中,我们显示了uname命令报告的体系结构名称):

不完全支持基于ARM的Apple * Mac(由LLVM编译器错误阻止)。

LOMP支持的语言仅限于OpenMP API的一小部分,用于共享内存多线程。支持的OpenMP功能包括

omp_set_num_threads(),但仅在初始化运行时之前执行或设置与已使用的相同值时;

由于这是一个较小且相对简单的运行时(至少到目前为止),因此几乎没有限制,许多事情尚未实现。 A,可能不完整,清单为:

解析许多OpenMP要求的环境变量(超出OMP_NUM_THREADS),并支持它们相关的内部控制变量;

当然,运行时还受到编译器可以支持的语言的限制。因此,有些OpenMP 5.1功能尚未实现,因为尚无编译器支持。

关于如何在系统上设置LOMP,以下是一些希望有用的说明。这些说明不附带任何保证,并且可能是错误的或不完整的。

其他版本的软件工具也可以使用,但我们尚未使用我们的代码对其进行测试。

尽管LOMP库本身可以通过GNU编译器集合(GCC)很好地进行编译,但我们尚未实现GCC对其OpenMP支持所需的所有入口点。因此,尽管您可以使用GCC编译LOMP运行时代码,但仍需要与clang兼容的编译器来生成代码以使用已构建的LOMP库。

构建LOMP遵循构建基于CMake的项目的通常过程,以下是所需步骤:

转到该新目录并在其中运行cmake(在执行此操作之前,请检查下面的CMake配置选项部分;您可能需要添加一些选项来设置适当的编译器)。 cd lomp_build cmake ../lomp

$ ./examples/hello_world平行区域之前======================================你好世界:我是线程6,我的秘密是42.000000和21Hello World:我是线程4,我的秘密是42.000000和21Hello World:我是线程1,我的秘密是42.000000和21Hello World:我是线程2,我的秘密是42.000000和21Hello World:我是线程0,我的秘密是42.000000和21Hello World:我是线程5,我的秘密是42.000000和21Hello World:我是线程3,我的秘密是42.000000和21Hello World:我是线程3线程7,我的秘密是42.000000和21 =======================================之后平行区域

您还可以使用以下命令运行(微型)测试套件(请注意,v0.1的一些失败测试除外):

要将LOMP与现有代码一起使用,一旦构建了库,就应该能够在Linux上使用LD_LIBRARY_PATH(在MacOS上使用DYLD_LIBRARY_PATH)将其目录放置在生产OpenMP库所在的系统之前,从而无需重新编译即可使用LOMP。您的可执行文件。如果还设置LOMP_DEBUG = 1,则应该看到一些输出,证明您正在使用所需的库。 (当然,Linux上的ldd命令也可以向您显示。)

如果使用支持的OpenMP编译器之一编译LOMP随附的Hello World示例,并且如果LOMP已在$ HOME / build_lomp中进行编译,则以下内容将动态将LOMP绑定到已编译的代码:

$ export LD_LIBRARY_PATH = $ HOME / build_lomp / src /:$ LD_LIBRARY_PATH $ LOMP_DEBUG = 1 OMP_NUM_THREADS = 4 ./a.out在并行区域之前===================== ================= LOMP:运行时版本0.1(SO版本1)于2021年1月28日在19:26:59从LLVM:11:0通过Git commit 0abcdef for x86_64编译: 0 LOMP:使用配置-mrtm; -mcx16; DEBUG = 10; LOMP_GNU_SUPPORT = 1; LOMP_HAVE_RTM = 1; LOMP_HAVE_CMPXCHG16B = 1你好世界:我是线程1,我的秘密是42.000000和21你好世界:我是线程2,我的秘密是42.000000和21Hello World:我是线程0,我的秘密是42.000000和21Hello World:我是线程3,我的秘密是42.000000和21我=> ================== ====================平行区域后

通过使用export语句,对于从此Shell启动的进程,将LOMP设置为默认的OpenMPruntime。如果您不想这样做,请记住要重置LD_LIBRARY_PATH。

-DCMAKE_C_COMPILER = xyz:将C编译器设置为xyz,GNU CompilerCollection(GCC)是大多数系统上的默认值,但是我们需要clang。 (如果路径中有clang,则可以使用-DCMAKE_C_COMPILER = clang)。

-DCMAKE_CXX_COMPILER = xyz:将C ++编译器设置为xyz,GCC的g ++是大多数系统上的默认值,但是我们需要clang ++。 (如果您的路径中包含clang ++,则可以使用-DCMAKE_CXX_COMPILER = clang ++。)

-DLOMP_MICROBM_WITH_LOMP = [on | off]:on将微基准与LOMP链接,off将其与所使用的编译器的本机OpenMP运行时链接;默认为关闭。

-DCMAKE_BUILD_TYPE = [发布|调试| relwithdebinfo]:发行版本经过优化;在没有优化的情况下使用调试信息进行调试构建; relwithdebinfo使用优化和调试信息进行构建。默认值为release。

-DLOMP_GNU_SUPPORT = [on | off]:为libgomp构建GCC入口点; off不会建立这些入口点;默认为关闭。因为大多数这些入口点尚未实现,所以此选项很勇敢,可能会产生错误。

-DLOMP_ICC_SUPPORT = [on | off]:on为英特尔经典编译器构建入口点,off不构建这些入口点;默认为关闭。由于大多数这些入口点尚未实现,因此该选项非常勇敢,可能会产生错误。

-DLOMP_WARN_ARCH_FEATURES = [on | off]:如果虚拟功能用于不受​​支持的体系结构功能,则on会发出警告;关闭不是;默认为打开。

OMP_SCHEDULE:为使用运行时调度程序编译的循环设置循环调度程序,有关详细信息,请参见OpenMP规范。

LOMP_LOCK_KIND:此环境变量控制LOMP用于OpenMP锁的锁实现。默认是使用C ++ std :: mutexlock。它支持的值是:pthread:使用pthread_mutex(这要求C ++ std :: thread实现基于pthread,在所有平台上可能并非如此)。

投机性:使用在内部使用TTAS作为后备锁的投机锁(这需要硬件中的投机执行支持)。

LOMP_BARRIER_KIND:控制使用LOMP' barbaror动物园中的哪个屏障实现。这里有太多要列出的内容,因此"使用消息来源Luke!"

LOMP_DEBUG:启用打印调试消息。级别越高,屏幕上显示的调试输出越多,数字越大,启用数字越小。有用的级别是:

LOMP_TRACE:启用LOMP的内部跟踪工具,将调试级别设置为为LOMP_TRACE指定的值。有关支持的级别,请参见LOMP_DEBUG。

请注意,在调试库时,通常方便的是更改调试标记的顺序,以便仅从感兴趣的子系统中打印信息,因此LOMP_DEBUG的值可能会随时间变化。

微型基准位于microBM目录中。这些用于测量书中显示的硬件属性。您可以使用它们来衡量自己计算机的属性。每个基准可以通过适当的Python脚本调用,该脚本将运行所有可用的度量,也可以运行您请求的度量并编写包含结果的适当命名的文件。

要使用脚本,请确保当前目录是适当构建中的microBM目录,然后从microBM源目录执行相关的Python脚本,例如

$ cd lomp_build / microBM $ python〜/ lomp / microBM / runAtomics.py Arch(可能是错误的!):模型:核心:8运行OMP_NUM_THREADS = 8 KMP_HW_SUBSET = 1T KMP_AFFINITY =' compact,granularity = fine' ./atomics即> AtomicsIe_Mac-mini_2021-01-28_1.res ./atomics即........运行OMP_NUM_THREADS = 8 KMP_HW_SUBSET = 1T KMP_AFFINITY ='紧凑,粒度= fine' ./atomics如果> AtomicsIf_Mac-mini_2021-01-28_1.res ./atomics如果........运行OMP_NUM_THREADS = 8 KMP_HW_SUBSET = 1T KMP_AFFINITY =&compact,granularity = fine' ./atomics Ii> AtomicsIi_Mac-mini_2021-01-28_1.res ./atomics Ii ........运行OMP_NUM_THREADS = 8 KMP_HW_SUBSET = 1T KMP_AFFINITY ='紧凑,粒度= fine' ./atomics它> AtomicsIt_Mac-mini_2021-01-28_1.res ./atomics It ........ $

通过使用scripts目录中的plot.py脚本,可以将输出文件转换为包含制表结果和图表的网页,并为各种特定的度量提供各种文件,并且还应易于阅读。如果您迫切需要使用电子表格,脚本目录中的toCSV.pyscript会将它们转换为逗号分隔的文件格式,可以将其读入您遇到的任何电子表格中。

请通过填写提供的问题模板,通过GitHub问题提交错误报告或其他反馈。

欢迎贡献,也欢迎其他反馈。 我们希望此运行时将为试验新的OpenMP功能(例如不同的循环计划或barrierimplementation)提供有用的环境,同时保持足够的简单性以使其易于在大学课程中使用。 如果您想做出贡献(为了成名和荣耀),请分叉存储库,并提交您要进行更改的请求请求 LOMP运行时已根据"获得许可。 带有LLVMexceptions"许可证的Apache 2.0许可证。 任何捐款都必须使用该许可才能被接受。 如果您在研究中使用LOMP并发表论文,请在引用中使用以下内容: 商标和注册名称在我们初次认可时就用星号(*)标记。 其他名称和商标可能是其他人的财产。