Skip to content

Commit

Permalink
Merge pull request #19 from xinhuang/ln
Browse files Browse the repository at this point in the history
AVX SIMD implementation for (s/d)ln/log1p
  • Loading branch information
xianyi committed May 26, 2015
2 parents 9661ef6 + e175968 commit c5ed13f
Show file tree
Hide file tree
Showing 26 changed files with 728 additions and 4 deletions.
6 changes: 6 additions & 0 deletions include/openvml.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ OPENVML_EXPORT void OpenVML_FUNCNAME(vdExp)(VML_INT n, const double * a, double
OPENVML_EXPORT void OpenVML_FUNCNAME(vsLog10)(VML_INT n, const float * a, float * y);
OPENVML_EXPORT void OpenVML_FUNCNAME(vdLog10)(VML_INT n, const double * a, double * y);

OPENVML_EXPORT void OpenVML_FUNCNAME(vsLn)(VML_INT n, const float * a, float * y);
OPENVML_EXPORT void OpenVML_FUNCNAME(vdLn)(VML_INT n, const double * a, double * y);

OPENVML_EXPORT void OpenVML_FUNCNAME(vsLog1p)(VML_INT n, const float * a, float * y);
OPENVML_EXPORT void OpenVML_FUNCNAME(vdLog1p)(VML_INT n, const double * a, double * y);

OPENVML_EXPORT void OpenVML_FUNCNAME(vsTanh)(VML_INT n, const float * a, float * y);
OPENVML_EXPORT void OpenVML_FUNCNAME(vdTanh)(VML_INT n, const double * a, double * y);

Expand Down
12 changes: 12 additions & 0 deletions include/openvml_kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,18 @@ void OpenVML_FUNCNAME(clog10_k)(VMLLONG n, float * a, float * b, float * y, floa
void OpenVML_FUNCNAME(zlog10_k)(VMLLONG n, double * a, double * b, double * y, double * z, double * other_params);


void OpenVML_FUNCNAME(sln_k)(VMLLONG n, float * a, float * b, float * y, float * z, float * other_params);
void OpenVML_FUNCNAME(dln_k)(VMLLONG n, double * a, double * b, double * y, double * z, double * other_params);
void OpenVML_FUNCNAME(cln_k)(VMLLONG n, float * a, float * b, float * y, float * z, float * other_params);
void OpenVML_FUNCNAME(zln_k)(VMLLONG n, double * a, double * b, double * y, double * z, double * other_params);


void OpenVML_FUNCNAME(slog1p_k)(VMLLONG n, float * a, float * b, float * y, float * z, float * other_params);
void OpenVML_FUNCNAME(dlog1p_k)(VMLLONG n, double * a, double * b, double * y, double * z, double * other_params);
void OpenVML_FUNCNAME(clog1p_k)(VMLLONG n, float * a, float * b, float * y, float * z, float * other_params);
void OpenVML_FUNCNAME(zlog1p_k)(VMLLONG n, double * a, double * b, double * y, double * z, double * other_params);


void OpenVML_FUNCNAME(stanh_k)(VMLLONG n, float * a, float * b, float * y, float * z, float * other_params);
void OpenVML_FUNCNAME(dtanh_k)(VMLLONG n, double * a, double * b, double * y, double * z, double * other_params);
void OpenVML_FUNCNAME(ctanh_k)(VMLLONG n, float * a, float * b, float * y, float * z, float * other_params);
Expand Down
17 changes: 17 additions & 0 deletions include/openvml_macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@
#define CLOG10_K OpenVML_FUNCNAME(clog10_k)
#define ZLOG10_K OpenVML_FUNCNAME(zlog10_k)

#define SLN_K OpenVML_FUNCNAME(sln_k)
#define DLN_K OpenVML_FUNCNAME(dln_k)
#define CLN_K OpenVML_FUNCNAME(cln_k)
#define ZLN_K OpenVML_FUNCNAME(zln_k)

#define SLOG1P_K OpenVML_FUNCNAME(slog1p_k)
#define DLOG1P_K OpenVML_FUNCNAME(dlog1p_k)
#define CLOG1P_K OpenVML_FUNCNAME(clog1p_k)
#define ZLOG1P_K OpenVML_FUNCNAME(zlog1p_k)

#define STANH_K OpenVML_FUNCNAME(stanh_k)
#define DTANH_K OpenVML_FUNCNAME(dtanh_k)
Expand All @@ -72,13 +81,17 @@
#define POW_K SPOW_K
#define EXP_K SEXP_K
#define LOG10_K SLOG10_K
#define LN_K SLN_K
#define LOG1P_K SLOG1P_K
#define TANH_K STANH_K
#else
#define ADD_K DADD_K
#define SUB_K DSUB_K
#define POW_K DPOW_K
#define EXP_K DEXP_K
#define LOG10_K DLOG10_K
#define LN_K DLN_K
#define LOG1P_K DLOG1P_K
#define TANH_K DTANH_K
#endif
#else
Expand All @@ -88,13 +101,17 @@
#define POW_K CPOW_K
#define EXP_K CEXP_K
#define LOG10_K CLOG10_K
#define LN_K CLN_K
#define LOG1P_K CLOG1P_K
#define TANH_K CTANH_K
#else
#define ADD_K ZADD_K
#define SUB_K ZSUB_K
#define POW_K ZPOW_K
#define EXP_K ZEXP_K
#define LOG10_K ZLOG10_K
#define LN_K ZLN_K
#define LOG1P_K ZLOG1P_K
#define TANH_K ZTANH_K
#endif
#endif
Expand Down
6 changes: 6 additions & 0 deletions include/openvml_reference.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ OPENVML_EXPORT void OpenVML_FUNCNAME_REF(vdExp)(VML_INT n, const double * a, dou
OPENVML_EXPORT void OpenVML_FUNCNAME_REF(vsLog10)(VML_INT n, const float * a, float * y);
OPENVML_EXPORT void OpenVML_FUNCNAME_REF(vdLog10)(VML_INT n, const double * a, double * y);

OPENVML_EXPORT void OpenVML_FUNCNAME_REF(vsLn)(VML_INT n, const float * a, float * y);
OPENVML_EXPORT void OpenVML_FUNCNAME_REF(vdLn)(VML_INT n, const double * a, double * y);

OPENVML_EXPORT void OpenVML_FUNCNAME_REF(vsLog1p)(VML_INT n, const float * a, float * y);
OPENVML_EXPORT void OpenVML_FUNCNAME_REF(vdLog1p)(VML_INT n, const double * a, double * y);

OPENVML_EXPORT void OpenVML_FUNCNAME_REF(vsTanh)(VML_INT n, const float * a, float * y);
OPENVML_EXPORT void OpenVML_FUNCNAME_REF(vdTanh)(VML_INT n, const double * a, double * y);

Expand Down
2 changes: 1 addition & 1 deletion interface/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ set(OpenVML_LIBSRC_D "")
set(OpenVML_LIBSRC_C "")
set(OpenVML_LIBSRC_Z "")

set(REAL_INTERFACE_LIST add sub pow exp tanh log10)
set(REAL_INTERFACE_LIST add sub pow exp tanh log10 ln log1p)
set(COMPLEX_INTERFACE_LIST add sub)

function(cap_string var_name var_name_cap)
Expand Down
39 changes: 39 additions & 0 deletions interface/ln.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/* * Copyright (c) 2014, 2015 Zhang Xianyi
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <openvml.h>
#include <openvml_driver.h>
#include <openvml_kernel.h>


void CNAME(VML_INT n, const VML_FLOAT * a, VML_FLOAT * y) {

if (n<=0) return;
if (a==NULL || y==NULL) return;


EXEC_VML(0, LN_K, n, (VML_FLOAT*)a, NULL, y, NULL, NULL);

}
39 changes: 39 additions & 0 deletions interface/log1p.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/* * Copyright (c) 2014, 2015 Zhang Xianyi
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <openvml.h>
#include <openvml_driver.h>
#include <openvml_kernel.h>


void CNAME(VML_INT n, const VML_FLOAT * a, VML_FLOAT * y) {

if (n<=0) return;
if (a==NULL || y==NULL) return;


EXEC_VML(0, LOG1P_K, n, (VML_FLOAT*)a, NULL, y, NULL, NULL);

}
2 changes: 1 addition & 1 deletion kernel/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ set(OpenVML_LIBSRC_D "")
set(OpenVML_LIBSRC_C "")
set(OpenVML_LIBSRC_Z "")

set(KERNEL_LIST add sub pow exp tanh log10) #s,d
set(KERNEL_LIST add sub pow exp tanh log10 ln log1p) #s,d
set(Z_KERNEL_LIST add sub) #c,z
######## s,d kernels

Expand Down
7 changes: 6 additions & 1 deletion kernel/aarch64/Kernel_generic.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ set(exp_D_KERNEL_SOURCE generic/exp_kernel.c)
set(log10_S_KERNEL_SOURCE generic/log10_kernel.c)
set(log10_D_KERNEL_SOURCE generic/log10_kernel.c)

set(ln_S_KERNEL_SOURCE generic/ln_kernel.c)
set(ln_D_KERNEL_SOURCE generic/ln_kernel.c)

set(log1p_S_KERNEL_SOURCE generic/log1p_kernel.c)
set(log1p_D_KERNEL_SOURCE generic/log1p_kernel.c)

set(tanh_S_KERNEL_SOURCE generic/tanh_kernel.c)
set(tanh_D_KERNEL_SOURCE generic/tanh_kernel.c)

6 changes: 6 additions & 0 deletions kernel/arm/Kernel_generic.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,11 @@ set(exp_D_KERNEL_SOURCE generic/exp_kernel.c)
set(log10_S_KERNEL_SOURCE generic/log10_kernel.c)
set(log10_D_KERNEL_SOURCE generic/log10_kernel.c)

set(log10_S_KERNEL_SOURCE generic/ln_kernel.c)
set(log10_D_KERNEL_SOURCE generic/ln_kernel.c)

set(log1p_S_KERNEL_SOURCE generic/log1p_kernel.c)
set(log1p_D_KERNEL_SOURCE generic/log1p_kernel.c)

set(tanh_S_KERNEL_SOURCE generic/tanh_kernel.c)
set(tanh_D_KERNEL_SOURCE generic/tanh_kernel.c)
7 changes: 6 additions & 1 deletion kernel/generic/Kernel_generic.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ set(exp_D_KERNEL_SOURCE ${OpenVML_ARCH}/exp_kernel.c)
set(log10_S_KERNEL_SOURCE ${OpenVML_ARCH}/log10_kernel.c)
set(log10_D_KERNEL_SOURCE ${OpenVML_ARCH}/log10_kernel.c)

set(ln_S_KERNEL_SOURCE ${OpenVML_ARCH}/ln_kernel.c)
set(ln_D_KERNEL_SOURCE ${OpenVML_ARCH}/ln_kernel.c)

set(log1p_S_KERNEL_SOURCE ${OpenVML_ARCH}/log1p_kernel.c)
set(log1p_D_KERNEL_SOURCE ${OpenVML_ARCH}/log1p_kernel.c)

set(tanh_S_KERNEL_SOURCE ${OpenVML_ARCH}/tanh_kernel.c)
set(tanh_D_KERNEL_SOURCE ${OpenVML_ARCH}/tanh_kernel.c)

40 changes: 40 additions & 0 deletions kernel/generic/ln_kernel.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* * Copyright (c) 2014, 2015 Zhang Xianyi
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <math.h>
#include "openvml_kernel.h"

#ifndef DOUBLE
#define LN logf
#else
#define LN log
#endif

void KERNEL_NAME(VMLLONG n, VML_FLOAT * a, VML_FLOAT * b, VML_FLOAT * y, VML_FLOAT * z, VML_FLOAT * other_params) {
VMLLONG i=0;
for(i=0; i<n; i++){
y[i]=LN(a[i]);
}
}
40 changes: 40 additions & 0 deletions kernel/generic/log1p_kernel.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* * Copyright (c) 2014, 2015 Zhang Xianyi
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <math.h>
#include "openvml_kernel.h"

#ifndef DOUBLE
#define LOG1P log1pf
#else
#define LOG1P log1p
#endif

void KERNEL_NAME(VMLLONG n, VML_FLOAT * a, VML_FLOAT * b, VML_FLOAT * y, VML_FLOAT * z, VML_FLOAT * other_params) {
VMLLONG i=0;
for(i=0; i<n; i++){
y[i]=LOG1P(a[i]);
}
}
6 changes: 6 additions & 0 deletions kernel/x86_64/Kernel_generic.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,9 @@ set(tanh_D_KERNEL_SOURCE generic/tanh_kernel.c)

set(log10_S_KERNEL_SOURCE generic/log10_kernel.c)
set(log10_D_KERNEL_SOURCE generic/log10_kernel.c)

set(ln_S_KERNEL_SOURCE generic/ln_kernel.c)
set(ln_D_KERNEL_SOURCE generic/ln_kernel.c)

set(log1p_S_KERNEL_SOURCE generic/log1p_kernel.c)
set(log1p_D_KERNEL_SOURCE generic/log1p_kernel.c)
6 changes: 6 additions & 0 deletions kernel/x86_64/Kernel_haswell.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,9 @@ set(exp_S_KERNEL_SOURCE ${OpenVML_ARCH}/sexp_kernel_avx2.c)

set(log10_S_KERNEL_SOURCE ${OpenVML_ARCH}/slog10_kernel_avx.c)
set(log10_D_KERNEL_SOURCE ${OpenVML_ARCH}/dlog10_kernel_avx.c)

set(ln_S_KERNEL_SOURCE ${OpenVML_ARCH}/sln_kernel_avx.c)
set(ln_D_KERNEL_SOURCE ${OpenVML_ARCH}/dln_kernel_avx.c)

set(log1p_S_KERNEL_SOURCE ${OpenVML_ARCH}/slog1p_kernel_avx.c)
set(log1p_D_KERNEL_SOURCE ${OpenVML_ARCH}/dlog1p_kernel_avx.c)
6 changes: 6 additions & 0 deletions kernel/x86_64/Kernel_sandybridge.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,9 @@ set(sub_Z_KERNEL_SOURCE ${OpenVML_ARCH}/dsub_kernel_avx.c)

set(log10_S_KERNEL_SOURCE ${OpenVML_ARCH}/slog10_kernel_avx.c)
set(log10_D_KERNEL_SOURCE ${OpenVML_ARCH}/dlog10_kernel_avx.c)

set(ln_S_KERNEL_SOURCE ${OpenVML_ARCH}/sln_kernel_avx.c)
set(ln_D_KERNEL_SOURCE ${OpenVML_ARCH}/dln_kernel_avx.c)

set(log1p_S_KERNEL_SOURCE ${OpenVML_ARCH}/slog1p_kernel_avx.c)
set(log1p_D_KERNEL_SOURCE ${OpenVML_ARCH}/dlog1p_kernel_avx.c)
Loading

0 comments on commit c5ed13f

Please sign in to comment.