diff options
author | Shilei Tian <tianshilei1992@gmail.com> | 2021-01-28 07:24:19 -0500 |
---|---|---|
committer | Shilei Tian <tianshilei1992@gmail.com> | 2021-02-03 19:18:08 -0500 |
commit | f5602e0bf31ab590da19fa357980a753dbfd666e (patch) | |
tree | 714ec1d1ce5ac3699e3efa6dc3a247f9d13e124e | |
parent | 2a917b70e770e2d25d96f91beebf2a3e52bb9e66 (diff) | |
download | llvm-f5602e0bf31ab590da19fa357980a753dbfd666e.tar.gz |
[OpenMP] Disabled profiling in `libomp` by default to unblock link errors
Link error occurred when time profiling in libomp is enabled by default
because `libomp` is assumed to be a C library but the dependence on
`libLLVMSupport` for profiling is a C++ library. Currently the issue blocks all
OpenMP tests in Phabricator.
This patch set a new CMake option `OPENMP_ENABLE_LIBOMP_PROFILING` to
enable/disable the feature. By default it is disabled. Note that once time
profiling is enabled for `libomp`, it becomes a C++ library.
Reviewed By: jdoerfert
Differential Revision: https://reviews.llvm.org/D95585
(cherry picked from commit c571b168349fdf22d1dc8b920bcffa3d5161f0a2)
-rw-r--r-- | openmp/CMakeLists.txt | 6 | ||||
-rw-r--r-- | openmp/docs/design/Runtimes.rst | 5 | ||||
-rw-r--r-- | openmp/runtime/CMakeLists.txt | 6 | ||||
-rw-r--r-- | openmp/runtime/src/CMakeLists.txt | 12 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_config.h.cmake | 4 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_runtime.cpp | 6 |
6 files changed, 29 insertions, 10 deletions
diff --git a/openmp/CMakeLists.txt b/openmp/CMakeLists.txt index 67600bebdafb..4787d4b5a321 100644 --- a/openmp/CMakeLists.txt +++ b/openmp/CMakeLists.txt @@ -86,6 +86,12 @@ option(OPENMP_ENABLE_LIBOMPTARGET "Enable building libomptarget for offloading." ${ENABLE_LIBOMPTARGET}) option(OPENMP_ENABLE_LIBOMPTARGET_PROFILING "Enable time profiling for libomptarget." ${ENABLE_LIBOMPTARGET}) +option(OPENMP_ENABLE_LIBOMP_PROFILING "Enable time profiling for libomp." OFF) + +# Build host runtime library, after LIBOMPTARGET variables are set since they are needed +# to enable time profiling support in the OpenMP runtime. +add_subdirectory(runtime) + if (OPENMP_ENABLE_LIBOMPTARGET) # Check that the library can actually be built. if (APPLE OR WIN32) diff --git a/openmp/docs/design/Runtimes.rst b/openmp/docs/design/Runtimes.rst index 016b88ba324b..ad36e43eccdc 100644 --- a/openmp/docs/design/Runtimes.rst +++ b/openmp/docs/design/Runtimes.rst @@ -48,7 +48,10 @@ similar to Clang's ``-ftime-trace`` option. This generates a JSON file based on `Speedscope App`_. Building this feature depends on the `LLVM Support Library`_ for time trace output. Using this library is enabled by default when building using the CMake option ``OPENMP_ENABLE_LIBOMPTARGET_PROFILING``. The output will -be saved to the filename specified by the environment variable. +be saved to the filename specified by the environment variable. For multi-threaded +applications, profiling in ``libomp`` is also needed. Setting the CMake option +``OPENMP_ENABLE_LIBOMP_PROFILING=ON`` to enable the feature. Note that this will +turn ``libomp`` into a C++ library. .. _`Chrome Tracing`: https://www.chromium.org/developers/how-tos/trace-event-profiling-tool diff --git a/openmp/runtime/CMakeLists.txt b/openmp/runtime/CMakeLists.txt index 9fdd04f41646..8828ff8ef455 100644 --- a/openmp/runtime/CMakeLists.txt +++ b/openmp/runtime/CMakeLists.txt @@ -34,7 +34,6 @@ if(${OPENMP_STANDALONE_BUILD}) # Should assertions be enabled? They are on by default. set(LIBOMP_ENABLE_ASSERTIONS TRUE CACHE BOOL "enable assertions?") - set(LIBOMPTARGET_PROFILING_SUPPORT FALSE) else() # Part of LLVM build # Determine the native architecture from LLVM. string(TOLOWER "${LLVM_TARGET_ARCH}" LIBOMP_NATIVE_ARCH) @@ -66,10 +65,11 @@ else() # Part of LLVM build libomp_get_architecture(LIBOMP_ARCH) endif () set(LIBOMP_ENABLE_ASSERTIONS ${LLVM_ENABLE_ASSERTIONS}) - # Time profiling support - set(LIBOMPTARGET_PROFILING_SUPPORT ${OPENMP_ENABLE_LIBOMPTARGET_PROFILING}) endif() +# Time profiling support +set(LIBOMP_PROFILING_SUPPORT ${OPENMP_ENABLE_LIBOMP_PROFILING}) + # FUJITSU A64FX is a special processor because its cache line size is 256. # We need to pass this information into kmp_config.h. if(LIBOMP_ARCH STREQUAL "aarch64") diff --git a/openmp/runtime/src/CMakeLists.txt b/openmp/runtime/src/CMakeLists.txt index 2e927df84f5c..822f9ca2b825 100644 --- a/openmp/runtime/src/CMakeLists.txt +++ b/openmp/runtime/src/CMakeLists.txt @@ -50,6 +50,14 @@ if(${LIBOMP_USE_HWLOC}) include_directories(${LIBOMP_HWLOC_INSTALL_DIR}/include) endif() +# Building with time profiling support requires LLVM directory includes. +if(LIBOMP_PROFILING_SUPPORT) + include_directories( + ${LLVM_MAIN_INCLUDE_DIR} + ${LLVM_INCLUDE_DIR} + ) +endif() + # Getting correct source files to build library set(LIBOMP_CXXFILES) set(LIBOMP_ASMFILES) @@ -135,7 +143,7 @@ libomp_get_ldflags(LIBOMP_CONFIGURED_LDFLAGS) libomp_get_libflags(LIBOMP_CONFIGURED_LIBFLAGS) # Build libomp library. Add LLVMSupport dependency if building in-tree with libomptarget profiling enabled. -if(OPENMP_STANDALONE_BUILD OR (NOT OPENMP_ENABLE_LIBOMPTARGET_PROFILING)) +if(OPENMP_STANDALONE_BUILD OR (NOT OPENMP_ENABLE_LIBOMP_PROFILING)) add_library(omp ${LIBOMP_LIBRARY_KIND} ${LIBOMP_SOURCE_FILES}) # Linking command will include libraries in LIBOMP_CONFIGURED_LIBFLAGS target_link_libraries(omp ${LIBOMP_CONFIGURED_LIBFLAGS} ${CMAKE_DL_LIBS}) @@ -144,6 +152,8 @@ else() LINK_LIBS ${LIBOMP_CONFIGURED_LIBFLAGS} ${CMAKE_DL_LIBS} LINK_COMPONENTS Support ) + # libomp must be a C++ library such that it can link libLLVMSupport + set(LIBOMP_LINKER_LANGUAGE CXX) endif() set_target_properties(omp PROPERTIES diff --git a/openmp/runtime/src/kmp_config.h.cmake b/openmp/runtime/src/kmp_config.h.cmake index 3d682c690fc7..f6aee7197ee8 100644 --- a/openmp/runtime/src/kmp_config.h.cmake +++ b/openmp/runtime/src/kmp_config.h.cmake @@ -44,8 +44,8 @@ #define OMPT_DEBUG LIBOMP_OMPT_DEBUG #cmakedefine01 LIBOMP_OMPT_SUPPORT #define OMPT_SUPPORT LIBOMP_OMPT_SUPPORT -#cmakedefine01 LIBOMPTARGET_PROFILING_SUPPORT -#define OMPTARGET_PROFILING_SUPPORT LIBOMPTARGET_PROFILING_SUPPORT +#cmakedefine01 LIBOMP_PROFILING_SUPPORT +#define OMP_PROFILING_SUPPORT LIBOMP_PROFILING_SUPPORT #cmakedefine01 LIBOMP_OMPT_OPTIONAL #define OMPT_OPTIONAL LIBOMP_OMPT_OPTIONAL #cmakedefine01 LIBOMP_USE_ADAPTIVE_LOCKS diff --git a/openmp/runtime/src/kmp_runtime.cpp b/openmp/runtime/src/kmp_runtime.cpp index 4a0634d59cff..a6e32bd008e1 100644 --- a/openmp/runtime/src/kmp_runtime.cpp +++ b/openmp/runtime/src/kmp_runtime.cpp @@ -32,7 +32,7 @@ #include "ompt-specific.h" #endif -#if OMPTARGET_PROFILING_SUPPORT +#if OMP_PROFILING_SUPPORT #include "llvm/Support/TimeProfiler.h" static char *ProfileTraceFile = nullptr; #endif @@ -5740,7 +5740,7 @@ void __kmp_free_thread(kmp_info_t *this_th) { /* ------------------------------------------------------------------------ */ void *__kmp_launch_thread(kmp_info_t *this_thr) { -#if OMPTARGET_PROFILING_SUPPORT +#if OMP_PROFILING_SUPPORT ProfileTraceFile = getenv("LIBOMPTARGET_PROFILE"); // TODO: add a configuration option for time granularity if (ProfileTraceFile) @@ -5848,7 +5848,7 @@ void *__kmp_launch_thread(kmp_info_t *this_thr) { KA_TRACE(10, ("__kmp_launch_thread: T#%d done\n", gtid)); KMP_MB(); -#if OMPTARGET_PROFILING_SUPPORT +#if OMP_PROFILING_SUPPORT llvm::timeTraceProfilerFinishThread(); #endif return this_thr; |