Skip to content

Moved all the functions to FPTR structure #86

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 8 additions & 26 deletions dpnp/backend.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ cdef extern from "backend/backend_iface_fptr.hpp" namespace "DPNPFuncName": # n
DPNP_FN_FABS
DPNP_FN_FLOOR
DPNP_FN_FMOD
DPNP_FN_GAUSSIAN
DPNP_FN_HYPOT
DPNP_FN_LOG
DPNP_FN_LOG10
Expand All @@ -68,18 +69,21 @@ cdef extern from "backend/backend_iface_fptr.hpp" namespace "DPNPFuncName": # n
DPNP_FN_MULTIPLY
DPNP_FN_POWER
DPNP_FN_PROD
DPNP_FN_UNIFORM
DPNP_FN_RADIANS
DPNP_FN_RAND
DPNP_FN_RANDOM
DPNP_FN_RECIP
DPNP_FN_SIGN
DPNP_FN_SIN
DPNP_FN_SINH
DPNP_FN_SORT
DPNP_FN_SQRT
DPNP_FN_SQUARE
DPNP_FN_SUBTRACT
DPNP_FN_SUM
DPNP_FN_TAN
DPNP_FN_TANH
DPNP_FN_TRANSPOSE
DPNP_FN_TRUNC

cdef extern from "backend/backend_iface_fptr.hpp" namespace "DPNPFuncType": # need this namespace for Enum import
Expand Down Expand Up @@ -110,37 +114,14 @@ cdef extern from "backend/backend_iface.hpp":
void dpnp_memory_free_c(void * ptr)
void dpnp_memory_memcpy_c(void * dst, const void * src, size_t size_in_bytes)

void dpnp_blas_gemm_c[_DataType](void * array1, void * array2, void * result1, size_t size_m, size_t size_n, size_t size_k)
void custom_blas_gemm_c[_DataType](void * array1, void * array2, void * result1, size_t size_m, size_t size_n, size_t size_k)

# Linear Algebra part
void custom_blas_dot_c[_DataType](void * array1, void * array2, void * result1, size_t size)
void mkl_blas_dot_c[_DataType](void * array1, void * array2, void * result1, size_t size)
void mkl_lapack_syevd_c[_DataType](void * array1, void * result1, size_t size)

# array manipulation routines
void custom_elemwise_transpose_c[_DataType](void * array1_in, dparray_shape_type & input_shape, dparray_shape_type & result_shape, dparray_shape_type & permute_axes, void * result1, size_t size)

# Random module routines
void mkl_rng_gaussian[_DataType](void * result, size_t size)
void mkl_rng_uniform[_DataType](void * result, size_t size)
void mkl_rng_uniform_mt19937[_DataType](void * result, long low, long high, size_t size)

# Statistics routines
void custom_cov_c[_DataType](void * array, void * result, size_t nrows, size_t ncols)

# Sorting routines
void custom_argsort_c[_DataType, _idx_DataType](void * array, void * result, size_t size)
void custom_sort_c[_DataType](void * array, void * result, size_t size)

# Sorting routines
void custom_argmax_c[_DataType, _idx_DataType](void * array, void * result, size_t size)
void custom_argmin_c[_DataType, _idx_DataType](void * array, void * result, size_t size)
# void mkl_rng_uniform_mt19937[_DataType](void * result, long low, long high, size_t size)


# C function pointer to the C library template functions
ctypedef void(*fptr_1in_1out_t)(void *, void * , size_t)
ctypedef void(*fptr_2in_1out_t)(void *, void*, void*, size_t)
ctypedef void(*fptr_blas_gemm_2in_1out_t)(void *, void *, void *, size_t, size_t, size_t)

cdef dparray call_fptr_1in_1out(DPNPFuncName fptr_name, dparray x1, dparray_shape_type result_shape)
cdef dparray call_fptr_2in_1out(DPNPFuncName fptr_name, dparray x1, dparray x2, dparray_shape_type result_shape)
Expand Down Expand Up @@ -176,6 +157,7 @@ cpdef dparray dpnp_not_equal(dparray input1, dparray input2)
"""
Linear algebra
"""
cpdef dparray dpnp_dot(dparray in_array1, dparray in_array2)
cpdef dparray dpnp_matmul(dparray in_array1, dparray in_array2)


Expand Down
31 changes: 13 additions & 18 deletions dpnp/backend.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,6 @@ cpdef dparray dpnp_init_val(shape, dtype, value):
cpdef dparray dpnp_matmul(dparray in_array1, dparray in_array2):
cdef vector[Py_ssize_t] shape_result

