char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
661643e43
char/aliceai-t5-moe
1// 2// MIT license 3// Copyright (C) 2024 Intel Corporation 4// SPDX-License-Identifier: MIT 5// 6 7// 8// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 9// See https://llvm.org/LICENSE.txt for license information. 10// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 11// 12 13#ifndef GGML_SYCL_GEMM_HPP 14#define GGML_SYCL_GEMM_HPP 15 16#include "ggml-sycl.h" 17 18#if GGML_SYCL_DNNL 19 20#include "dnnl.hpp" 21#include "dnnl_sycl.hpp" 22 23class DnnlGemmWrapper { 24public : 25using dt = dnnl::memory::data_type ; 26using tag = dnnl::memory::format_tag ; 27 28template < typename T > 29static constexpr dt to_dt () { 30if constexpr (std::is_same_v < T ,float > )return dt::f32 ; 31else if constexpr (std::is_same_v < T , sycl::half > )return dt::f16 ; 32#ifdef GGML_SYCL_HAS_BF16 33else if constexpr (std::is_same_v < T , sycl::ext::oneapi::bfloat16 > )return dt::bf16 ; 34#endif 35else static_assert (0 ); 36 } 37 38static void gemm (ggml_backend_sycl_context & ctx ,int m ,int n ,int k , 39const void * a ,dt at ,dnnl_dim_t stra0 ,dnnl_dim_t stra1 ,dnnl_dim_t stra2 , 40const void * b ,dt bt ,dnnl_dim_t strb0 ,dnnl_dim_t strb1 ,dnnl_dim_t strb2 , 41void * c ,dt ct ,const queue_ptr & q ,dnnl_dim_t batches_a ,dnnl_dim_t batches_b ) { 42 43auto stream = ctx .stream_dnnl (q ); 44auto eng = ctx .engine_dnnl (q ); 45 46 dnnl::memory::dims a_dims = {batches_a ,m ,k }; 47 dnnl::memory::dims a_strides = {stra2 ,stra1 ,stra0 }; 48const auto a_in_md = dnnl::memory::desc (a_dims ,at ,a_strides ); 49 50 dnnl::memory::dims b_dims = {batches_b ,k ,n }; 51 dnnl::memory::dims b_strides = {strb2 ,strb0 ,strb1 }; 52const auto b_in_md = dnnl::memory::desc (b_dims ,bt ,b_strides ); 53 54 dnnl::memory::dims c_dims = { std::max (batches_a ,batches_b ),m ,n }; 55 dnnl::memory::dims c_strides = {m * n ,1 ,m }; 56const auto c_md = dnnl::memory::desc (c_dims ,ct ,c_strides ); 57 dnnl::primitive_attr primitive_attr ; 58primitive_attr .set_scratchpad_mode (dnnl::scratchpad_mode::user ); 59 60#ifdef GGML_SYCL_F16 61primitive_attr .set_fpmath_mode (dnnl::fpmath_mode::f16 ); 62#endif 63 64auto a_mem = dnnl::memory (a_in_md ,eng ,const_cast < void *> (a )); 65auto b_mem = dnnl::memory (b_in_md ,eng ,const_cast < void *> (b )); 66auto matmul_pd = dnnl::matmul::primitive_desc (eng ,a_in_md ,b_in_md ,c_md ,primitive_attr ); 67auto c_mem = dnnl::memory (matmul_pd .dst_desc (),eng ,c ); 68 69const auto scratchpad_md = matmul_pd .scratchpad_desc (); 70ggml_sycl_pool_alloc < uint8_t > scratchpad (ctx .pool ()); 71void * scratchpad_ptr = scratchpad_md .get_size ()> 0 ?scratchpad .alloc (scratchpad_md .get_size ()) :nullptr ; 72auto scratchpad_mem = dnnl::memory (scratchpad_md ,eng ,scratchpad_ptr ); 73 74auto matmul_prim = dnnl::matmul (matmul_pd ); 75 76 std::unordered_map < int , dnnl::memory > matmul_args ; 77matmul_args .insert ({DNNL_ARG_SRC ,a_mem }); 78matmul_args .insert ({DNNL_ARG_WEIGHTS ,b_mem }); 79 80matmul_args .insert ({DNNL_ARG_DST ,c_mem }); 81matmul_args .insert ({DNNL_ARG_SCRATCHPAD ,scratchpad_mem }); 82 83matmul_prim .execute (stream ,matmul_args ); 84 } 85 86static void row_gemm (ggml_backend_sycl_context & ctx ,int m ,int n ,int k , 87const void * a ,dt at ,const void * b ,dt bt ,void * c ,dt ct ,const queue_ptr & q ) { 88 89gemm (ctx ,m ,n ,k ,a ,at ,1 ,k ,k * m ,b ,bt ,1 ,k ,n * k ,c ,ct ,q ,1 ,1 ); 90 } 91}; 92 93#endif 94 95#endif // GGML_SYCL_GEMM_HPP