diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e2b1d40c6fa6cf48b88e4c6ad9e0bee01718944..2c409a3fa0b3b6e2f2ed5d47cac533051e0c3512 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -570,6 +570,11 @@ add_subdirectory(include) add_subdirectory(control) add_subdirectory(compute) +############################################################################### +# chameleon_lapack library # +############################ +add_subdirectory(lapack_api) + ############################################################################### # Executables and Tests # ######################### diff --git a/cmake_modules/CHAMELEONConfig.cmake.in b/cmake_modules/CHAMELEONConfig.cmake.in index 4817a7aa022d75f6459e8c1a93a1430c046468de..c4b93d79fa716e8e502740306d5572745049f3c0 100644 --- a/cmake_modules/CHAMELEONConfig.cmake.in +++ b/cmake_modules/CHAMELEONConfig.cmake.in @@ -86,3 +86,4 @@ if (@CHAMELEON_SCHED_STARPU@) include("${CMAKE_CURRENT_LIST_DIR}/chameleon_starpuTargets.cmake") endif() include("${CMAKE_CURRENT_LIST_DIR}/chameleonTargets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/chameleon_lapackTargets.cmake") diff --git a/cmake_modules/GenPkgConfig.cmake b/cmake_modules/GenPkgConfig.cmake index 9488bb070a00d48f2254ea2187122be52643bd97..ba1fb73ee4d538ecc42f0e041742a7f5892c3693 100644 --- a/cmake_modules/GenPkgConfig.cmake +++ b/cmake_modules/GenPkgConfig.cmake @@ -80,29 +80,34 @@ ENDMACRO(CLEAN_LIB_LIST) MACRO(GENERATE_PKGCONFIG_FILE) # The definitions that should be given to users (change the API) + set(CHAMELEON_LAPACK_PKGCONFIG_DEFINITIONS "") set(CHAMELEON_PKGCONFIG_DEFINITIONS "") set(COREBLAS_PKGCONFIG_DEFINITIONS "") set(CUDABLAS_PKGCONFIG_DEFINITIONS "") # The link flags specific to this package and any required libraries # that don't support PkgConfig + set(CHAMELEON_LAPACK_PKGCONFIG_LIBS "-lchameleon_lapack") set(CHAMELEON_PKGCONFIG_LIBS "-lchameleon") set(COREBLAS_PKGCONFIG_LIBS "-lcoreblas") set(CUDABLAS_PKGCONFIG_LIBS "-lcudablas") # The link flags for private libraries required by this package but not # exposed to applications + set(CHAMELEON_LAPACK_PKGCONFIG_LIBS_PRIVATE "") set(CHAMELEON_PKGCONFIG_LIBS_PRIVATE "") set(COREBLAS_PKGCONFIG_LIBS_PRIVATE "") set(CUDABLAS_PKGCONFIG_LIBS_PRIVATE "") # A list of packages required by this package + set(CHAMELEON_LAPACK_PKGCONFIG_REQUIRED "chameleon") set(CHAMELEON_PKGCONFIG_REQUIRED "hqr") set(COREBLAS_PKGCONFIG_REQUIRED "") set(CUDABLAS_PKGCONFIG_REQUIRED "") # A list of private packages required by this package but not exposed to # applications + set(CHAMELEON_LAPACK_PKGCONFIG_REQUIRED_PRIVATE "") set(CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE "") set(COREBLAS_PKGCONFIG_REQUIRED_PRIVATE "") set(CUDABLAS_PKGCONFIG_REQUIRED_PRIVATE "") @@ -157,6 +162,7 @@ MACRO(GENERATE_PKGCONFIG_FILE) # Create .pc file # --------------- + SET(_output_chameleon_lapack_file "${CMAKE_BINARY_DIR}/chameleon_lapack.pc") SET(_output_chameleon_file "${CMAKE_BINARY_DIR}/chameleon.pc") SET(_output_coreblas_file "${CMAKE_BINARY_DIR}/coreblas.pc") if(CHAMELEON_USE_CUDA) @@ -164,6 +170,7 @@ MACRO(GENERATE_PKGCONFIG_FILE) endif() # TODO: add url of CHAMELEON releases in .pc file + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/lib/pkgconfig/chameleon_lapack.pc.in" "${_output_chameleon_lapack_file}" @ONLY) CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/lib/pkgconfig/chameleon.pc.in" "${_output_chameleon_file}" @ONLY) CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/lib/pkgconfig/coreblas.pc.in" "${_output_coreblas_file}" @ONLY) if(CHAMELEON_USE_CUDA) @@ -172,6 +179,7 @@ MACRO(GENERATE_PKGCONFIG_FILE) # installation # ------------ + INSTALL(FILES ${_output_chameleon_lapack_file} DESTINATION lib/pkgconfig) INSTALL(FILES ${_output_chameleon_file} DESTINATION lib/pkgconfig) INSTALL(FILES ${_output_coreblas_file} DESTINATION lib/pkgconfig) INSTALL(FILES ${_output_cudablas_file} DESTINATION lib/pkgconfig) diff --git a/compute/CMakeLists.txt b/compute/CMakeLists.txt index cda965e6b024e17120369f9b52350e6daf030dc4..815eb60bf947d77c444e078598ea6894c521fd9b 100644 --- a/compute/CMakeLists.txt +++ b/compute/CMakeLists.txt @@ -264,22 +264,10 @@ precisions_rules_py(CONTROL_SRCS_GENERATED "${ZSRC}" PRECISIONS "${CHAMELEON_PRECISION}" TARGETDIR "control" ) -set(LAPACK_API_SRCS_GENERATED "") -set(ZSRC - lapack_api/lapack_zgemm.c - ) -precisions_rules_py(LAPACK_API_SRCS_GENERATED "${ZSRC}" - PRECISIONS "${CHAMELEON_PRECISION}") -set(LAPACK_API_SRCS - ${LAPACK_API_SRCS_GENERATED} - lapack_api/lapack_api_common.c - ) - set(CHAMELEON_SRCS ${CHAMELEON_CONTROL} ${CHAMELEON_SRCS_GENERATED} ${CONTROL_SRCS_GENERATED} - ${LAPACK_API_SRCS} ) # Generate the chameleon fortran sources for all possible precisions @@ -321,7 +309,6 @@ add_dependencies(chameleon ) target_include_directories(chameleon PUBLIC - $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lapack_api> $<BUILD_INTERFACE:${CHAMELEON_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CHAMELEON_BINARY_DIR}/include> $<BUILD_INTERFACE:${CHAMELEON_SOURCE_DIR}/control> diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index 004ea4ab197088e24513799d18ba89eb22b84602..19dce38527e59cc76d83a3a1a23588429fbd547c 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -32,7 +32,6 @@ set(CHAMELEON_HDRS_GENERATED "") set(ZHDR chameleon/chameleon_z.h chameleon/chameleon_zc.h - chameleon/chameleon_zlapack.h chameleon/tasks_z.h chameleon/tasks_zc.h ) diff --git a/include/chameleon.h b/include/chameleon.h index d3f41a16e18a6e62a9fb28f1642dc221e0ea5e82..175cb73f7d18148bffea2c780a24f26c9a14fbea 100644 --- a/include/chameleon.h +++ b/include/chameleon.h @@ -68,11 +68,6 @@ typedef struct gepdf_info_s { #include "chameleon/chameleon_zc.h" #include "chameleon/chameleon_ds.h" -#include "chameleon/chameleon_zlapack.h" -#include "chameleon/chameleon_clapack.h" -#include "chameleon/chameleon_dlapack.h" -#include "chameleon/chameleon_slapack.h" - BEGIN_C_DECLS /* **************************************************************************** diff --git a/lapack_api/CMakeLists.txt b/lapack_api/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..9917a0399dc7c01698544a72d7227a66763842d6 --- /dev/null +++ b/lapack_api/CMakeLists.txt @@ -0,0 +1,110 @@ +### +# +# @file CMakeLists.txt +# +# @copyright 2022-2022 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, +# Univ. Bordeaux. All rights reserved. +# +### +# +# @project CHAMELEON +# CHAMELEON is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 1.2.0 +# @author Mathieu Faverge +# @author Florent Pruvost +# @date 2022-07-25 +# +### + +# Generate the chameleon headers for all possible precisions +# ---------------------------------------------------------- +set(CHAMELEON_LAPACK_HDRS_GENERATED "") +set(ZHDR + include/chameleon/chameleon_zlapack.h +) + +precisions_rules_py(CHAMELEON_LAPACK_HDRS_GENERATED "${ZHDR}" + TARGETDIR "include/chameleon" + PRECISIONS "z;c;d;s" ) + +set(CHAMELEON_LAPACK_HDRS "") +foreach( hdr_file ${CHAMELEON_LAPACK_HDRS_GENERATED} ) + list(APPEND CHAMELEON_LAPACK_HDRS ${CMAKE_CURRENT_BINARY_DIR}/${hdr_file}) +endforeach() + +# Force generation of headers +# --------------------------- +add_custom_target(chameleon_lapack_include + ALL SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/include/chameleon_lapack.h + ${CHAMELEON_LAPACK_HDRS}) +set(CHAMELEON_SOURCES_TARGETS "${CHAMELEON_SOURCES_TARGETS};chameleon_lapack_include" CACHE INTERNAL "List of targets of sources") + +# Installation of headers +# ----------------------- +install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/chameleon_lapack.h + DESTINATION include ) +install( FILES ${CHAMELEON_LAPACK_HDRS} + DESTINATION include/chameleon ) + +# Define the list of sources +# -------------------------- +set(LAPACK_SRCS_GENERATED "") +set(ZSRC + src/lapack_zgemm.c + ) +precisions_rules_py(LAPACK_SRCS_GENERATED "${ZSRC}" + PRECISIONS "${CHAMELEON_PRECISION}") +set(CHAMELEON_LAPACK_SRCS + ${LAPACK_SRCS_GENERATED} + src/lapack_api_common.c + ) + +# Force generation of sources +# --------------------------- +add_custom_target(chameleon_lapack_sources ALL SOURCES "${CHAMELEON_LAPACK_SRCS}") +set(CHAMELEON_SOURCES_TARGETS "${CHAMELEON_SOURCES_TARGETS};chameleon_lapack_sources" CACHE INTERNAL "List of targets of sources") + +# Define library +# -------------- +add_library(chameleon_lapack ${CHAMELEON_LAPACK_SRCS}) +set_target_properties(chameleon_lapack PROPERTIES VERSION ${CHAMELEON_VERSION}) +set_target_properties(chameleon_lapack PROPERTIES SOVERSION ${CHAMELEON_VERSION_MAJOR}) + +# Define dependencies +# ------------------- +target_include_directories(chameleon_lapack PUBLIC + $<BUILD_INTERFACE:${CHAMELEON_SOURCE_DIR}/lapack_api/include> + $<BUILD_INTERFACE:${CHAMELEON_BINARY_DIR}/lapack_api/include> + $<INSTALL_INTERFACE:include>) +target_link_libraries(chameleon_lapack PUBLIC chameleon) +if (CHAMELEON_SIMULATION) + target_include_directories(chameleon_lapack PUBLIC $<BUILD_INTERFACE:${CHAMELEON_SOURCE_DIR}/coreblas/include>) +else() + target_link_libraries(chameleon_lapack PUBLIC coreblas) +endif() +set_property(TARGET chameleon_lapack PROPERTY INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +# Export target +# ------------- +install(EXPORT chameleon_lapackTargets + NAMESPACE CHAMELEON:: + DESTINATION lib/cmake/chameleon + ) + +# Installation of library and cmake target +# ---------------------------------------- +install(TARGETS chameleon_lapack + EXPORT chameleon_lapackTargets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + ) + +### +### END CMakeLists.txt +### diff --git a/include/chameleon/chameleon_zlapack.h b/lapack_api/include/chameleon/chameleon_zlapack.h similarity index 94% rename from include/chameleon/chameleon_zlapack.h rename to lapack_api/include/chameleon/chameleon_zlapack.h index 761fed935b7f6e1f064e17293309e8fcd2f3250b..71cc73ca90f7b473cf3b320f68efcfe367eb9312 100644 --- a/include/chameleon/chameleon_zlapack.h +++ b/lapack_api/include/chameleon/chameleon_zlapack.h @@ -19,7 +19,8 @@ #ifndef _chameleon_zlapack_h_ #define _chameleon_zlapack_h_ -#include "coreblas/cblas_wrapper.h" +#include <chameleon.h> +#include <coreblas/cblas_wrapper.h> BEGIN_C_DECLS diff --git a/lapack_api/include/chameleon_lapack.h b/lapack_api/include/chameleon_lapack.h new file mode 100644 index 0000000000000000000000000000000000000000..1df1c259a0990257dcbd0670d28b380587f143b2 --- /dev/null +++ b/lapack_api/include/chameleon_lapack.h @@ -0,0 +1,26 @@ +/** + * + * @file chameleon_lapack.h + * + * @copyright 2022-2022 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, + * Univ. Bordeaux. All rights reserved. + * + *** + * + * @brief Chameleon blas/lapack and cblas/lapack api functions + * + * @version 1.2.0 + * @author Mathieu Faverge + * @author Florent Pruvost + * @date 2022-07-25 + * + */ +#ifndef _chameleon_lapack_h_ +#define _chameleon_lapack_h_ + +#include "chameleon/chameleon_slapack.h" +#include "chameleon/chameleon_dlapack.h" +#include "chameleon/chameleon_clapack.h" +#include "chameleon/chameleon_zlapack.h" + +#endif /* _chameleon_lapack_h_ */ diff --git a/compute/lapack_api/lapack_api_common.h b/lapack_api/include/lapack_api_common.h similarity index 85% rename from compute/lapack_api/lapack_api_common.h rename to lapack_api/include/lapack_api_common.h index 25eb831a0f1bc0ed0d8facf5f0569b8eb72b94df..bc46abf2beb3f07d70811d31cb7af092fad6e4b5 100644 --- a/compute/lapack_api/lapack_api_common.h +++ b/lapack_api/include/lapack_api_common.h @@ -18,9 +18,10 @@ #ifndef _lapack_api_common_h_ #define _lapack_api_common_h_ -#include "chameleon.h" -#include "chameleon/mangling.h" -#include "control/auxiliary.h" +#include <stdio.h> +#include <chameleon.h> +#include <chameleon/mangling.h> +#include <coreblas/cblas_wrapper.h> /** * diff --git a/compute/lapack_api/lapack_api_common.c b/lapack_api/src/lapack_api_common.c similarity index 88% rename from compute/lapack_api/lapack_api_common.c rename to lapack_api/src/lapack_api_common.c index 5e98934bf969f0b4af014064f307b19eef355403..5ab9e261e5ff0f12c6f5e3bc65024a4634fca146 100644 --- a/compute/lapack_api/lapack_api_common.c +++ b/lapack_api/src/lapack_api_common.c @@ -33,7 +33,7 @@ int chameleon_blastocblas_trans(const char* trans) } else if ( (*trans == 'C') || (*trans == 'c') ) { return CblasConjTrans; } else { - chameleon_error("chameleon_blastocblas_trans", "illegal value of BLAS transpose parameter"); + fprintf(stderr, "CHAMELEON ERROR: %s(): %s\n", "chameleon_blastocblas_trans", "illegal value of BLAS transpose parameter"); return CHAMELEON_ERR_ILLEGAL_VALUE; } } diff --git a/compute/lapack_api/lapack_zgemm.c b/lapack_api/src/lapack_zgemm.c similarity index 97% rename from compute/lapack_api/lapack_zgemm.c rename to lapack_api/src/lapack_zgemm.c index f36600a4c43b34450b81d123b5cbc80964bda4cc..d3723b9617f6dd9461dc4dd19ed6411fdd2a63fe 100644 --- a/compute/lapack_api/lapack_zgemm.c +++ b/lapack_api/src/lapack_zgemm.c @@ -125,7 +125,7 @@ void CHAMELEON_cblas_zgemm( const CBLAS_ORDER Order, const CBLAS_TRANSPOSE Trans const void *beta, CHAMELEON_Complex64_t *C, const int ldc ) { if (Order != CblasColMajor){ - chameleon_error("CHAMELEON_cblas_zgemm", "illegal value of order"); + fprintf(stderr, "CHAMELEON ERROR: %s(): %s\n", "CHAMELEON_cblas_zgemm", "illegal value of order"); } #if defined(PRECISION_z) || defined(PRECISION_c) diff --git a/lib/pkgconfig/chameleon_lapack.pc.in b/lib/pkgconfig/chameleon_lapack.pc.in new file mode 100644 index 0000000000000000000000000000000000000000..242b8e67990c163a721cad21040e05ab0ef0130b --- /dev/null +++ b/lib/pkgconfig/chameleon_lapack.pc.in @@ -0,0 +1,23 @@ +# +# @file chameleon_lapack.pc +# +# @copyright 2022-2022 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, +# Univ. Bordeaux. All rights reserved. +# +# @version 1.2.0 +# @author Florent Pruvost +# @date 2022-07-25 +# +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${exec_prefix}/include + +Name: chameleon_lapack +Description: Lapack API to the Chameleon library for Scalable multi-core and GPGPUs +Version: @CHAMELEON_VERSION@ +Cflags: @CHAMELEON_LAPACK_PKGCONFIG_DEFINITIONS@ -I${includedir} +Libs: -L${libdir} @CHAMELEON_LAPACK_PKGCONFIG_LIBS@ +Libs.private: @CHAMELEON_LAPACK_PKGCONFIG_LIBS_PRIVATE@ +Requires: @CHAMELEON_LAPACK_PKGCONFIG_REQUIRED@ +Requires.private: @CHAMELEON_LAPACK_PKGCONFIG_REQUIRED_PRIVATE@ diff --git a/testing/CMakeLists.txt b/testing/CMakeLists.txt index a2216fb2d7d20a565a751562b4521a3ba46495fb..ae8d74f73579b4fe851cf31d558d2cb07108f0bc 100644 --- a/testing/CMakeLists.txt +++ b/testing/CMakeLists.txt @@ -167,6 +167,7 @@ foreach(_precision ${CHAMELEON_PRECISION} ) ${CHAMELEON_BINARY_DIR}/coreblas/include ) + target_link_libraries(${__target_name} PRIVATE chameleon_lapack) target_link_libraries(${__target_name} PRIVATE chameleon) if(NOT CHAMELEON_SIMULATION) target_link_libraries(${__target_name} PRIVATE diff --git a/testing/testings.h b/testing/testings.h index 5326b192250ccce54602a854cab040ad21619820..0b57e924963ece02f464e03f16efc9a30954b74c 100644 --- a/testing/testings.h +++ b/testing/testings.h @@ -18,6 +18,7 @@ #ifndef _testings_h_ #define _testings_h_ +#include <chameleon_lapack.h> #include <chameleon.h> #include <stdlib.h> #include <stdio.h>