call_type = in_array1.dtype

cdef vector[Py_ssize_t] shape1 = in_array1.shape
cdef vector[Py_ssize_t] shape2 = in_array2.shape

Expand Down Expand Up @@ -177,25 +175,22 @@ cpdef dparray dpnp_matmul(dparray in_array1, dparray in_array2):
"""
shape_result = shape1[:-1] + shape2[1:]

cdef dparray result = dparray(shape_result, dtype=call_type)
# convert string type names (dparray.dtype) to C enum DPNPFuncType
cdef DPNPFuncType param1_type = dpnp_dtype_to_DPNPFuncType(in_array1.dtype)
cdef DPNPFuncType param2_type = dpnp_dtype_to_DPNPFuncType(in_array2.dtype)

# get the FPTR data structure
cdef DPNPFuncData kernel_data = get_dpnp_function_ptr(DPNP_FN_MATMUL, param1_type, param2_type)

result_type = dpnp_DPNPFuncType_to_dtype( < size_t > kernel_data.return_type)
# ceate result array with type given by FPTR data
cdef dparray result = dparray(shape_result, dtype=result_type)
if result.size == 0:
return result

if call_type == numpy.float64:
dpnp_blas_gemm_c[double](in_array1.get_data(), in_array2.get_data(),
result.get_data(), size_m, size_n, size_k)
elif call_type == numpy.float32:
dpnp_blas_gemm_c[float](in_array1.get_data(), in_array2.get_data(),
result.get_data(), size_m, size_n, size_k)
elif call_type == numpy.int64:
custom_blas_gemm_c[long](in_array1.get_data(), in_array2.get_data(),
result.get_data(), size_m, size_n, size_k)
elif call_type == numpy.int32:
custom_blas_gemm_c[int](in_array1.get_data(), in_array2.get_data(),
result.get_data(), size_m, size_n, size_k)
else:
raise TypeError(
f"Intel NumPy {call_type} matmul({call_type} A, {call_type} B, {call_type} result) is not supported.")
cdef fptr_blas_gemm_2in_1out_t func = <fptr_blas_gemm_2in_1out_t > kernel_data.ptr
# call FPTR function
func(in_array1.get_data(), in_array2.get_data(), result.get_data(), size_m, size_n, size_k)

return result

Expand Down
36 changes: 26 additions & 10 deletions dpnp/backend/backend_iface_fptr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,14 +241,10 @@ static func_map_t func_map_init()
fmap[DPNPFuncName::DPNP_FN_ARGMIN][eft_DBL][eft_INT] = {eft_INT, (void*)custom_argmin_c<double, int>};
fmap[DPNPFuncName::DPNP_FN_ARGMIN][eft_DBL][eft_LNG] = {eft_LNG, (void*)custom_argmin_c<double, long>};

fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_INT][eft_INT] = {eft_INT, (void*)custom_argsort_c<int, int>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_INT][eft_LNG] = {eft_LNG, (void*)custom_argsort_c<int, long>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_LNG][eft_INT] = {eft_INT, (void*)custom_argsort_c<long, int>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_INT][eft_INT] = {eft_LNG, (void*)custom_argsort_c<int, long>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_LNG][eft_LNG] = {eft_LNG, (void*)custom_argsort_c<long, long>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_FLT][eft_INT] = {eft_INT, (void*)custom_argsort_c<float, int>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_FLT][eft_LNG] = {eft_LNG, (void*)custom_argsort_c<float, long>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_DBL][eft_INT] = {eft_INT, (void*)custom_argsort_c<double, int>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_DBL][eft_LNG] = {eft_LNG, (void*)custom_argsort_c<double, long>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_FLT][eft_FLT] = {eft_LNG, (void*)custom_argsort_c<float, long>};
fmap[DPNPFuncName::DPNP_FN_ARGSORT][eft_DBL][eft_DBL] = {eft_LNG, (void*)custom_argsort_c<double, long>};

fmap[DPNPFuncName::DPNP_FN_CBRT][eft_INT][eft_INT] = {eft_DBL, (void*)custom_elemwise_cbrt_c<int, double>};
fmap[DPNPFuncName::DPNP_FN_CBRT][eft_LNG][eft_LNG] = {eft_DBL, (void*)custom_elemwise_cbrt_c<long, double>};
Expand All @@ -270,6 +266,9 @@ static func_map_t func_map_init()
fmap[DPNPFuncName::DPNP_FN_COSH][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_elemwise_cosh_c<float, float>};
fmap[DPNPFuncName::DPNP_FN_COSH][eft_DBL][eft_DBL] = {eft_DBL, (void*)custom_elemwise_cosh_c<double, double>};

fmap[DPNPFuncName::DPNP_FN_COV][eft_INT][eft_INT] = {eft_DBL, (void*)custom_cov_c<double>};
fmap[DPNPFuncName::DPNP_FN_COV][eft_LNG][eft_LNG] = {eft_DBL, (void*)custom_cov_c<double>};
fmap[DPNPFuncName::DPNP_FN_COV][eft_FLT][eft_FLT] = {eft_DBL, (void*)custom_cov_c<double>};
fmap[DPNPFuncName::DPNP_FN_COV][eft_DBL][eft_DBL] = {eft_DBL, (void*)custom_cov_c<double>};

fmap[DPNPFuncName::DPNP_FN_DEGREES][eft_INT][eft_INT] = {eft_DBL, (void*)custom_elemwise_degrees_c<int, double>};
Expand Down Expand Up @@ -311,6 +310,8 @@ static func_map_t func_map_init()
fmap[DPNPFuncName::DPNP_FN_DOT][eft_FLT][eft_FLT] = {eft_FLT, (void*)mkl_blas_dot_c<float>};
fmap[DPNPFuncName::DPNP_FN_DOT][eft_DBL][eft_DBL] = {eft_DBL, (void*)mkl_blas_dot_c<double>};

fmap[DPNPFuncName::DPNP_FN_EIG][eft_INT][eft_INT] = {eft_DBL, (void*)mkl_lapack_syevd_c<double>};
fmap[DPNPFuncName::DPNP_FN_EIG][eft_LNG][eft_LNG] = {eft_DBL, (void*)mkl_lapack_syevd_c<double>};
fmap[DPNPFuncName::DPNP_FN_EIG][eft_FLT][eft_FLT] = {eft_FLT, (void*)mkl_lapack_syevd_c<float>};
fmap[DPNPFuncName::DPNP_FN_EIG][eft_DBL][eft_DBL] = {eft_DBL, (void*)mkl_lapack_syevd_c<double>};

Expand Down Expand Up @@ -359,6 +360,8 @@ static func_map_t func_map_init()
fmap[DPNPFuncName::DPNP_FN_FMOD][eft_DBL][eft_DBL] = {eft_DBL,
(void*)custom_elemwise_fmod_c<double, double, double>};

fmap[DPNPFuncName::DPNP_FN_GAUSSIAN][eft_DBL][eft_DBL] = {eft_DBL, (void*)mkl_rng_gaussian<double>};

fmap[DPNPFuncName::DPNP_FN_HYPOT][eft_INT][eft_INT] = {eft_DBL, (void*)custom_elemwise_hypot_c<int, int, double>};
fmap[DPNPFuncName::DPNP_FN_HYPOT][eft_INT][eft_LNG] = {eft_DBL, (void*)custom_elemwise_hypot_c<int, long, double>};
fmap[DPNPFuncName::DPNP_FN_HYPOT][eft_INT][eft_FLT] = {eft_DBL, (void*)custom_elemwise_hypot_c<int, float, double>};
Expand Down Expand Up @@ -540,17 +543,20 @@ static func_map_t func_map_init()
fmap[DPNPFuncName::DPNP_FN_PROD][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_prod_c<float>};
fmap[DPNPFuncName::DPNP_FN_PROD][eft_DBL][eft_DBL] = {eft_DBL, (void*)custom_prod_c<double>};

fmap[DPNPFuncName::DPNP_FN_UNIFORM][eft_INT][eft_INT] = {eft_INT, (void*)mkl_rng_uniform<int>};
fmap[DPNPFuncName::DPNP_FN_UNIFORM][eft_FLT][eft_FLT] = {eft_FLT, (void*)mkl_rng_uniform<float>};
fmap[DPNPFuncName::DPNP_FN_UNIFORM][eft_DBL][eft_DBL] = {eft_DBL, (void*)mkl_rng_uniform<double>};

fmap[DPNPFuncName::DPNP_FN_RADIANS][eft_INT][eft_INT] = {eft_DBL, (void*)custom_elemwise_radians_c<int, double>};
fmap[DPNPFuncName::DPNP_FN_RADIANS][eft_LNG][eft_LNG] = {eft_DBL, (void*)custom_elemwise_radians_c<long, double>};
fmap[DPNPFuncName::DPNP_FN_RADIANS][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_elemwise_radians_c<float, float>};
fmap[DPNPFuncName::DPNP_FN_RADIANS][eft_DBL][eft_DBL] = {eft_DBL, (void*)custom_elemwise_radians_c<double, double>};

fmap[DPNPFuncName::DPNP_FN_RANDOM][eft_DBL][eft_DBL] = {eft_DBL, (void*)mkl_rng_uniform<double>};

fmap[DPNPFuncName::DPNP_FN_RECIP][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_elemwise_recip_c<float>};
fmap[DPNPFuncName::DPNP_FN_RECIP][eft_DBL][eft_DBL] = {eft_DBL, (void*)custom_elemwise_recip_c<double>};

fmap[DPNPFuncName::DPNP_FN_RAND][eft_FLT][eft_FLT] = {eft_FLT, (void*)mkl_rng_uniform<float>};
fmap[DPNPFuncName::DPNP_FN_RAND][eft_DBL][eft_DBL] = {eft_DBL, (void*)mkl_rng_uniform<double>};

fmap[DPNPFuncName::DPNP_FN_SIGN][eft_INT][eft_INT] = {eft_INT, (void*)custom_elemwise_sign_c<int>};
fmap[DPNPFuncName::DPNP_FN_SIGN][eft_LNG][eft_LNG] = {eft_LNG, (void*)custom_elemwise_sign_c<long>};
fmap[DPNPFuncName::DPNP_FN_SIGN][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_elemwise_sign_c<float>};
Expand All @@ -566,6 +572,11 @@ static func_map_t func_map_init()
fmap[DPNPFuncName::DPNP_FN_SINH][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_elemwise_sinh_c<float, float>};
fmap[DPNPFuncName::DPNP_FN_SINH][eft_DBL][eft_DBL] = {eft_DBL, (void*)custom_elemwise_sinh_c<double, double>};

fmap[DPNPFuncName::DPNP_FN_SORT][eft_INT][eft_INT] = {eft_INT, (void*)custom_sort_c<int>};
fmap[DPNPFuncName::DPNP_FN_SORT][eft_LNG][eft_LNG] = {eft_LNG, (void*)custom_sort_c<long>};
fmap[DPNPFuncName::DPNP_FN_SORT][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_sort_c<float>};
fmap[DPNPFuncName::DPNP_FN_SORT][eft_DBL][eft_DBL] = {eft_DBL, (void*)custom_sort_c<double>};

fmap[DPNPFuncName::DPNP_FN_SQRT][eft_INT][eft_INT] = {eft_DBL, (void*)custom_elemwise_sqrt_c<int, double>};
fmap[DPNPFuncName::DPNP_FN_SQRT][eft_LNG][eft_LNG] = {eft_DBL, (void*)custom_elemwise_sqrt_c<long, double>};
fmap[DPNPFuncName::DPNP_FN_SQRT][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_elemwise_sqrt_c<float, float>};
Expand Down Expand Up @@ -624,6 +635,11 @@ static func_map_t func_map_init()
fmap[DPNPFuncName::DPNP_FN_TANH][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_elemwise_tanh_c<float, float>};
fmap[DPNPFuncName::DPNP_FN_TANH][eft_DBL][eft_DBL] = {eft_DBL, (void*)custom_elemwise_tanh_c<double, double>};

fmap[DPNPFuncName::DPNP_FN_TRANSPOSE][eft_INT][eft_INT] = {eft_INT, (void*)custom_elemwise_transpose_c<int>};
fmap[DPNPFuncName::DPNP_FN_TRANSPOSE][eft_LNG][eft_LNG] = {eft_LNG, (void*)custom_elemwise_transpose_c<long>};
fmap[DPNPFuncName::DPNP_FN_TRANSPOSE][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_elemwise_transpose_c<float>};
fmap[DPNPFuncName::DPNP_FN_TRANSPOSE][eft_DBL][eft_DBL] = {eft_DBL, (void*)custom_elemwise_transpose_c<double>};

fmap[DPNPFuncName::DPNP_FN_TRUNC][eft_INT][eft_INT] = {eft_DBL, (void*)custom_elemwise_trunc_c<int, double>};
fmap[DPNPFuncName::DPNP_FN_TRUNC][eft_LNG][eft_LNG] = {eft_DBL, (void*)custom_elemwise_trunc_c<long, double>};
fmap[DPNPFuncName::DPNP_FN_TRUNC][eft_FLT][eft_FLT] = {eft_FLT, (void*)custom_elemwise_trunc_c<float, float>};
Expand Down
6 changes: 5 additions & 1 deletion dpnp/backend/backend_iface_fptr.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ enum class DPNPFuncName : size_t
DPNP_FN_FABS, /**< Used in numpy.fabs() implementation */
DPNP_FN_FLOOR, /**< Used in numpy.floor() implementation */
DPNP_FN_FMOD, /**< Used in numpy.fmod() implementation */
DPNP_FN_GAUSSIAN, /**< Used in numpy.random.randn() implementation */
DPNP_FN_HYPOT, /**< Used in numpy.hypot() implementation */
DPNP_FN_LOG, /**< Used in numpy.log() implementation */
DPNP_FN_LOG10, /**< Used in numpy.log10() implementation */
Expand All @@ -97,18 +98,21 @@ enum class DPNPFuncName : size_t
DPNP_FN_MULTIPLY, /**< Used in numpy.multiply() implementation */
DPNP_FN_POWER, /**< Used in numpy.random.power() implementation */
DPNP_FN_PROD, /**< Used in numpy.prod() implementation */
DPNP_FN_UNIFORM, /**< Used in numpy.random.uniform() implementation */
DPNP_FN_RADIANS, /**< Used in numpy.radians() implementation */
DPNP_FN_RANDOM, /**< Used in numpy.random.random() implementation */
DPNP_FN_RECIP, /**< Used in numpy.recip() implementation */
DPNP_FN_RAND, /**< Used in numpy.random.rand() implementation */
DPNP_FN_SIGN, /**< Used in numpy.sign() implementation */
DPNP_FN_SIN, /**< Used in numpy.sin() implementation */
DPNP_FN_SINH, /**< Used in numpy.sinh() implementation */
DPNP_FN_SORT, /**< Used in numpy.sort() implementation */
DPNP_FN_SQRT, /**< Used in numpy.sqrt() implementation */
DPNP_FN_SQUARE, /**< Used in numpy.square() implementation */
DPNP_FN_SUBTRACT, /**< Used in numpy.subtract() implementation */
DPNP_FN_SUM, /**< Used in numpy.sum() implementation */
DPNP_FN_TAN, /**< Used in numpy.tan() implementation */
DPNP_FN_TANH, /**< Used in numpy.tanh() implementation */
DPNP_FN_TRANSPOSE, /**< Used in numpy.transpose() implementation */
DPNP_FN_TRUNC, /**< Used in numpy.trunc() implementation */
DPNP_FN_LAST /**< The latest element of the enumeration */
};
Expand Down
27 changes: 14 additions & 13 deletions dpnp/backend_linearalgebra.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ cpdef dparray dpnp_dot(dparray in_array1, dparray in_array2):
cdef vector[Py_ssize_t] shape1 = in_array1.shape
cdef vector[Py_ssize_t] shape2 = in_array2.shape

call_type = in_array1.dtype

cdef size_t dim1 = in_array1.ndim
cdef size_t dim2 = in_array2.ndim

Expand All @@ -72,17 +70,20 @@ cpdef dparray dpnp_dot(dparray in_array1, dparray in_array2):
if size1 != size2:
raise checker_throw_runtime_error("dpnp_dot", "input vectors must be of equal size")

cdef dparray result = dparray((1,), dtype=call_type)
if call_type == numpy.float64:
mkl_blas_dot_c[double](in_array1.get_data(), in_array2.get_data(), result.get_data(), size1)
elif call_type == numpy.float32:
mkl_blas_dot_c[float](in_array1.get_data(), in_array2.get_data(), result.get_data(), size1)
elif call_type == numpy.int64:
custom_blas_dot_c[long](in_array1.get_data(), in_array2.get_data(), result.get_data(), size1)
elif call_type == numpy.int32:
custom_blas_dot_c[int](in_array1.get_data(), in_array2.get_data(), result.get_data(), size1)
else:
checker_throw_type_error("dpnp_dot", call_type)
# convert string type names (dparray.dtype) to C enum DPNPFuncType
cdef DPNPFuncType param1_type = dpnp_dtype_to_DPNPFuncType(in_array1.dtype)
cdef DPNPFuncType param2_type = dpnp_dtype_to_DPNPFuncType(in_array2.dtype)

# get the FPTR data structure
cdef DPNPFuncData kernel_data = get_dpnp_function_ptr(DPNP_FN_DOT, param1_type, param2_type)

result_type = dpnp_DPNPFuncType_to_dtype( < size_t > kernel_data.return_type)
# ceate result array with type given by FPTR data
cdef dparray result = dparray((1,), dtype=result_type)

cdef fptr_2in_1out_t func = <fptr_2in_1out_t > kernel_data.ptr
# call FPTR function
func(in_array1.get_data(), in_array2.get_data(), result.get_data(), size1)

return result

Expand Down
Loading