在C++代码中使用回调启用OpenMP工具

yacmzcpb  于 2023-03-25  发布在  其他
关注(0)|答案(1)|浏览(160)

我正在开发一个小的OpenMP工具库,它允许我利用OpenMP回调。这个库完全用C编写。我可以编译它并将其链接到我的用户代码中。为了编译库,我在Makefile中使用以下命令:

CC     = clang
CFLAGS =-O3 -fopenmp
LDLIBS =-lomp

libompt.so: counter.c ompt.c
        $(CC) $(CFLAGS) -shared -fPIC $^ -o $@

为了静态或动态地编译我的小例子,我在Makefile中有这些目标:

test_daxpy_sta: counter.c ompt.c daxpy.c test_daxpy.c
        $(CC) $(CFLAGS) $(LDLIBS) $^ -o $@

test_daxpy_dyn: daxpy.c test_daxpy.c libompt.so
        $(CC) $(CFLAGS) -L. -lompt $(LDLIBS) $^ -o $@

所有工作都很好。现在我想在OpenMP on_ompt_callback_thread_begin()on_ompt_callback_thread_end()回调中使用C对象及其方法。为了实现这一点,我需要用C编译器编译我的小OpenMP工具库。对上述命令的唯一更改是:

CC     = clang++

使用clang++编译的OpenMP工具不再工作。它不注册回调,也不在后台执行任何“分析”工作。我不知道为什么。在C++代码中启用带有回调的OpenMP工具的正确方法是什么?
我用clangclang++编译了我的库和静态和动态可执行文件。然后我在我的库和可执行文件上使用了ldd。唯一的区别是用clang++编译的test_daxpy_sta使用了libgcc_s.so.1 => /usr/lib/libgcc_s.so.1。这是正确的吗?clang++不应该依赖于libgcc_s的LLVM等价物吗?我找到了clang++选项--rtlib,但我不知道GNU的libgcc_s的LLVM对应物是什么。

hrysbysz

hrysbysz1#

OpenMP运行时通过搜索名为ompt_start_tool[1]的全局可见函数来加载工具。如果使用C++编译器编译工具,请确保将此函数声明为extern "C",以便函数名称不会被损坏,并且OpenMP运行时可以找到[2]
您可以使用nm命令检查ompt_start_tool函数是否已损坏,以查看编译库中定义的符号:
nm libompt.so | grep ompt_start_tool
作为诊断OpenMP工具加载的附加提示,您可以使用OMP_TOOL_VERBOSE_INIT环境变量来诊断运行时检测和加载工具的问题**[3]**。这将帮助您验证运行时是否能够找到并加载您的工具。

参考文献

[1]https://www.openmp.org/spec-html/5.0/openmpsu177.html
**[2]**https:isocpp.org/wiki/faq/mixing-c-and-cpp#call-cpp
[3]https://www.openmp.org/spec-html/5.1/openmpse77.html

相关问题