mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2024-12-27 03:44:35 +00:00
SYCL : Move to compile time oneMKL interface backend selection for NVIDIA backend (#10584)
* [SYCL] Move to Compile Time backend selection on oneMKL Interface for NVIDIA backend Move to compile time selection to backend to avoid latency at run time. Add it to all mkl gemm calls and only for NVIDIA backend. Signed-off-by: nscipione <nicolo.scipione@codeplay.com> * Formatting * Address PR comments to increase readibility --------- Signed-off-by: nscipione <nicolo.scipione@codeplay.com>
This commit is contained in:
parent
98036d5670
commit
40c6d79fb5
@ -68,7 +68,8 @@ else()
|
|||||||
target_link_libraries(ggml-sycl PRIVATE sycl OpenCL mkl_core pthread m dl mkl_sycl_blas mkl_intel_ilp64 mkl_tbb_thread)
|
target_link_libraries(ggml-sycl PRIVATE sycl OpenCL mkl_core pthread m dl mkl_sycl_blas mkl_intel_ilp64 mkl_tbb_thread)
|
||||||
elseif (GGML_SYCL_TARGET STREQUAL "NVIDIA")
|
elseif (GGML_SYCL_TARGET STREQUAL "NVIDIA")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsycl-targets=nvptx64-nvidia-cuda")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsycl-targets=nvptx64-nvidia-cuda")
|
||||||
target_link_libraries(ggml-sycl PRIVATE sycl pthread m dl onemkl)
|
add_compile_definitions(GGML_SYCL_NVIDIA)
|
||||||
|
target_link_libraries(ggml-sycl PRIVATE sycl pthread m dl onemkl_blas_cublas)
|
||||||
elseif (GGML_SYCL_TARGET STREQUAL "AMD")
|
elseif (GGML_SYCL_TARGET STREQUAL "AMD")
|
||||||
if (NOT GGML_SYCL_DEVICE_ARCH)
|
if (NOT GGML_SYCL_DEVICE_ARCH)
|
||||||
message(ERROR "Can't enable SYCL hip backend, GGML_SYCL_DEVICE_ARCH has not been set.")
|
message(ERROR "Can't enable SYCL hip backend, GGML_SYCL_DEVICE_ARCH has not been set.")
|
||||||
|
@ -1689,9 +1689,14 @@ namespace dpct
|
|||||||
auto data_a = get_memory<const Ta>(a);
|
auto data_a = get_memory<const Ta>(a);
|
||||||
auto data_b = get_memory<const Tb>(b);
|
auto data_b = get_memory<const Tb>(b);
|
||||||
auto data_c = get_memory<Tc>(c);
|
auto data_c = get_memory<Tc>(c);
|
||||||
oneapi::mkl::blas::column_major::gemm(
|
#ifdef GGML_SYCL_NVIDIA
|
||||||
q, a_trans, b_trans, m, n, k, alpha_value, data_a, lda,
|
oneapi::mkl::blas::column_major::gemm(oneapi::mkl::backend_selector<oneapi::mkl::backend::cublas>{ q },
|
||||||
data_b, ldb, beta_value, data_c, ldc);
|
a_trans, b_trans, m, n, k, alpha_value, data_a, lda, data_b, ldb,
|
||||||
|
beta_value, data_c, ldc);
|
||||||
|
#else
|
||||||
|
oneapi::mkl::blas::column_major::gemm(q, a_trans, b_trans, m, n, k, alpha_value, data_a, lda, data_b, ldb,
|
||||||
|
beta_value, data_c, ldc);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename VecT, class BinaryOperation, class = void>
|
template <typename VecT, class BinaryOperation, class = void>
|
||||||
@ -1754,14 +1759,22 @@ namespace dpct
|
|||||||
matrix_info->ld_info[2] = ldc;
|
matrix_info->ld_info[2] = ldc;
|
||||||
matrix_info->groupsize_info = batch_size;
|
matrix_info->groupsize_info = batch_size;
|
||||||
|
|
||||||
|
#ifdef GGML_SYCL_NVIDIA
|
||||||
sycl::event e = oneapi::mkl::blas::column_major::gemm_batch(
|
sycl::event e = oneapi::mkl::blas::column_major::gemm_batch(
|
||||||
q, matrix_info->transpose_info, matrix_info->transpose_info + 1,
|
oneapi::mkl::backend_selector<oneapi::mkl::backend::cublas>{ q }, matrix_info->transpose_info,
|
||||||
matrix_info->size_info, matrix_info->size_info + 1,
|
matrix_info->transpose_info + 1, matrix_info->size_info, matrix_info->size_info + 1,
|
||||||
matrix_info->size_info + 2, matrix_info->value_info,
|
matrix_info->size_info + 2, matrix_info->value_info, reinterpret_cast<const Ta **>(a),
|
||||||
reinterpret_cast<const Ta **>(a), matrix_info->ld_info,
|
matrix_info->ld_info, reinterpret_cast<const Tb **>(b), matrix_info->ld_info + 1,
|
||||||
reinterpret_cast<const Tb **>(b), matrix_info->ld_info + 1,
|
matrix_info->value_info + 1, reinterpret_cast<Tc **>(c), matrix_info->ld_info + 2, 1,
|
||||||
matrix_info->value_info + 1, reinterpret_cast<Tc **>(c),
|
&(matrix_info->groupsize_info));
|
||||||
|
#else
|
||||||
|
sycl::event e = oneapi::mkl::blas::column_major::gemm_batch(
|
||||||
|
q, matrix_info->transpose_info, matrix_info->transpose_info + 1, matrix_info->size_info,
|
||||||
|
matrix_info->size_info + 1, matrix_info->size_info + 2, matrix_info->value_info,
|
||||||
|
reinterpret_cast<const Ta **>(a), matrix_info->ld_info, reinterpret_cast<const Tb **>(b),
|
||||||
|
matrix_info->ld_info + 1, matrix_info->value_info + 1, reinterpret_cast<Tc **>(c),
|
||||||
matrix_info->ld_info + 2, 1, &(matrix_info->groupsize_info));
|
matrix_info->ld_info + 2, 1, &(matrix_info->groupsize_info));
|
||||||
|
#endif
|
||||||
|
|
||||||
q.submit([&](sycl::handler &cgh)
|
q.submit([&](sycl::handler &cgh)
|
||||||
{
|
{
|
||||||
@ -1783,10 +1796,16 @@ namespace dpct
|
|||||||
auto data_a = get_memory<const Ta>(a);
|
auto data_a = get_memory<const Ta>(a);
|
||||||
auto data_b = get_memory<const Tb>(b);
|
auto data_b = get_memory<const Tb>(b);
|
||||||
auto data_c = get_memory<Tc>(c);
|
auto data_c = get_memory<Tc>(c);
|
||||||
|
#ifdef GGML_SYCL_NVIDIA
|
||||||
oneapi::mkl::blas::column_major::gemm_batch(
|
oneapi::mkl::blas::column_major::gemm_batch(
|
||||||
q, a_trans, b_trans, m, n, k, alpha_value, data_a, lda,
|
oneapi::mkl::backend_selector<oneapi::mkl::backend::cublas>{ q }, a_trans, b_trans, m, n, k,
|
||||||
stride_a, data_b, ldb, stride_b, beta_value,
|
alpha_value, data_a, lda, stride_a, data_b, ldb, stride_b, beta_value, data_c, ldc, stride_c,
|
||||||
data_c, ldc, stride_c, batch_size);
|
batch_size);
|
||||||
|
#else
|
||||||
|
oneapi::mkl::blas::column_major::gemm_batch(q, a_trans, b_trans, m, n, k, alpha_value, data_a, lda,
|
||||||
|
stride_a, data_b, ldb, stride_b, beta_value, data_c, ldc,
|
||||||
|
stride_c, batch_size);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
@ -2573,12 +2573,17 @@ inline void ggml_sycl_op_mul_mat_sycl(
|
|||||||
const float alpha = 1.0f;
|
const float alpha = 1.0f;
|
||||||
const float beta = 0.0f;
|
const float beta = 0.0f;
|
||||||
#if !GGML_SYCL_DNNL
|
#if !GGML_SYCL_DNNL
|
||||||
|
# ifdef GGML_SYCL_NVIDIA
|
||||||
SYCL_CHECK(CHECK_TRY_ERROR(oneapi::mkl::blas::column_major::gemm(
|
SYCL_CHECK(CHECK_TRY_ERROR(oneapi::mkl::blas::column_major::gemm(
|
||||||
*stream, oneapi::mkl::transpose::trans,
|
oneapi::mkl::backend_selector<oneapi::mkl::backend::cublas>{ *stream }, oneapi::mkl::transpose::trans,
|
||||||
oneapi::mkl::transpose::nontrans, row_diff, src1_ncols, ne10,
|
oneapi::mkl::transpose::nontrans, row_diff, src1_ncols, ne10, dpct::get_value(&alpha, *stream), src0_ddf_i,
|
||||||
dpct::get_value(&alpha, *stream), src0_ddf_i, ne00,
|
ne00, src1_ddf1_i, ne10, dpct::get_value(&beta, *stream), dst_dd_i, ldc)));
|
||||||
src1_ddf1_i, ne10, dpct::get_value(&beta, *stream),
|
# else
|
||||||
|
SYCL_CHECK(CHECK_TRY_ERROR(oneapi::mkl::blas::column_major::gemm(
|
||||||
|
*stream, oneapi::mkl::transpose::trans, oneapi::mkl::transpose::nontrans, row_diff, src1_ncols, ne10,
|
||||||
|
dpct::get_value(&alpha, *stream), src0_ddf_i, ne00, src1_ddf1_i, ne10, dpct::get_value(&beta, *stream),
|
||||||
dst_dd_i, ldc)));
|
dst_dd_i, ldc)));
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
auto dnnl_stream = ctx.stream_dnnl(stream);
|
auto dnnl_stream = ctx.stream_dnnl(stream);
|
||||||
DnnlGemmWrapper::row_gemm(dnnl_stream, false, true, src1_ncols, row_diff, ne10, src1_ddf1_i, DnnlGemmWrapper::to_dt<float>(),
|
DnnlGemmWrapper::row_gemm(dnnl_stream, false, true, src1_ncols, row_diff, ne10, src1_ddf1_i, DnnlGemmWrapper::to_dt<float>(),
|
||||||
|
@ -40,14 +40,14 @@ void ggml_sycl_op_out_prod(ggml_backend_sycl_context& ctx, const ggml_tensor* sr
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Perform matrix multiplication using oneMKL GEMM
|
// Perform matrix multiplication using oneMKL GEMM
|
||||||
oneapi::mkl::blas::column_major::gemm(*stream,
|
#ifdef GGML_SYCL_NVIDIA
|
||||||
oneapi::mkl::transpose::nontrans, src1_op,
|
oneapi::mkl::blas::column_major::gemm(oneapi::mkl::backend_selector<oneapi::mkl::backend::cublas>{ *stream },
|
||||||
ne0, ne1, ne01,
|
oneapi::mkl::transpose::nontrans, src1_op, ne0, ne1, ne01, alpha, src0_d,
|
||||||
alpha,
|
ne00, src1_d, ldb, beta, dst_d, ne0);
|
||||||
src0_d, ne00,
|
#else
|
||||||
src1_d, ldb,
|
oneapi::mkl::blas::column_major::gemm(*stream, oneapi::mkl::transpose::nontrans, src1_op, ne0, ne1, ne01, alpha,
|
||||||
beta,
|
src0_d, ne00, src1_d, ldb, beta, dst_d, ne0);
|
||||||
dst_d, ne0);
|
#endif
|
||||||
}
|
}
|
||||||
catch (sycl::exception const& exc) {
|
catch (sycl::exception const& exc) {
|
||||||
std::cerr << exc.what() << std::endl;
|
std::cerr << exc.what() << std::endl;
|
||||||
|
Loading…
Reference in New Issue
Block a user