Skip to content
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

[BLAS][portBLAS] Add bindings for half and some gemm_batch group APIs #576

Closed
wants to merge 3 commits into from
Closed
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
3 changes: 3 additions & 0 deletions docs/building_the_project_with_dpcpp.rst
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,9 @@ portBLAS relies heavily on JIT compilation. This may cause time-outs on some
systems. To avoid this issue, use ahead-of-time compilation through tuning
targets or ``sycl-targets``.

The ``sycl::half`` type can be supported by setting
``-DPORTBLAS_ENABLE_HALF=ON``.

.. _build_for_portfft_dpcpp:

Building for portFFT
Expand Down
5 changes: 5 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ foreach(domain ${TARGET_DOMAINS})
add_subdirectory(${domain})
endforeach()

if (PORTBLAS_ENABLE_HALF)
# Set the variable used for C++ macro
set(ENABLE_PORTBLAS_HALF ON)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to #554 and PR #571 this var should be named with the prefix ONEAPI_ONEMKL_. Could you update it?
I know it would be the only one named correctly now, but I hope that PR will be merged soon.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I was planning to update this PR once #571 is merged. It will be easier to do once I can add ONEAPI_ONEMKL_ENABLE_PORTBLAS_HALF to the list you introduce in https://github.com/oneapi-src/oneMKL/pull/571/files#diff-148715d6ea0c0ea0a346af3f6bd610d010d490eca35ac6a9b408748f7ca9e3f4R54

endif()

# Generate header with enabled backends for testing
configure_file(config.hpp.in "${CMAKE_CURRENT_BINARY_DIR}/oneapi/mkl/config.hpp.configured")
file(GENERATE
Expand Down
8 changes: 5 additions & 3 deletions src/blas/backends/portblas/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@
set(LIB_NAME onemkl_blas_portblas)
set(LIB_OBJ ${LIB_NAME}_obj)

if(NOT DEFINED PORTBLAS_TUNING_TARGET)
option(PORTBLAS_TUNING_TARGET "Set a TUNING_TARGET for portBLAS" "")
endif()
option(PORTBLAS_TUNING_TARGET "Set a TUNING_TARGET for portBLAS" "")
option(PORTBLAS_ENABLE_HALF "Enable half support with the portBLAS backend" OFF)

# Parse compiler flags and return a list of SYCL targets
# The list is empty if no targets are set
Expand Down Expand Up @@ -152,6 +151,9 @@ if (NOT PORTBLAS_FOUND)
# Following variable TUNING_TARGET will be used in portBLAS internal configuration
set(TUNING_TARGET ${PORTBLAS_TUNING_TARGET})
set(BLAS_ENABLE_COMPLEX ON)
if (PORTBLAS_ENABLE_HALF)
set(BLAS_ENABLE_HALF ON)
endif()
# Set the policy to forward variables to portBLAS configure step
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
set(FETCHCONTENT_BASE_DIR "${CMAKE_BINARY_DIR}/deps")
Expand Down
86 changes: 68 additions & 18 deletions src/blas/backends/portblas/portblas_batch.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,12 @@ void gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::
sycl::buffer<sycl::half, 1> &b, std::int64_t ldb, std::int64_t stride_b,
sycl::half beta, sycl::buffer<sycl::half, 1> &c, std::int64_t ldc,
std::int64_t stride_c, std::int64_t batch_size) {
throw unimplemented("blas", "gemm_batch", " for complex");
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_FN(::blas::_gemm_strided_batched, queue, transa, transb, m, n, k, alpha, a, lda,
stride_a, b, ldb, stride_b, beta, c, ldc, stride_c, batch_size);
#else
throw unimplemented("blas", "gemm_batch", " for half");
#endif
}

void gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::transpose transb,
Expand All @@ -219,7 +224,12 @@ void gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::
sycl::buffer<sycl::half, 1> &b, std::int64_t ldb, std::int64_t stride_b, float beta,
sycl::buffer<float, 1> &c, std::int64_t ldc, std::int64_t stride_c,
std::int64_t batch_size) {
throw unimplemented("blas", "gemm_batch", " for unsupported dtype");
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_FN(::blas::_gemm_strided_batched, queue, transa, transb, m, n, k, alpha, a, lda,
stride_a, b, ldb, stride_b, beta, c, ldc, stride_c, batch_size);
#else
throw unimplemented("blas", "gemm_batch", " for half");
#endif
}

void gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::transpose transb,
Expand All @@ -228,7 +238,7 @@ void gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::
sycl::buffer<std::int8_t, 1> &b, std::int64_t ldb, std::int64_t stride_b,
float beta, sycl::buffer<float, 1> &c, std::int64_t ldc, std::int64_t stride_c,
std::int64_t batch_size) {
throw unimplemented("blas", "gemm_batch", " for unsupported dtype");
throw unimplemented("blas", "gemm_batch", " for int8");
}

void gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::transpose transb,
Expand All @@ -237,7 +247,7 @@ void gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::
sycl::buffer<std::int8_t, 1> &b, std::int64_t ldb, std::int64_t stride_b,
float beta, sycl::buffer<std::int32_t, 1> &c, std::int64_t ldc,
std::int64_t stride_c, std::int64_t batch_size) {
throw unimplemented("blas", "gemm_batch", " for unsupported dtype");
throw unimplemented("blas", "gemm_batch", " for int8");
}

void trsm_batch(sycl::queue &queue, oneapi::mkl::side left_right, oneapi::mkl::uplo upper_lower,
Expand Down Expand Up @@ -686,7 +696,12 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
const float **b, std::int64_t *ldb, float *beta, float **c,
std::int64_t *ldc, std::int64_t group_count, std::int64_t *group_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
if (group_count != 1) {
throw unimplemented("blas", "gemm_batch", " using group API and group_count != 1");
}
CALL_PORTBLAS_USM_FN(::blas::_gemm_batched, queue, transa[0], transb[0], m[0], n[0], k[0],
alpha[0], a[0], lda[0], b[0], ldb[0], beta[0], c[0], ldc[0], group_size[0],
::blas::gemm_batch_type_t::strided, dependencies);
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
Expand All @@ -695,7 +710,12 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
const double **b, std::int64_t *ldb, double *beta, double **c,
std::int64_t *ldc, std::int64_t group_count, std::int64_t *group_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
if (group_count != 1) {
throw unimplemented("blas", "gemm_batch", " using group API and group_count != 1");
}
CALL_PORTBLAS_USM_FN(::blas::_gemm_batched, queue, transa[0], transb[0], m[0], n[0], k[0],
alpha[0], a[0], lda[0], b[0], ldb[0], beta[0], c[0], ldc[0], group_size[0],
::blas::gemm_batch_type_t::strided, dependencies);
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
Expand All @@ -705,7 +725,7 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
std::complex<float> *beta, std::complex<float> **c, std::int64_t *ldc,
std::int64_t group_count, std::int64_t *group_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
throw unimplemented("blas", "gemm_batch", " for USM using complex");
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
Expand All @@ -715,7 +735,7 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
std::complex<double> *beta, std::complex<double> **c, std::int64_t *ldc,
std::int64_t group_count, std::int64_t *group_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
throw unimplemented("blas", "gemm_batch", " for USM using complex");
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
Expand All @@ -724,7 +744,16 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
const sycl::half **b, std::int64_t *ldb, sycl::half *beta, sycl::half **c,
std::int64_t *ldc, std::int64_t group_count, std::int64_t *group_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
#ifdef ENABLE_PORTBLAS_HALF
if (group_count != 1) {
throw unimplemented("blas", "gemm_batch", " using group API and group_count != 1");
}
CALL_PORTBLAS_USM_FN(::blas::_gemm_batched, queue, transa[0], transb[0], m[0], n[0], k[0],
alpha[0], a[0], lda[0], b[0], ldb[0], beta[0], c[0], ldc[0], group_size[0],
::blas::gemm_batch_type_t::strided, dependencies);
#else
throw unimplemented("blas", "gemm_batch", " for USM using half");
#endif
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
Expand All @@ -733,7 +762,16 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
const sycl::half **b, std::int64_t *ldb, float *beta, float **c,
std::int64_t *ldc, std::int64_t group_count, std::int64_t *group_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
#ifdef ENABLE_PORTBLAS_HALF
if (group_count != 1) {
throw unimplemented("blas", "gemm_batch", " using group API and group_count != 1");
}
CALL_PORTBLAS_USM_FN(::blas::_gemm_batched, queue, transa[0], transb[0], m[0], n[0], k[0],
alpha[0], a[0], lda[0], b[0], ldb[0], beta[0], c[0], ldc[0], group_size[0],
::blas::gemm_batch_type_t::strided, dependencies);
#else
throw unimplemented("blas", "gemm_batch", " for USM using half");
#endif
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
Expand All @@ -742,7 +780,7 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
const std::int8_t **b, std::int64_t *ldb, float *beta, float **c,
std::int64_t *ldc, std::int64_t group_count, std::int64_t *group_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
throw unimplemented("blas", "gemm_batch", " for USM using int8");
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
Expand All @@ -751,7 +789,7 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose *transa,
const std::int8_t **b, std::int64_t *ldb, float *beta, std::int32_t **c,
std::int64_t *ldc, std::int64_t group_count, std::int64_t *group_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
throw unimplemented("blas", "gemm_batch", " for USM using int8");
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
Expand Down Expand Up @@ -785,7 +823,7 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
std::int64_t ldb, std::int64_t stride_b, std::complex<float> beta,
std::complex<float> *c, std::int64_t ldc, std::int64_t stride_c,
std::int64_t batch_size, const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
throw unimplemented("blas", "gemm_batch", " for USM using complex");
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
Expand All @@ -795,7 +833,7 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
std::int64_t ldb, std::int64_t stride_b, std::complex<double> beta,
std::complex<double> *c, std::int64_t ldc, std::int64_t stride_c,
std::int64_t batch_size, const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
throw unimplemented("blas", "gemm_batch", " for USM using complex");
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
Expand All @@ -805,7 +843,13 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
std::int64_t stride_b, sycl::half beta, sycl::half *c, std::int64_t ldc,
std::int64_t stride_c, std::int64_t batch_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_USM_FN(::blas::_gemm_strided_batched, queue, transa, transb, m, n, k, alpha, a,
lda, stride_a, b, ldb, stride_b, beta, c, ldc, stride_c, batch_size,
dependencies);
#else
throw unimplemented("blas", "gemm_batch", " for USM using half");
#endif
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
Expand All @@ -815,7 +859,13 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
std::int64_t stride_b, float beta, float *c, std::int64_t ldc,
std::int64_t stride_c, std::int64_t batch_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_USM_FN(::blas::_gemm_strided_batched, queue, transa, transb, m, n, k, alpha, a,
lda, stride_a, b, ldb, stride_b, beta, c, ldc, stride_c, batch_size,
dependencies);
#else
throw unimplemented("blas", "gemm_batch", " for USM using half");
#endif
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
Expand All @@ -825,7 +875,7 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
std::int64_t stride_b, float beta, float *c, std::int64_t ldc,
std::int64_t stride_c, std::int64_t batch_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
throw unimplemented("blas", "gemm_batch", " for USM using int8");
}

sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
Expand All @@ -835,7 +885,7 @@ sycl::event gemm_batch(sycl::queue &queue, oneapi::mkl::transpose transa,
std::int64_t stride_b, float beta, std::int32_t *c, std::int64_t ldc,
std::int64_t stride_c, std::int64_t batch_size,
const std::vector<sycl::event> &dependencies) {
throw unimplemented("blas", "gemm_batch", " for USM");
throw unimplemented("blas", "gemm_batch", " for USM using int8");
}

sycl::event trsm_batch(sycl::queue &queue, oneapi::mkl::side left_right,
Expand Down
50 changes: 50 additions & 0 deletions src/blas/backends/portblas/portblas_level3_half.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <CL/sycl.hpp>
#endif

#include "portblas_common.hpp"
#include "oneapi/mkl/exceptions.hpp"
#include "oneapi/mkl/blas/detail/portblas/onemkl_blas_portblas.hpp"

Expand All @@ -32,19 +33,33 @@ namespace blas {
namespace portblas {
namespace column_major {

constexpr bool is_column_major() {
return true;
}

// BUFFER
void gemm(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::transpose transb,
std::int64_t m, std::int64_t n, std::int64_t k, sycl::half alpha,
sycl::buffer<sycl::half, 1> &a, std::int64_t lda, sycl::buffer<sycl::half, 1> &b,
std::int64_t ldb, sycl::half beta, sycl::buffer<sycl::half, 1> &c, std::int64_t ldc) {
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_FN(::blas::_gemm, queue, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c,
ldc);
#else
throw unimplemented("blas", "gemm", " half");
#endif
}

void gemm(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::transpose transb,
std::int64_t m, std::int64_t n, std::int64_t k, float alpha,
sycl::buffer<sycl::half, 1> &a, std::int64_t lda, sycl::buffer<sycl::half, 1> &b,
std::int64_t ldb, float beta, sycl::buffer<float, 1> &c, std::int64_t ldc) {
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_FN(::blas::_gemm, queue, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c,
ldc);
#else
throw unimplemented("blas", "gemm", " for different argument data types");
#endif
}

// USM
Expand All @@ -53,31 +68,56 @@ sycl::event gemm(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl:
const sycl::half *a, std::int64_t lda, const sycl::half *b, std::int64_t ldb,
sycl::half beta, sycl::half *c, std::int64_t ldc,
const std::vector<sycl::event> &dependencies) {
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_USM_FN(::blas::_gemm, queue, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta,
c, ldc, dependencies);
#else
throw unimplemented("blas", "gemm", " for USM");
#endif
}

sycl::event gemm(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::transpose transb,
std::int64_t m, std::int64_t n, std::int64_t k, float alpha, const sycl::half *a,
std::int64_t lda, const sycl::half *b, std::int64_t ldb, float beta, float *c,
std::int64_t ldc, const std::vector<sycl::event> &dependencies) {
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_USM_FN(::blas::_gemm, queue, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta,
c, ldc, dependencies);
#else
throw unimplemented("blas", "gemm", " for USM");
#endif
}
} // namespace column_major

namespace row_major {

constexpr bool is_column_major() {
return false;
}

// BUFFER
void gemm(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::transpose transb,
std::int64_t m, std::int64_t n, std::int64_t k, sycl::half alpha,
sycl::buffer<sycl::half, 1> &a, std::int64_t lda, sycl::buffer<sycl::half, 1> &b,
std::int64_t ldb, sycl::half beta, sycl::buffer<sycl::half, 1> &c, std::int64_t ldc) {
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_FN(::blas::_gemm, queue, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c,
ldc);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently, we don't support any row major operator in portBLAS, so they are generally not enabled.
Even if it works now, unless it is necessary, I would not enable it to avoid the confusion of having only one row major operator supported.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are already checks that throw unimplemented when row_major is used here: https://github.com/oneapi-src/oneMKL/blob/develop/src/blas/backends/portblas/portblas_common.hpp#L193
All the other functions have already their bindings ready for row_major because they use this pattern: https://github.com/oneapi-src/oneMKL/blob/develop/src/blas/backends/portblas/portblas_level3_float.cpp#L54
Just portblas_level3_half.cpp looks a bit different

#else
throw unimplemented("blas", "gemm", " half");
#endif
}

void gemm(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::transpose transb,
std::int64_t m, std::int64_t n, std::int64_t k, float alpha,
sycl::buffer<sycl::half, 1> &a, std::int64_t lda, sycl::buffer<sycl::half, 1> &b,
std::int64_t ldb, float beta, sycl::buffer<float, 1> &c, std::int64_t ldc) {
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_FN(::blas::_gemm, queue, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c,
ldc);
#else
throw unimplemented("blas", "gemm", " for different argument data types");
#endif
}

// USM
Expand All @@ -86,14 +126,24 @@ sycl::event gemm(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl:
const sycl::half *a, std::int64_t lda, const sycl::half *b, std::int64_t ldb,
sycl::half beta, sycl::half *c, std::int64_t ldc,
const std::vector<sycl::event> &dependencies) {
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_USM_FN(::blas::_gemm, queue, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta,
c, ldc, dependencies);
#else
throw unimplemented("blas", "gemm", " for USM");
#endif
}

sycl::event gemm(sycl::queue &queue, oneapi::mkl::transpose transa, oneapi::mkl::transpose transb,
std::int64_t m, std::int64_t n, std::int64_t k, float alpha, const sycl::half *a,
std::int64_t lda, const sycl::half *b, std::int64_t ldb, float beta, float *c,
std::int64_t ldc, const std::vector<sycl::event> &dependencies) {
#ifdef ENABLE_PORTBLAS_HALF
CALL_PORTBLAS_USM_FN(::blas::_gemm, queue, transa, transb, m, n, k, alpha, a, lda, b, ldb, beta,
c, ldc, dependencies);
#else
throw unimplemented("blas", "gemm", " for USM");
#endif
}

} // namespace row_major
Expand Down
1 change: 1 addition & 0 deletions src/config.hpp.in
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#cmakedefine ENABLE_PORTBLAS_BACKEND_INTEL_CPU
#cmakedefine ENABLE_PORTBLAS_BACKEND_INTEL_GPU
#cmakedefine ENABLE_PORTBLAS_BACKEND_NVIDIA_GPU
#cmakedefine ENABLE_PORTBLAS_HALF
#cmakedefine ENABLE_PORTFFT_BACKEND
#cmakedefine ENABLE_ROCBLAS_BACKEND
#cmakedefine ENABLE_ROCFFT_BACKEND
Expand Down
Loading
Loading