diff --git a/CMakeLists.txt b/CMakeLists.txt index ddad6ab292083638bf3a78953b238d43812c91e0..5b7a6af285fa99b383a5fdee6c8eea95ce913917 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,6 +108,24 @@ option(BUILD_SHARED_LIBS "Build shared libraries" OFF) set( RP_CHAMELEON_DICTIONNARY ${CMAKE_SOURCE_DIR}/cmake_modules/local_subs.py ) set( RP_CHAMELEON_PRECISIONS "s;d;c;z" ) include(RulesPrecisions) +# Check that at least one option CHAMELEON_PREC_ is set to ON +# count number of CHAMELEON_PREC_ sets to ON +math(EXPR number_of_active_prec 0) +set(CHAMELEON_PRECISIONS "") +foreach (prec ${RP_CHAMELEON_PRECISIONS}) + string(TOUPPER ${prec} PREC) + if (CHAMELEON_PREC_${PREC}) + math(EXPR number_of_active_prec "${number_of_active_prec}+1") + list(APPEND CHAMELEON_PRECISIONS ${PREC}) + endif() +endforeach() +message("-- ${BoldGreen}Floating point precisions enabled (${number_of_active_prec}): ${CHAMELEON_PRECISIONS}.") +if (number_of_active_prec STREQUAL 0) + message(FATAL_ERROR + "Number of active precision is ${number_of_active_prec}, " + "the user should activate at least one precision in the list: " + "CHAMELEON_PREC_S;CHAMELEON_PREC_D;CHAMELEON_PREC_C;CHAMELEON_PREC_Z.") +endif() # Options to select the runtime # ----------------------------- diff --git a/cmake_modules/PrintOpts.cmake b/cmake_modules/PrintOpts.cmake index c439626b1739980c5201303e9826f723f6b4d792..a8b10c3bbf28d0a9800d8f3511d805a9f93d96d1 100644 --- a/cmake_modules/PrintOpts.cmake +++ b/cmake_modules/PrintOpts.cmake @@ -69,6 +69,9 @@ set(dep_message "${dep_message}" " LDFlags .............: ${CMAKE_C_LINK_FLAGS}\n" " EXE LDFlags .........: ${CMAKE_EXE_LINKER_FLAGS}\n" "\n" +" Floating points precisions enabled\n" +" CHAMELEON_PRECISIONS : ${CHAMELEON_PRECISIONS}\n" +"\n" " Implementation paradigm\n" " CUDA ................: ${CHAMELEON_USE_CUDA}\n" " MPI .................: ${CHAMELEON_USE_MPI}\n" diff --git a/control/tile.c b/control/tile.c index 6437d6cb971ff2a8e2e8fde65e07c0d23b19ea59..2cb446643fdb123486a0501740c25ba31d788bf4 100644 --- a/control/tile.c +++ b/control/tile.c @@ -117,20 +117,29 @@ CHAMELEON_Tile_to_Lapack( CHAM_desc_t *A, void *Af77, int LDA ) int CHAMELEON_Lap2Desc( cham_uplo_t uplo, void *Af77, int LDA, CHAM_desc_t *A ) { switch( A->dtyp ) { +#if defined(PRECISION_z) case ChamComplexDouble: return CHAMELEON_zLap2Desc( uplo, (CHAMELEON_Complex64_t *)Af77, LDA, A ); break; +#endif +#if defined(PRECISION_c) case ChamComplexFloat: return CHAMELEON_cLap2Desc( uplo, (CHAMELEON_Complex32_t *)Af77, LDA, A ); break; +#endif +#if defined(PRECISION_s) case ChamRealFloat: return CHAMELEON_sLap2Desc( uplo, (float *)Af77, LDA, A ); break; +#endif +#if defined(PRECISION_d) case ChamRealDouble: - default: return CHAMELEON_dLap2Desc( uplo, (double *)Af77, LDA, A ); + break; +#endif + default: + return CHAMELEON_ERR_ILLEGAL_VALUE; } - return CHAMELEON_ERR_ILLEGAL_VALUE; } /** @@ -164,18 +173,27 @@ int CHAMELEON_Lap2Desc( cham_uplo_t uplo, void *Af77, int LDA, CHAM_desc_t *A ) int CHAMELEON_Desc2Lap( cham_uplo_t uplo, CHAM_desc_t *A, void *Af77, int LDA ) { switch( A->dtyp ) { +#if defined(PRECISION_z) case ChamComplexDouble: return CHAMELEON_zDesc2Lap( uplo, A, (CHAMELEON_Complex64_t *)Af77, LDA ); break; +#endif +#if defined(PRECISION_c) case ChamComplexFloat: return CHAMELEON_cDesc2Lap( uplo, A, (CHAMELEON_Complex32_t *)Af77, LDA ); break; +#endif +#if defined(PRECISION_s) case ChamRealFloat: return CHAMELEON_sDesc2Lap( uplo, A, (float *)Af77, LDA ); break; +#endif +#if defined(PRECISION_d) case ChamRealDouble: - default: return CHAMELEON_dDesc2Lap( uplo, A, (double *)Af77, LDA ); + break; +#endif + default: + return CHAMELEON_ERR_ILLEGAL_VALUE; } - return CHAMELEON_ERR_ILLEGAL_VALUE; }