char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
f8e30266d
char/aliceai-t5-moe
1#include "ssm_conv.hpp" 2#include "common.hpp" 3 4#include <cstdio> 5 6using namespace sycl ; 7 8static void kernel_ssm_conv ( 9queue & q , 10const float * src_data , 11const float * weights , 12float * dst_data , 13int d_conv , 14int d_inner , 15int n_t , 16int n_s , 17int ncs __attribute__((unused )), 18int src_stride_inner , 19int src_stride_seq , 20int dst_stride_token , 21int dst_stride_seq 22) { 23const size_t total_work = static_cast < size_t > (d_inner )* static_cast < size_t > (n_t )* static_cast < size_t > (n_s ); 24const size_t work_group_size = 256 ; 25const size_t num_work_groups = (total_work + work_group_size - 1 ) /work_group_size ; 26 27const range < 1 > global_range (num_work_groups * work_group_size ); 28const range < 1 > local_range (work_group_size ); 29 30q .submit ([& ](handler & h ) { 31h .parallel_for ( 32nd_range < 1 > (global_range ,local_range ), 33 [= ](nd_item < 1 > item ) { 34const size_t idx = item .get_global_id (0 ); 35if (idx >=total_work ) { 36return ; 37 } 38 39// src has the tokens of one channel contiguous, dst has the channels of one 40// token contiguous, so either the loads or the store must be strided. Indexing 41// token-fastest coalesces the d_conv loads, which measured faster except for 42// short, cache-resident rows. 43const int token = static_cast < int > (idx %n_t ); 44const int channel = static_cast < int > ((idx /n_t ) %d_inner ); 45const int seq = static_cast < int > (idx / (static_cast < size_t > (n_t )* static_cast < size_t > (d_inner ))); 46 47const float * s = src_data 48+ static_cast < size_t > (seq )* static_cast < size_t > (src_stride_seq ) 49+ static_cast < size_t > (channel )* static_cast < size_t > (src_stride_inner ) 50+ static_cast < size_t > (token ); 51 52const float * c = weights + static_cast < size_t > (channel )* static_cast < size_t > (d_conv ); 53 54float sumf = 0.0f ; 55for (int i0 = 0 ;i0 < d_conv ;++ i0 ) { 56sumf += s [i0 ]* c [i0 ]; 57 } 58 59const size_t dst_idx = 60static_cast < size_t > (seq )* static_cast < size_t > (dst_stride_seq )+ 61static_cast < size_t > (token )* static_cast < size_t > (dst_stride_token )+ 62static_cast < size_t > (channel ); 63 64dst_data [dst_idx ]= sumf ; 65 } 66 ); 67 }); 68} 69 70inline void ggml_sycl_op_ssm_conv (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 71ggml_tensor * src0 = dst -> src [0 ]; 72ggml_tensor * src1 = dst -> src [1 ]; 73 74GGML_ASSERT (src0 -> type == GGML_TYPE_F32 ); 75GGML_ASSERT (src1 -> type == GGML_TYPE_F32 ); 76GGML_ASSERT (dst -> type == GGML_TYPE_F32 ); 77 78const int d_conv = src1 -> ne [0 ]; 79const int ncs = src0 -> ne [0 ]; 80const int d_inner = src0 -> ne [1 ]; 81const int n_t = dst -> ne [1 ]; 82const int n_s = dst -> ne [2 ]; 83 84GGML_ASSERT (src0 -> ne [0 ]== d_conv - 1 + n_t ); 85GGML_ASSERT (src0 -> ne [1 ]== d_inner ); 86GGML_ASSERT (src1 -> ne [1 ]== d_inner ); 87 88GGML_ASSERT (dst -> ne [0 ]== d_inner ); 89GGML_ASSERT (dst -> ne [1 ]== n_t ); 90GGML_ASSERT (dst -> ne [2 ]== n_s ); 91 92GGML_ASSERT (src0 -> nb [0 ]== sizeof (float )); 93GGML_ASSERT (src1 -> nb [0 ]== sizeof (float )); 94 95GGML_ASSERT (src0 -> nb [1 ]== src0 -> ne [0 ]* sizeof (float )); 96 97const int src_stride_inner = ncs ; 98const int src_stride_seq = ncs * d_inner ; 99const int dst_stride_token = d_inner ; 100const int dst_stride_seq = d_inner * n_t ; 101 102try { 103queue * q = ctx .stream (); 104 105const float * src_data = static_cast < const float *> (src0 -> data ); 106const float * weights = static_cast < const float *> (src1 -> data ); 107float * dst_data = static_cast < float *> (dst -> data ); 108 109GGML_ASSERT (src_data && weights && dst_data ); 110 111kernel_ssm_conv ( 112* q , 113src_data , 114weights , 115dst_data , 116d_conv , 117d_inner , 118n_t , 119n_s , 120ncs , 121src_stride_inner , 122src_stride_seq , 123dst_stride_token , 124dst_stride_seq 125 ); 126 127 }catch (const std::exception & e ) { 128 std::fprintf (stderr ,"[SYCL-SSM_CONV] ERROR: %s\n" ,e .what ()); 129throw ; 130 } 131} 132 133void ggml_sycl_ssm_conv (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 134scope_op_debug_print scope_dbg_print (__func__ ,dst ,/*num_src=*/ 2 ); 135ggml_sycl_op_ssm_conv (ctx ,dst ); 136}