diff --git a/cmake/modules/openmp.cmake b/cmake/modules/openmp.cmake index 87fc327c4..3d9e55c62 100644 --- a/cmake/modules/openmp.cmake +++ b/cmake/modules/openmp.cmake @@ -4,21 +4,40 @@ option(USE_OpenMP "Use OpenMP" ON) # This finds the library path from the system's clang for OpenMP # # On Fedora, it's at the same place as others, so we don't need to look elsewhere -# On Ubuntu, it's in /usr/lib/llvm-${version}, so find_package finds GOMP for GCC instead. -execute_process ( - COMMAND bash -c "for lib in $(clang -lomp -### 2>&1); do echo $lib | grep -o \"\\/.*llvm.*\\w\"; done" - OUTPUT_VARIABLE LLVM_OMP_PATH -) -# Only if we found an "llvm" path that we need to add -if (LLVM_OMP_PATH) - set(CMAKE_PREFIX_PATH ${LLVM_OMP_PATH}) -endif() +# On Ubuntu, it's in /usr/lib/llvm-${version}, so GCC finds GOMP instead. if(USE_OpenMP) - find_package(OpenMP) - if(OPENMP_FOUND) + # Only bypass for GCC + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + # Only if we found an "llvm" path that we need to add + find_library(LLVM_OMP NAMES omp libomp libomp.so libomp.so.5) + find_library(PTHREAD NAMES pthread libpthread libpthread.a libpthread.so) + if (NOT LLVM_OMP OR NOT PTHREAD) + message(FATAL_ERROR "LLVM OpenMP required but not found") + endif() + set(OPENMP_FOUND ON) + set(OpenMP_C_FLAGS "-fopenmp") + set(OpenMP_C_LIBRARIES "${LLVM_OMP};${PTHREAD}") + set(OpenMP_C_LIB_NAMES "omp;pthread") + message(STATUS "OpenMP found") - else() - message(FATAL_ERROR "OpenMP required but not found") - endif() -endif() + message(STATUS "OpenMP C flags: ${OpenMP_C_FLAGS}") + message(STATUS "OpenMP C libs: ${OpenMP_C_LIBRARIES}") + message(STATUS "OpenMP C libnames: ${OpenMP_C_LIB_NAMES}") + + else() # GNU / LLVM + + # Clang always prefers its own OpenMP + find_package(OpenMP) + if(OPENMP_FOUND) + message(STATUS "OpenMP found") + message(STATUS "OpenMP version: ${OpenMP_C_VERSION}") + message(STATUS "OpenMP C flags: ${OpenMP_C_FLAGS}") + message(STATUS "OpenMP C libs: ${OpenMP_C_LIBRARIES}") + message(STATUS "OpenMP C libnames: ${OpenMP_C_LIB_NAMES}") + else() + message(FATAL_ERROR "LLVM OpenMP required but not found") + endif() + + endif() # GNU / LLVM +endif() # USE_OpenMP diff --git a/cmake/modules/xsmm-dnn.cmake b/cmake/modules/xsmm-dnn.cmake index 5a748788a..8057a7344 100644 --- a/cmake/modules/xsmm-dnn.cmake +++ b/cmake/modules/xsmm-dnn.cmake @@ -46,6 +46,6 @@ target_include_directories(xsmm_dnn_mlp PRIVATE ${XSMM_DNN_INCLUDE_DIRS}) target_link_libraries(xsmm_dnn_mlp PRIVATE xsmm) if (OPENMP_FOUND) target_compile_options(xsmm_dnn_mlp PRIVATE ${OpenMP_C_FLAGS}) - target_link_libraries(xsmm_dnn_mlp PRIVATE omp) + target_link_libraries(xsmm_dnn_mlp PRIVATE ${OpenMP_C_LIB_NAMES}) endif() install(TARGETS xsmm_dnn_mlp RUNTIME DESTINATION bin) diff --git a/tools/tpp-run/CMakeLists.txt b/tools/tpp-run/CMakeLists.txt index 300be5d0d..791954d67 100644 --- a/tools/tpp-run/CMakeLists.txt +++ b/tools/tpp-run/CMakeLists.txt @@ -9,10 +9,6 @@ if(USE_OneDNN) set(ONEDNN_LIBS_INCL "-ltpp_dnnl_runner_utils") endif() -if(USE_OpenMP) - set(OPENMP_LIBS_INCL "-lomp") -endif() - set(LIBS ${dialect_libs} ${conversion_libs} @@ -81,7 +77,7 @@ target_link_options(tpp-run PRIVATE -lmlir_runner_utils -lmlir_async_runtime ${TPP_GPU_LINK_FLAGS} - ${OPENMP_LIBS_INCL} + $<$:${OpenMP_C_LIBRARIES}> -Wl,--as-needed )