Using `OpenMP::OpenMP_LANG` targets for CMake is less error-prone than passing the compiler and linker flags manually. Furthermore, it allows the user to customize those flags by setting `OpenMP_LANG_FLAGS`, `OpenMP_LANG_LIB_NAMES`, and `OpenMP_omp_LIBRARY`.tags/v0.3.30
@@ -119,10 +119,6 @@ endif() | |||||
message(WARNING "CMake support is experimental. It does not yet support all build options and may not produce the same Makefiles that OpenBLAS ships with.") | message(WARNING "CMake support is experimental. It does not yet support all build options and may not produce the same Makefiles that OpenBLAS ships with.") | ||||
if (USE_OPENMP) | |||||
find_package(OpenMP REQUIRED) | |||||
endif () | |||||
include("${PROJECT_SOURCE_DIR}/cmake/utils.cmake") | include("${PROJECT_SOURCE_DIR}/cmake/utils.cmake") | ||||
include("${PROJECT_SOURCE_DIR}/cmake/system.cmake") | include("${PROJECT_SOURCE_DIR}/cmake/system.cmake") | ||||
@@ -240,6 +236,12 @@ endif () | |||||
# add objects to the openblas lib | # add objects to the openblas lib | ||||
if(NOT NO_LAPACK) | if(NOT NO_LAPACK) | ||||
add_library(LAPACK_OVERRIDES OBJECT ${LA_SOURCES}) | add_library(LAPACK_OVERRIDES OBJECT ${LA_SOURCES}) | ||||
if (USE_OPENMP AND (NOT NOFORTRAN)) | |||||
# Disable OpenMP for LAPACK Fortran codes on Windows. | |||||
if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") | |||||
target_link_libraries(LAPACK_OVERRIDES OpenMP::OpenMP_Fortran) | |||||
endif() | |||||
endif() | |||||
list(APPEND TARGET_OBJS "$<TARGET_OBJECTS:LAPACK_OVERRIDES>") | list(APPEND TARGET_OBJS "$<TARGET_OBJECTS:LAPACK_OVERRIDES>") | ||||
endif() | endif() | ||||
if(NOT NO_LAPACKE) | if(NOT NO_LAPACKE) | ||||
@@ -281,10 +283,18 @@ endif() | |||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
if(BUILD_STATIC_LIBS) | if(BUILD_STATIC_LIBS) | ||||
target_link_libraries(${OpenBLAS_LIBNAME}_static OpenMP::OpenMP_C) | |||||
if(NOFORTRAN) | |||||
target_link_libraries(${OpenBLAS_LIBNAME}_static OpenMP::OpenMP_C) | |||||
else() | |||||
target_link_libraries(${OpenBLAS_LIBNAME}_static OpenMP::OpenMP_C OpenMP::OpenMP_Fortran) | |||||
endif() | |||||
endif() | endif() | ||||
if(BUILD_SHARED_LIBS) | if(BUILD_SHARED_LIBS) | ||||
target_link_libraries(${OpenBLAS_LIBNAME}_shared OpenMP::OpenMP_C) | |||||
if(NOFORTRAN) | |||||
target_link_libraries(${OpenBLAS_LIBNAME}_shared OpenMP::OpenMP_C) | |||||
else() | |||||
target_link_libraries(${OpenBLAS_LIBNAME}_shared OpenMP::OpenMP_C OpenMP::OpenMP_Fortran) | |||||
endif() | |||||
endif() | endif() | ||||
endif() | endif() | ||||
@@ -31,17 +31,6 @@ if (${CMAKE_C_COMPILER_ID} STREQUAL "Intel") | |||||
set(CCOMMON_OPT "${CCOMMON_OPT} -wd981") | set(CCOMMON_OPT "${CCOMMON_OPT} -wd981") | ||||
endif () | endif () | ||||
if (USE_OPENMP) | |||||
# USE_SIMPLE_THREADED_LEVEL3 = 1 | |||||
# NO_AFFINITY = 1 | |||||
find_package(OpenMP REQUIRED) | |||||
if (OpenMP_FOUND) | |||||
set(CCOMMON_OPT "${CCOMMON_OPT} ${OpenMP_C_FLAGS} -DUSE_OPENMP") | |||||
set(FCOMMON_OPT "${FCOMMON_OPT} ${OpenMP_Fortran_FLAGS}") | |||||
endif() | |||||
endif () | |||||
if (DYNAMIC_ARCH) | if (DYNAMIC_ARCH) | ||||
if (ARM64) | if (ARM64) | ||||
set(DYNAMIC_CORE ARMV8 CORTEXA53 CORTEXA57 THUNDERX THUNDERX2T99 TSV110 EMAG8180 NEOVERSEN1 THUNDERX3T110) | set(DYNAMIC_CORE ARMV8 CORTEXA53 CORTEXA57 THUNDERX THUNDERX2T99 TSV110 EMAG8180 NEOVERSEN1 THUNDERX3T110) | ||||
@@ -7,7 +7,7 @@ if (${F_COMPILER} STREQUAL "FLANG" AND NOT CMAKE_Fortran_COMPILER_ID STREQUAL "L | |||||
# This is for classic Flang. LLVM Flang is handled with gfortran below. | # This is for classic Flang. LLVM Flang is handled with gfortran below. | ||||
set(CCOMMON_OPT "${CCOMMON_OPT} -DF_INTERFACE_FLANG") | set(CCOMMON_OPT "${CCOMMON_OPT} -DF_INTERFACE_FLANG") | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -fopenmp") | |||||
set(OpenMP_Fortran_FLAGS "-fopenmp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -Mrecursive -Kieee") | set(FCOMMON_OPT "${FCOMMON_OPT} -Mrecursive -Kieee") | ||||
endif () | endif () | ||||
@@ -117,7 +117,7 @@ if (${F_COMPILER} STREQUAL "GFORTRAN" OR ${F_COMPILER} STREQUAL "F95" OR CMAKE_F | |||||
endif () | endif () | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -fopenmp") | |||||
set(OpenMP_Fortran_FLAGS "-fopenmp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
@@ -128,14 +128,14 @@ if (${F_COMPILER} STREQUAL "INTEL" OR CMAKE_Fortran_COMPILER_ID MATCHES "Intel") | |||||
endif () | endif () | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -recursive -fp-model=consistent") | set(FCOMMON_OPT "${FCOMMON_OPT} -recursive -fp-model=consistent") | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -openmp") | |||||
set(OpenMP_Fortran_FLAGS "-openmp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
if (${F_COMPILER} STREQUAL "FUJITSU") | if (${F_COMPILER} STREQUAL "FUJITSU") | ||||
set(CCOMMON_OPT "${CCOMMON_OPT} -DF_INTERFACE_FUJITSU") | set(CCOMMON_OPT "${CCOMMON_OPT} -DF_INTERFACE_FUJITSU") | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -openmp") | |||||
set(OpenMP_Fortran_FLAGS "-openmp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
@@ -151,7 +151,7 @@ if (${F_COMPILER} STREQUAL "IBM") | |||||
set(FCOMMON_OPT "${FCOMMON_OPT} -q32") | set(FCOMMON_OPT "${FCOMMON_OPT} -q32") | ||||
endif () | endif () | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -openmp") | |||||
set(OpenMP_Fortran_FLAGS "-openmp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
@@ -168,7 +168,7 @@ if (${F_COMPILER} STREQUAL "PGI" OR ${F_COMPILER} STREQUAL "PGF95") | |||||
endif () | endif () | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -Mrecursive") | set(FCOMMON_OPT "${FCOMMON_OPT} -Mrecursive") | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -mp") | |||||
set(OpenMP_Fortran_FLAGS "-mp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
@@ -195,7 +195,7 @@ if (${F_COMPILER} STREQUAL "PATHSCALE") | |||||
endif () | endif () | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -mp") | |||||
set(OpenMP_Fortran_FLAGS "-mp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
@@ -233,7 +233,7 @@ if (${F_COMPILER} STREQUAL "OPEN64") | |||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FEXTRALIB "${FEXTRALIB} -lstdc++") | set(FEXTRALIB "${FEXTRALIB} -lstdc++") | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -mp") | |||||
set(OpenMP_Fortran_FLAGS "-mp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
@@ -245,14 +245,14 @@ if (${F_COMPILER} STREQUAL "SUN") | |||||
set(FCOMMON_OPT "${FCOMMON_OPT} -m64") | set(FCOMMON_OPT "${FCOMMON_OPT} -m64") | ||||
endif () | endif () | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -xopenmp=parallel") | |||||
set(OpenMP_Fortran_FLAGS "-xopenmp=parallel" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
if (${F_COMPILER} STREQUAL "COMPAQ") | if (${F_COMPILER} STREQUAL "COMPAQ") | ||||
set(CCOMMON_OPT "${CCOMMON_OPT} -DF_INTERFACE_COMPAQ") | set(CCOMMON_OPT "${CCOMMON_OPT} -DF_INTERFACE_COMPAQ") | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -openmp") | |||||
set(OpenMP_Fortran_FLAGS "-openmp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
@@ -265,7 +265,7 @@ if (${F_COMPILER} STREQUAL "CRAY") | |||||
if (NOT USE_OPENMP) | if (NOT USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -fno-openmp") | set(FCOMMON_OPT "${FCOMMON_OPT} -fno-openmp") | ||||
else () | else () | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -fopenmp") | |||||
set(OpenMP_Fortran_FLAGS "-fopenmp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
@@ -290,7 +290,7 @@ if (${F_COMPILER} STREQUAL "NAGFOR") | |||||
# -w=unused: Suppress warning messages about unused variables | # -w=unused: Suppress warning messages about unused variables | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -w=x77 -w=ques -w=unused") | set(FCOMMON_OPT "${FCOMMON_OPT} -w=x77 -w=ques -w=unused") | ||||
if (USE_OPENMP) | if (USE_OPENMP) | ||||
set(FCOMMON_OPT "${FCOMMON_OPT} -openmp") | |||||
set(OpenMP_Fortran_FLAGS "-openmp" CACHE STRING "OpenMP Fortran compiler flags") | |||||
endif () | endif () | ||||
endif () | endif () | ||||
@@ -372,6 +372,14 @@ else () | |||||
endif () | endif () | ||||
endif () | endif () | ||||
if (USE_OPENMP) | |||||
find_package(OpenMP COMPONENTS C REQUIRED) | |||||
set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_OPENMP") | |||||
if (NOT NOFORTRAN) | |||||
find_package(OpenMP COMPONENTS Fortran REQUIRED) | |||||
endif () | |||||
endif () | |||||
if (BINARY64) | if (BINARY64) | ||||
if (INTERFACE64) | if (INTERFACE64) | ||||
# CCOMMON_OPT += -DUSE64BITINT | # CCOMMON_OPT += -DUSE64BITINT | ||||
@@ -655,15 +663,6 @@ if (LAPACK_STRLEN) | |||||
endif() | endif() | ||||
set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}") | set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}") | ||||
#Disable -fopenmp for LAPACK Fortran codes on Windows. | |||||
if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") | |||||
set(FILTER_FLAGS "-fopenmp;-mp;-openmp;-xopenmp=parallel") | |||||
foreach (FILTER_FLAG ${FILTER_FLAGS}) | |||||
string(REPLACE ${FILTER_FLAG} "" LAPACK_FFLAGS ${LAPACK_FFLAGS}) | |||||
string(REPLACE ${FILTER_FLAG} "" LAPACK_FPFLAGS ${LAPACK_FPFLAGS}) | |||||
endforeach () | |||||
endif () | |||||
if (CMAKE_Fortran_COMPILER) | if (CMAKE_Fortran_COMPILER) | ||||
if ("${F_COMPILER}" STREQUAL "NAGFOR" OR "${F_COMPILER}" STREQUAL "CRAY" OR CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang.*") | if ("${F_COMPILER}" STREQUAL "NAGFOR" OR "${F_COMPILER}" STREQUAL "CRAY" OR CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang.*") | ||||
set(FILTER_FLAGS "-msse3;-mssse3;-msse4.1;-mavx;-mavx2,-mskylake-avx512") | set(FILTER_FLAGS "-msse3;-mssse3;-msse4.1;-mavx;-mavx2,-mskylake-avx512") | ||||
@@ -223,3 +223,7 @@ if (USE_THREAD) | |||||
endif () | endif () | ||||
add_library(driver_level2 OBJECT ${OPENBLAS_SRC}) | add_library(driver_level2 OBJECT ${OPENBLAS_SRC}) | ||||
if (USE_OPENMP) | |||||
target_link_libraries(driver_level2 OpenMP::OpenMP_C) | |||||
endif() |
@@ -171,3 +171,7 @@ endforeach () | |||||
# | # | ||||
add_library(driver_level3 OBJECT ${OPENBLAS_SRC}) | add_library(driver_level3 OBJECT ${OPENBLAS_SRC}) | ||||
if (USE_OPENMP) | |||||
target_link_libraries(driver_level3 OpenMP::OpenMP_C) | |||||
endif() |
@@ -88,3 +88,7 @@ endif () | |||||
#endif | #endif | ||||
add_library(driver_others OBJECT ${OPENBLAS_SRC} ${MEMORY} ${SMP_SOURCES} ${COMMON_SOURCES}) | add_library(driver_others OBJECT ${OPENBLAS_SRC} ${MEMORY} ${SMP_SOURCES} ${COMMON_SOURCES}) | ||||
if (USE_OPENMP) | |||||
target_link_libraries(driver_others OpenMP::OpenMP_C) | |||||
endif() |
@@ -250,3 +250,7 @@ if ( BUILD_COMPLEX16 AND NOT BUILD_DOUBLE) | |||||
endif () | endif () | ||||
add_library(interface OBJECT ${OPENBLAS_SRC}) | add_library(interface OBJECT ${OPENBLAS_SRC}) | ||||
if (USE_OPENMP) | |||||
target_link_libraries(interface OpenMP::OpenMP_C) | |||||
endif() |
@@ -1364,6 +1364,9 @@ endif () | |||||
if (USE_GEMM3M) | if (USE_GEMM3M) | ||||
target_compile_definitions(kernel${TSUFFIX} PRIVATE USE_GEMM3M) | target_compile_definitions(kernel${TSUFFIX} PRIVATE USE_GEMM3M) | ||||
endif() | endif() | ||||
if (USE_OPENMP) | |||||
target_link_libraries(kernel${TSUFFIX} OpenMP::OpenMP_C) | |||||
endif() | |||||
endfunction () | endfunction () | ||||
@@ -117,3 +117,7 @@ GenerateCombinationObjects("${UNIT_SOURCES}" "UNIT" "N" "" 4) | |||||
GenerateCombinationObjects("${UNIT_SOURCES2}" "UNIT" "N" "" 0 "" "" 3) | GenerateCombinationObjects("${UNIT_SOURCES2}" "UNIT" "N" "" 0 "" "" 3) | ||||
add_library(lapack OBJECT ${OPENBLAS_SRC}) | add_library(lapack OBJECT ${OPENBLAS_SRC}) | ||||
if (USE_OPENMP) | |||||
target_link_libraries(lapack OpenMP::OpenMP_C) | |||||
endif() |