Skip to content

Commit

Permalink
Separate scalar lib (#403)
Browse files Browse the repository at this point in the history
With this patch, the scalar functions implemented in sleefdp.c and sleefsp.c will be included in libsleefscalar.
The functions with the same names in libsleef will be aliases to the dispatcher added in PR #402.
By modifying like this, the scalar functions will run faster on computers with FMA support.
  • Loading branch information
shibatch committed Feb 2, 2021
1 parent 2e762b8 commit 263098d
Show file tree
Hide file tree
Showing 8 changed files with 294 additions and 83 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ option(BUILD_LIBM "libsleef will be built." ON)
option(BUILD_DFT "libsleefdft will be built." OFF)
option(BUILD_QUAD "libsleefquad will be built." OFF)
option(BUILD_GNUABI_LIBS "libsleefgnuabi will be built." ON)
option(BUILD_SCALAR_LIB "libsleefscalar will be built." OFF)
option(BUILD_TESTS "Tests will be built." ON)
option(BUILD_INLINE_HEADERS "Build header for inlining whole SLEEF functions" OFF)

Expand Down
52 changes: 26 additions & 26 deletions Jenkinsfile

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,22 @@ build_script:
- if "%DO_TEST%" == "TRUE" call p.bat

- if "%DO_TEST%" == "TRUE" cd "%BUILDFOLDER%"
- if "%DO_TEST%" == "TRUE" "C:\\Cygwin64\\bin\\bash" -c 'mkdir build-cygwin;cd build-cygwin;cmake -G Ninja -DRUNNING_ON_APPVEYOR=TRUE -DBUILD_QUAD=TRUE -DBUILD_DFT=FALSE -DBUILD_INLINE_HEADERS=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE4=TRUE ..;ninja'
- if "%DO_TEST%" == "TRUE" "C:\\Cygwin64\\bin\\bash" -c 'mkdir build-cygwin;cd build-cygwin;cmake -G Ninja -DRUNNING_ON_APPVEYOR=TRUE -DBUILD_SCALAR_LIB=TRUE -DBUILD_QUAD=TRUE -DBUILD_DFT=FALSE -DBUILD_INLINE_HEADERS=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE4=TRUE ..;ninja'
- if "%DO_TEST%" == "TRUE" cd "%BUILDFOLDER%"
- if "%DO_TEST%" == "TRUE" "C:\\Cygwin64\\bin\\bash" -c 'cd build-cygwin;ctest -j `nproc`'
- if "%DO_TEST%" == "TRUE" cd "%BUILDFOLDER%"
- if "%DO_TEST%" == "TRUE" del /Q /F build-cygwin\bin\iut*
- if "%DO_TEST%" == "TRUE" del /Q /F build-cygwin\bin\qiut*
- if "%DO_TEST%" == "TRUE" cd "%BUILDFOLDER%"
- if "%DO_TEST%" == "TRUE" "C:\\Cygwin64\\bin\\bash" -c 'mkdir build-mingw;cd build-mingw;CC=x86_64-w64-mingw32-gcc cmake -G Ninja .. -DRUNNING_ON_APPVEYOR=TRUE -DBUILD_SHARED_LIBS=FALSE -DBUILD_QUAD=TRUE -DBUILD_DFT=FALSE -DBUILD_INLINE_HEADERS=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE4=TRUE -DDISABLE_AVX512F=TRUE;ninja'
- if "%DO_TEST%" == "TRUE" "C:\\Cygwin64\\bin\\bash" -c 'mkdir build-mingw;cd build-mingw;CC=x86_64-w64-mingw32-gcc cmake -G Ninja .. -DRUNNING_ON_APPVEYOR=TRUE -DBUILD_SHARED_LIBS=FALSE -DBUILD_SCALAR_LIB=TRUE -DBUILD_QUAD=TRUE -DBUILD_DFT=FALSE -DBUILD_INLINE_HEADERS=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE4=TRUE -DDISABLE_AVX512F=TRUE;ninja'
- if "%DO_TEST%" == "TRUE" cd "%BUILDFOLDER%"
- if "%DO_TEST%" == "TRUE" "C:\\Cygwin64\\bin\\bash" -c 'cd build-mingw;ctest -j `nproc`'
- if "%DO_TEST%" == "TRUE" echo PATH %ORGPATH%;c:\Cygwin64\bin;c:\Cygwin64\usr\bin;%CD%\build-cygwin\bin;%CD%\build\bin > q.bat
- if "%DO_TEST%" == "TRUE" powershell -Command "(gc q.bat) -replace ' ;', ';' | Out-File -encoding ASCII p.bat"
- if "%DO_TEST%" == "TRUE" call p.bat
- mkdir build
- cd build
- cmake -G"Visual Studio 16 2019" .. -DRUNNING_ON_APPVEYOR=TRUE -DCMAKE_INSTALL_PREFIX=install -DSLEEF_SHOW_CONFIG=1 -DSLEEF_SHOW_ERROR_LOG=1 -DENFORCE_TESTER3=TRUE -DBUILD_QUAD=TRUE -DBUILD_DFT=TRUE -DBUILD_INLINE_HEADERS=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE4=TRUE -DENFORCE_AVX=TRUE -DENFORCE_FMA4=TRUE -DENFORCE_AVX2=TRUE -DENFORCE_AVX512F=TRUE %ENV_BUILD_STATIC%
- cmake -G"Visual Studio 16 2019" .. -DRUNNING_ON_APPVEYOR=TRUE -DCMAKE_INSTALL_PREFIX=install -DSLEEF_SHOW_CONFIG=1 -DSLEEF_SHOW_ERROR_LOG=1 -DENFORCE_TESTER3=TRUE -DBUILD_SCALAR_LIB=TRUE -DBUILD_QUAD=TRUE -DBUILD_DFT=TRUE -DBUILD_INLINE_HEADERS=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE4=TRUE -DENFORCE_AVX=TRUE -DENFORCE_FMA4=TRUE -DENFORCE_AVX2=TRUE -DENFORCE_AVX512F=TRUE %ENV_BUILD_STATIC%
- cmake --build . --target install --config Release
- if "%DO_TEST%" == "TRUE" (ctest --output-on-failure -j 16 -C Release)
- cd "%BUILDFOLDER%"
Expand All @@ -46,7 +46,7 @@ build_script:
- call p.bat
- mkdir build-clang
- cd build-clang
- cmake -G Ninja .. -DRUNNING_ON_APPVEYOR=TRUE -DCMAKE_C_COMPILER:PATH="C:\Program Files\LLVM\bin\clang.exe" -DCMAKE_INSTALL_PREFIX=install -DSLEEF_SHOW_CONFIG=1 -DSLEEF_SHOW_ERROR_LOG=1 -DENFORCE_TESTER3=TRUE -DBUILD_INLINE_HEADERS=TRUE -DBUILD_QUAD=TRUE -DBUILD_DFT=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE4=TRUE -DENFORCE_AVX=TRUE -DENFORCE_FMA4=TRUE -DENFORCE_AVX2=TRUE -DENFORCE_AVX512F=TRUE %ENV_BUILD_STATIC%
- cmake -G Ninja .. -DRUNNING_ON_APPVEYOR=TRUE -DCMAKE_C_COMPILER:PATH="C:\Program Files\LLVM\bin\clang.exe" -DCMAKE_INSTALL_PREFIX=install -DSLEEF_SHOW_CONFIG=1 -DSLEEF_SHOW_ERROR_LOG=1 -DENFORCE_TESTER3=TRUE -DBUILD_INLINE_HEADERS=TRUE -DBUILD_SCALAR_LIB=TRUE -DBUILD_QUAD=TRUE -DBUILD_DFT=TRUE -DENFORCE_SSE2=TRUE -DENFORCE_SSE4=TRUE -DENFORCE_AVX=TRUE -DENFORCE_FMA4=TRUE -DENFORCE_AVX2=TRUE -DENFORCE_AVX512F=TRUE %ENV_BUILD_STATIC%
- ninja
test_script:
- if "%DO_TEST%" == "TRUE" (ctest --output-on-failure -j 16 -C Release)
18 changes: 10 additions & 8 deletions src/libm-tester/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -362,14 +362,6 @@ endif(ENABLE_GNUABI)

#

# iutdspscalar
add_executable(iutdspscalar ${IUT_SRC})
target_compile_definitions(iutdspscalar PRIVATE ENABLE_DSP_SCALAR=1 ${COMMON_TARGET_DEFINITIONS})
target_link_libraries(iutdspscalar ${TARGET_LIBSLEEF} ${LIBM} ${LIBRT})
add_dependencies(iutdspscalar ${TARGET_HEADERS} ${TARGET_LIBSLEEF})
add_test_iut(iutdspscalar 1.0)
list(APPEND IUT_LIST iutdspscalar)

if (SLEEF_ARCH_X86)
# iutdsp128
add_executable(iutdsp128 ${IUT_SRC})
Expand Down Expand Up @@ -410,6 +402,16 @@ if (SLEEF_ARCH_S390X)
list(APPEND IUT_LIST iutdsp128)
endif(SLEEF_ARCH_S390X)

if(BUILD_SCALAR_LIB)
# Compile executable 'iutscalar'
add_executable(iutscalar iut.c testerutil.c)
target_compile_definitions(iutscalar PRIVATE ${COMMON_TARGET_DEFINITIONS})
target_link_libraries(iutscalar sleefscalar ${TARGET_LIBSLEEF} ${LIBM} ${LIBRT})
set_target_properties(iutscalar PROPERTIES ${COMMON_TARGET_PROPERTIES})
add_test_iut(iutscalar 1.0)
list(APPEND IUT_LIST iutscalar)
endif()

if(LIB_MPFR AND NOT MINGW)
# Build tester2 scalar
foreach(P dp sp)
Expand Down
51 changes: 33 additions & 18 deletions src/libm/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,6 @@ if(ENABLE_GNUABI)
list(APPEND HEADER_GENERATED ${HEADER_MASKED_${SIMD}_${T}_GNUABI})

add_custom_command(OUTPUT ${HEADER_MASKED_${SIMD}_${T}_GNUABI}
COMMAND echo Generating ${HEADER_MASKED_${SIMD}_${T}_GNUABI}
COMMAND $<TARGET_FILE:${TARGET_MKMASKED_GNUABI}> ${MKMASKED_PARAMS_GNUABI_${SIMD}_${T}} > ${HEADER_MASKED_${SIMD}_${T}_GNUABI}
DEPENDS ${TARGET_MKMASKED_GNUABI}
)
Expand Down Expand Up @@ -351,7 +350,7 @@ if (ENABLE_LTO)
endif()

# Original sleef sources
set(STANDARD_SOURCES sleefdp.c sleefsp.c rempitab.c)
set(STANDARD_SOURCES rempitab.c)

add_library(${TARGET_LIBSLEEF} ${STANDARD_SOURCES})
add_dependencies(${TARGET_LIBSLEEF} ${TARGET_HEADERS})
Expand Down Expand Up @@ -420,7 +419,6 @@ foreach(SIMD ${SLEEF_SUPPORTED_LIBM_EXTENSIONS})
else()
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h
COMMENT "Generating alias_${SIMDLC}.h"
COMMAND $<TARGET_FILE:${TARGET_MKALIAS}> ${ALIAS_PARAMS_${SIMD}_SP} > ${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h
COMMAND $<TARGET_FILE:${TARGET_MKALIAS}> ${ALIAS_PARAMS_${SIMD}_DP} >> ${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h
DEPENDS ${TARGET_MKALIAS}
Expand Down Expand Up @@ -488,8 +486,6 @@ if(BUILD_INLINE_HEADERS)
set(INLINE_HEADER_FILE ${PROJECT_BINARY_DIR}/include/sleefinline_${SIMDLC}.h)
add_custom_command(
OUTPUT ${INLINE_HEADER_FILE}

COMMAND echo Generating sleefinline_${SIMDLC}.h

# Preprocess sleefsimddp.c with SLEEF_GENHEADER defined, comments are preserved
COMMAND "${CMAKE_C_COMPILER}" ${FLAG_PREPROCESS} ${FLAG_PRESERVE_COMMENTS} # gcc -E -C
Expand Down Expand Up @@ -571,8 +567,6 @@ if(BUILD_INLINE_HEADERS)

add_custom_command(
OUTPUT ${INLINE_HEADER_FILE}

COMMAND echo Generating sleefinline_${SIMDLC}.h

# Preprocess sleefsimddp.c with SLEEF_GENHEADER defined, comments are preserved
COMMAND "${CMAKE_C_COMPILER}" ${FLAG_PREPROCESS} ${FLAG_PRESERVE_COMMENTS} # gcc -E -C
Expand Down Expand Up @@ -675,17 +669,16 @@ target_sources(${TARGET_LIBSLEEF} PRIVATE $<TARGET_OBJECTS:${TARGET_LIBCOMMON_OB
# Target dispscalar.c

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dispscalar.c
COMMENT "Generating dispscalar.c"
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/dispscalar.c.org ${CMAKE_CURRENT_BINARY_DIR}/dispscalar.c
COMMAND $<TARGET_FILE:${TARGET_MKDISP}> 1 1 double float int32_t purec purecfma x >> ${CMAKE_CURRENT_BINARY_DIR}/dispscalar.c
DEPENDS ${TARGET_MKDISP}
COMMAND $<TARGET_FILE:addSuffix> ${CMAKE_CURRENT_SOURCE_DIR}/dispscalar_footer.c.org >> ${CMAKE_CURRENT_BINARY_DIR}/dispscalar.c
DEPENDS ${TARGET_MKDISP} addSuffix
)
add_custom_target(dispscalar.c_generated SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dispscalar.c)

# Target renamedspscalar.h

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/renamedspscalar.h
COMMENT "Generating renamedspscalar.h"
COMMAND $<TARGET_FILE:${TARGET_MKRENAME}> - 1 1 > ${CMAKE_CURRENT_BINARY_DIR}/include/renamedspscalar.h
DEPENDS ${TARGET_MKRENAME}
)
Expand All @@ -706,7 +699,6 @@ if (SLEEF_ARCH_X86)
# Target dispsse.c

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dispsse.c
COMMENT "Generating dispsse.c"
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/dispsse.c.org ${CMAKE_CURRENT_BINARY_DIR}/dispsse.c
COMMAND $<TARGET_FILE:${TARGET_MKDISP}> 2 4 __m128d __m128 __m128i sse2 sse4 avx2128 >> ${CMAKE_CURRENT_BINARY_DIR}/dispsse.c
DEPENDS ${TARGET_MKDISP}
Expand All @@ -716,7 +708,6 @@ if (SLEEF_ARCH_X86)
# Target renamedsp128.h

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/renamedsp128.h
COMMENT "Generating renamedsp128.h"
COMMAND $<TARGET_FILE:${TARGET_MKRENAME}> - 2 4 > ${CMAKE_CURRENT_BINARY_DIR}/include/renamedsp128.h
DEPENDS ${TARGET_MKRENAME}
)
Expand All @@ -725,7 +716,6 @@ if (SLEEF_ARCH_X86)
# Target dispavx.c

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dispavx.c
COMMENT "Generating dispavx.c"
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/dispavx.c.org ${CMAKE_CURRENT_BINARY_DIR}/dispavx.c
COMMAND $<TARGET_FILE:${TARGET_MKDISP}> 4 8 __m256d __m256 __m128i avx fma4 avx2 >> ${CMAKE_CURRENT_BINARY_DIR}/dispavx.c
DEPENDS ${TARGET_MKDISP}
Expand All @@ -735,7 +725,6 @@ if (SLEEF_ARCH_X86)
# Target renamedsp256.h

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/renamedsp256.h
COMMENT "Generating renamedsp256.h"
COMMAND $<TARGET_FILE:${TARGET_MKRENAME}> - 4 8 > ${CMAKE_CURRENT_BINARY_DIR}/include/renamedsp256.h
DEPENDS ${TARGET_MKRENAME}
)
Expand Down Expand Up @@ -778,7 +767,6 @@ if (SLEEF_ARCH_PPC64)
# Target disppower_128.c

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/disppower_128.c
COMMENT "Generating disppower_128.c"
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/disppower_128.c.org ${CMAKE_CURRENT_BINARY_DIR}/disppower_128.c
COMMAND $<TARGET_FILE:${TARGET_MKDISP}> 2 4 SLEEF_VECTOR_DOUBLE SLEEF_VECTOR_FLOAT SLEEF_VECTOR_INT vsx vsx3 x >> ${CMAKE_CURRENT_BINARY_DIR}/disppower_128.c
DEPENDS ${TARGET_MKDISP}
Expand All @@ -788,7 +776,6 @@ if (SLEEF_ARCH_PPC64)
# Target renamedsp128.h

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/renamedsp128.h
COMMENT "Generating renamedsp128.h"
COMMAND $<TARGET_FILE:${TARGET_MKRENAME}> - 2 4 > ${CMAKE_CURRENT_BINARY_DIR}/include/renamedsp128.h
DEPENDS ${TARGET_MKRENAME}
)
Expand Down Expand Up @@ -819,7 +806,6 @@ if (SLEEF_ARCH_S390X)
# Target disps390x_128.c

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/disps390x_128.c
COMMENT "Generating disps390x_128.c"
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/disps390x_128.c.org ${CMAKE_CURRENT_BINARY_DIR}/disps390x_128.c
COMMAND $<TARGET_FILE:${TARGET_MKDISP}> 2 4 SLEEF_VECTOR_DOUBLE SLEEF_VECTOR_FLOAT SLEEF_VECTOR_INT vxe vxe2 x >> ${CMAKE_CURRENT_BINARY_DIR}/disps390x_128.c
DEPENDS ${TARGET_MKDISP}
Expand All @@ -829,7 +815,6 @@ if (SLEEF_ARCH_S390X)
# Target renamedsp128.h

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/renamedsp128.h
COMMENT "Generating renamedsp128.h"
COMMAND $<TARGET_FILE:${TARGET_MKRENAME}> - 2 4 > ${CMAKE_CURRENT_BINARY_DIR}/include/renamedsp128.h
DEPENDS ${TARGET_MKRENAME}
)
Expand Down Expand Up @@ -990,6 +975,36 @@ if(CLANG_EXE_PATH AND SLEEF_ENABLE_LLVM_BITCODE)
install(FILES ${LLVM_BITCODE_OUTPUTS} DESTINATION "${CMAKE_INSTALL_LIBDIR}")
endif()

# --------------------------------------------------------------------
# TARGET_LIBSLEEFSCALAR
# --------------------------------------------------------------------
# Build scalar-only library from sleefdp.c and sleefsp.c

add_library(sleefscalar sleefdp.c sleefsp.c rempitab.c)
add_dependencies(sleefscalar ${TARGET_HEADERS})
set_target_properties(sleefscalar PROPERTIES
VERSION ${SLEEF_VERSION}
SOVERSION ${SLEEF_SOVERSION}
PUBLIC_HEADER ${SLEEF_INCLUDE_HEADER}
${COMMON_TARGET_PROPERTIES}
)

target_compile_definitions(sleefscalar
PRIVATE DORENAME=1 ${COMMON_TARGET_DEFINITIONS}
)

if(COMPILER_SUPPORTS_BUILTIN_MATH)
target_compile_definitions(sleefscalar PRIVATE ENABLE_BUILTIN_MATH=1)
endif()

if(BUILD_SCALAR_LIB)
install(TARGETS sleefscalar
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
RUNTIME DESTINATION bin
)
endif()

# --------------------------------------------------------------------
# Install
# --------------------------------------------------------------------
Expand Down
Loading

0 comments on commit 263098d

Please sign in to comment.