diff --git a/.gitignore b/.gitignore index bfc521e..d9a4d18 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ *~ lib.grd nohup.out +build/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index c40bb41..73fd567 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,9 @@ set (OpenVML_VERSION_PATCH 1) set (OpenVML_ARCH "generic") set (OpenVML_CPU_CORENAME "generic") +set (OpenVML_FUNC_PREFIX "") +set (OpenVML_FUNC_SUFFIX "") + include_directories("${PROJECT_BINARY_DIR}") include_directories("${PROJECT_BINARY_DIR}/include") include_directories("${PROJECT_SOURCE_DIR}/include") @@ -21,7 +24,6 @@ configure_file ( ) - SET(CMAKE_POSITION_INDEPENDENT_CODE ON) set(OpenVML_LIBSRC_S "") @@ -32,9 +34,36 @@ set(OpenVML_LIBSRC_OTHER "") #define -DDOUBLE for double precision set(OpenVML_S_DEFINITIONS "") -set(OpenVML_D_DEFINITIONS "DOUBLE") -set(OpenVML_C_DEFINITIONS "COMPLEX") -set(OpenVML_Z_DEFINITIONS "COMPLEX DOUBLE") +set(OpenVML_D_DEFINITIONS DOUBLE) +set(OpenVML_C_DEFINITIONS COMPLEX) +set(OpenVML_Z_DEFINITIONS COMPLEX DOUBLE) + + + +########################################################## +# For RPATH http://www.cmake.org/Wiki/CMake_RPATH_handling +# +set(CMAKE_MACOSX_RPATH 1) +# use, i.e. don't skip the full RPATH for the build tree +SET(CMAKE_SKIP_BUILD_RPATH FALSE) + +# when building, don't use the install RPATH already +# (but later on when installing) +SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) +SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") + +# add the automatically determined parts of the RPATH +# which point to directories outside the build tree to the install RPATH +SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + + +# the RPATH to be used when installing, but only if it's not a system directory +LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) +IF("${isSystemDir}" STREQUAL "-1") + SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") +ENDIF("${isSystemDir}" STREQUAL "-1") +########################################################## + add_subdirectory(interface) add_subdirectory(kernel) @@ -72,3 +101,4 @@ install(FILES ${PROJECT_BINARY_DIR}/openvml_export.h DESTINATION include) install(FILES ${PROJECT_BINARY_DIR}/include/openvml_config.h DESTINATION include) install(FILES ${PROJECT_SOURCE_DIR}/include/openvml.h DESTINATION include) install(FILES ${PROJECT_SOURCE_DIR}/include/openvml_common.h DESTINATION include) + diff --git a/include/openvml.h b/include/openvml.h index 9f61926..9e48bf1 100644 --- a/include/openvml.h +++ b/include/openvml.h @@ -8,11 +8,11 @@ extern "C" { #endif -OPENVML_EXPORT void vsAdd(VML_INT n, const float * a, const float * b, float * y); -OPENVML_EXPORT void vdAdd(VML_INT n, const double * a, const double * b, double * y); +OPENVML_EXPORT void OpenVML_FUNCNAME(vsAdd)(VML_INT n, const float * a, const float * b, float * y); +OPENVML_EXPORT void OpenVML_FUNCNAME(vdAdd)(VML_INT n, const double * a, const double * b, double * y); -OPENVML_EXPORT void vsSub(VML_INT n, const float * a, const float * b, float * y); -OPENVML_EXPORT void vdSub(VML_INT n, const double * a, const double * b, double * y); +OPENVML_EXPORT void OpenVML_FUNCNAME(vsSub)(VML_INT n, const float * a, const float * b, float * y); +OPENVML_EXPORT void OpenVML_FUNCNAME(vdSub)(VML_INT n, const double * a, const double * b, double * y); #ifdef __cplusplus } diff --git a/include/openvml_common.h b/include/openvml_common.h index 423ae25..8d3b168 100644 --- a/include/openvml_common.h +++ b/include/openvml_common.h @@ -3,6 +3,12 @@ #include "openvml_config.h" +#ifdef DOUBLE +typedef double VML_FLOAT; +#else +typedef float VML_FLOAT; +#endif + #if defined(OS_WINDOWS) && defined(__64BIT__) typedef long long VMLLONG; typedef unsigned long long VMLULONG; @@ -17,4 +23,9 @@ typedef VMLLONG VML_INT; typedef int VML_INT; #endif +#define OpenVML_FUNCNAME_3(pre,x,suf) pre##x##suf +#define OpenVML_FUNCNAME_2(pre,x,suf) OpenVML_FUNCNAME_3(pre, x, suf) +#define OpenVML_FUNCNAME_1(x) OpenVML_FUNCNAME_2(OPENVML_FUNC_PREFIX, x, OPENVML_FUNC_SUFFIX) +#define OpenVML_FUNCNAME(x) OpenVML_FUNCNAME_1(x) + #endif \ No newline at end of file diff --git a/include/openvml_config.h.in b/include/openvml_config.h.in index 2302fad..066c35b 100644 --- a/include/openvml_config.h.in +++ b/include/openvml_config.h.in @@ -2,6 +2,9 @@ #define OPENVML_VERSION_MINOR @OpenVML_VERSION_MINOR@ #define OPENVML_VERSION_PATCH @OpenVML_VERSION_PATCH@ +#define OPENVML_FUNC_PREFIX @OpenVML_FUNC_PREFIX@ +#define OPENVML_FUNC_SUFFIX @OpenVML_FUNC_SUFFIX@ + #cmakedefine USE64BITINT #cmakedefine __64BIT__ #cmakedefine OS_WINDOWS diff --git a/include/openvml_kernel.h b/include/openvml_kernel.h index f0c9bdd..9104bec 100644 --- a/include/openvml_kernel.h +++ b/include/openvml_kernel.h @@ -2,8 +2,12 @@ #define _OPENVML_KERNEL_H_ #include "openvml_common.h" +#include "openvml_macros.h" -void sadd_k(VMLLONG n, float * a, float * b, float * y); -void dadd_k(VMLLONG n, float * a, float * b, float * y); +void OpenVML_FUNCNAME(sadd_k)(VMLLONG n, float * a, float * b, float * y); +void OpenVML_FUNCNAME(dadd_k)(VMLLONG n, double * a, double * b, double * y); + +void OpenVML_FUNCNAME(ssub_k)(VMLLONG n, float * a, float * b, float * y); +void OpenVML_FUNCNAME(dsub_k)(VMLLONG n, double * a, double * b, double * y); #endif \ No newline at end of file diff --git a/include/openvml_macros.h b/include/openvml_macros.h index 4e32189..46c7cc4 100644 --- a/include/openvml_macros.h +++ b/include/openvml_macros.h @@ -1,24 +1,35 @@ #ifndef _OPENVML_MACROS_H_ #define _OPENVML_MACROS_H_ -#define SADD_K sadd_k +#define SADD_K OpenVML_FUNCNAME(sadd_k) +#define DADD_K OpenVML_FUNCNAME(dadd_k) +//reuse +#define CADD_K OpenVML_FUNCNAME(sadd_k) +#define ZADD_K OpenVML_FUNCNAME(dadd_k) -#define DADD_K dadd_k - +#define SSUB_K OpenVML_FUNCNAME(ssub_k) +#define DSUB_K OpenVML_FUNCNAME(dsub_k) +//reuse +#define CSUB_K OpenVML_FUNCNAME(ssub_k) +#define ZSUB_K OpenVML_FUNCNAME(dsub_k) #ifndef COMPLEX #ifndef DOUBLE #define ADD_K SADD_K +#define SUB_K SSUB_K #else #define ADD_K DADD_K +#define SUB_K DSUB_K #endif #else #ifndef DOUBLE #define ADD_K CADD_K +#define SUB_K CSUB_K #else #define ADD_K ZADD_K +#define SUB_K CSUB_K #endif #endif diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 9803d14..bb5c8c2 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -8,6 +8,13 @@ set(OpenVML_LIBSRC_Z "") set(REAL_INTERFACE_LIST add sub) set(COMPLEX_INTERFACE_LIST add sub) +function(cap_string var_name var_name_cap) + string(SUBSTRING ${var_name} 0 1 FIRST_LETTER) + string(TOUPPER ${FIRST_LETTER} FIRST_LETTER) + string(REGEX REPLACE "^.(.*)" "${FIRST_LETTER}\\1" PROTO_NAME_CAP "${var_name}") + set(${var_name_cap} ${PROTO_NAME_CAP} PARENT_SCOPE) +endfunction() + foreach(INTERFACE ${REAL_INTERFACE_LIST}) set(OpenVML_LIBSRC_S @@ -20,6 +27,18 @@ foreach(INTERFACE ${REAL_INTERFACE_LIST}) ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c ) + set(OpenVML_INTERFACE_NAME "") + + cap_string(${INTERFACE} OpenVML_INTERFACE_NAME) + + set_property(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/${INTERFACE}.c + APPEND + PROPERTY COMPILE_DEFINITIONS ${OpenVML_S_DEFINITIONS} ) + + set_property(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/${INTERFACE}.c + APPEND + PROPERTY COMPILE_DEFINITIONS CNAME=${OpenVML_FUNC_PREFIX}vs${OpenVML_INTERFACE_NAME}${OpenVML_FUNC_SUFFIX} ) + add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c DEPENDS ${INTERFACE}.c COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${INTERFACE}.c ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c @@ -29,6 +48,10 @@ foreach(INTERFACE ${REAL_INTERFACE_LIST}) APPEND PROPERTY COMPILE_DEFINITIONS ${OpenVML_D_DEFINITIONS} ) + set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c + APPEND + PROPERTY COMPILE_DEFINITIONS CNAME=${OpenVML_FUNC_PREFIX}vd${OpenVML_INTERFACE_NAME}${OpenVML_FUNC_SUFFIX} ) + endforeach(INTERFACE) add_library(openvml_interface_core OBJECT ${OpenVML_LIBSRC_S} ${OpenVML_LIBSRC_D} ${OpenVML_LIBSRC_C} ${OpenVML_LIBSRC_Z} ${OpenVML_LIBSRC_OTHER}) diff --git a/interface/add.c b/interface/add.c index 05527e3..e66b013 100644 --- a/interface/add.c +++ b/interface/add.c @@ -1,12 +1,10 @@ #include #include -#include -#ifndef DOUBLE -void vsAdd(VML_INT n, const float * a, const float * b, float * y) { -#else -void vdAdd(VML_INT n, const double * a, const double * b, double * y) { -#endif +void CNAME(VML_INT n, const VML_FLOAT * a, const VML_FLOAT * b, VML_FLOAT * y) { + + if (n<=0) return; + + ADD_K(n, (VML_FLOAT*)a, (VML_FLOAT*)b, y); - printf("%s", __func__); } diff --git a/interface/sub.c b/interface/sub.c index 51727df..7b46de6 100644 --- a/interface/sub.c +++ b/interface/sub.c @@ -1,12 +1,10 @@ #include #include -#include -#ifndef DOUBLE -void vsSub(VML_INT n, const float * a, const float * b, float * y) { -#else -void vdSub(VML_INT n, const double * a, const double * b, double * y) { -#endif +void CNAME(VML_INT n, const VML_FLOAT * a, const VML_FLOAT * b, VML_FLOAT * y) { + + if(n<=0) return; + + SUB_K(n, (VML_FLOAT*)a, (VML_FLOAT *)b, y); - printf("%s", __func__); } diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index ef64956..c640ec4 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -32,6 +32,10 @@ foreach(KERNEL ${KERNEL_LIST}) APPEND PROPERTY COMPILE_DEFINITIONS ${OpenVML_S_DEFINITIONS} ) + set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_s_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c + APPEND + PROPERTY COMPILE_DEFINITIONS KERNEL_NAME=${OpenVML_FUNC_PREFIX}s${KERNEL}_k${OpenVML_FUNC_SUFFIX} ) + set(D_KERNEL_SOURCE ${${KERNEL}_D_KERNEL_SOURCE}) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_d_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${D_KERNEL_SOURCE} @@ -42,6 +46,10 @@ foreach(KERNEL ${KERNEL_LIST}) APPEND PROPERTY COMPILE_DEFINITIONS ${OpenVML_D_DEFINITIONS} ) + set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_d_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c + APPEND + PROPERTY COMPILE_DEFINITIONS KERNEL_NAME=${OpenVML_FUNC_PREFIX}d${KERNEL}_k${OpenVML_FUNC_SUFFIX}) + endforeach(KERNEL) add_library(openvml_kernel_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}_core OBJECT ${OpenVML_LIBSRC_S} ${OpenVML_LIBSRC_D} ${OpenVML_LIBSRC_C} ${OpenVML_LIBSRC_Z}) diff --git a/kernel/generic/add_kernel.c b/kernel/generic/add_kernel.c index 6e0fd90..dd793f1 100644 --- a/kernel/generic/add_kernel.c +++ b/kernel/generic/add_kernel.c @@ -1,10 +1,9 @@ #include "openvml_kernel.h" -#ifndef DOUBLE -void sadd_k(VMLLONG n, float * a, float * b, float * y) { -#else -void dadd_k(VMLLONG n, float * a, float * b, float * y) { -#endif - +void KERNEL_NAME(VMLLONG n, VML_FLOAT * a, VML_FLOAT * b, VML_FLOAT * y) { + VMLLONG i=0; + for(i=0; i