char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
d3fba0c79
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#include "ggml-impl.h" 14#include "common.hpp" 15#include "dequantize.hpp" 16#include "getrows.hpp" 17 18 19template < int qk ,int qr ,dequantize_kernel_t dequantize_kernel ,typename dst_t > 20static void k_get_rows ( 21const void * src0 ,const int32_t * src1 ,dst_t * dst , 22int64_t ne00 ,/*int64_t ne01, int64_t ne02, int64_t ne03,*/ 23/*int64_t ne10, int64_t ne11,*/ int64_t ne12 ,/*int64_t ne13,*/ 24/*size_t s0,*/ size_t s1 ,size_t s2 ,size_t s3 , 25/*size_t nb00,*/ size_t nb01 ,size_t nb02 ,size_t nb03 , 26size_t s10 ,size_t s11 ,size_t s12 , 27const sycl::nd_item < 3 > & item_ct1 /*, size_t s13*/ ) { 28 29const int i00 = (item_ct1 .get_group (2 )* item_ct1 .get_local_range (2 )+ 30item_ct1 .get_local_id (2 ))* 312 ; 32const int i10 = item_ct1 .get_local_range (1 )* item_ct1 .get_group (1 )+ 33item_ct1 .get_local_id (1 ); 34const int i11 = (item_ct1 .get_group (0 )* item_ct1 .get_local_range (0 )+ 35item_ct1 .get_local_id (0 )) / 36ne12 ; 37const int i12 = (item_ct1 .get_group (0 )* item_ct1 .get_local_range (0 )+ 38item_ct1 .get_local_id (0 )) % 39ne12 ; 40 41if (i00 >=ne00 ) { 42return ; 43 } 44 45const int i01 = src1 [i10 * s10 + i11 * s11 + i12 * s12 ]; 46 47dst_t * dst_row = dst + i10 * s1 + i11 * s2 + i12 * s3 ; 48const void * src0_row = (const char * )src0 + i01 * nb01 + i11 * nb02 + i12 * nb03 ; 49 50const int ib = i00 /qk ;// block index 51const int iqs = (i00 %qk )/qr ;// quant index 52const int iybs = i00 - i00 %qk ;// dst block start index 53const int y_offset = qr == 1 ?1 :qk /2 ; 54 55// dequantize 56dfloat2 v ; 57dequantize_kernel (src0_row ,ib ,iqs ,v ); 58 59dst_row [iybs + iqs + 0 ]= v .x (); 60dst_row [iybs + iqs + y_offset ]= v .y (); 61} 62 63template < int qk ,int qr ,dequantize_kernel_f32_t dequantize_kernel ,typename dst_t > 64static void k_get_rows_f32 ( 65const void * src0 ,const int32_t * src1 ,dst_t * dst , 66int64_t ne00 , 67int64_t ne12 , 68size_t s1 ,size_t s2 ,size_t s3 , 69size_t nb01 ,size_t nb02 ,size_t nb03 , 70size_t s10 ,size_t s11 ,size_t s12 , 71const sycl::nd_item < 3 > & item_ct1 ) { 72 73const int i00 = (item_ct1 .get_group (2 )* item_ct1 .get_local_range (2 )+ 74item_ct1 .get_local_id (2 ))* 752 ; 76const int i10 = item_ct1 .get_local_range (1 )* item_ct1 .get_group (1 )+ 77item_ct1 .get_local_id (1 ); 78const int i11 = (item_ct1 .get_group (0 )* item_ct1 .get_local_range (0 )+ 79item_ct1 .get_local_id (0 )) / 80ne12 ; 81const int i12 = (item_ct1 .get_group (0 )* item_ct1 .get_local_range (0 )+ 82item_ct1 .get_local_id (0 )) % 83ne12 ; 84 85if (i00 >=ne00 ) { 86return ; 87 } 88 89const int i01 = src1 [i10 * s10 + i11 * s11 + i12 * s12 ]; 90 91dst_t * dst_row = dst + i10 * s1 + i11 * s2 + i12 * s3 ; 92const void * src0_row = (const char * )src0 + i01 * nb01 + i11 * nb02 + i12 * nb03 ; 93 94const int ib = i00 /qk ; 95const int iqs = (i00 %qk )/qr ; 96const int iybs = i00 - i00 %qk ; 97const int y_offset = qr == 1 ?1 :qk /2 ; 98 99float v0 ; 100float v1 ; 101dequantize_kernel (src0_row ,ib ,iqs ,v0 ,v1 ); 102 103dst_row [iybs + iqs + 0 ]= (dst_t )v0 ; 104dst_row [iybs + iqs + y_offset ]= (dst_t )v1 ; 105} 106 107template < typename src0_t ,typename dst_t > 108static void k_get_rows_float ( 109const src0_t * src0 ,const int32_t * src1 ,dst_t * dst , 110int64_t ne00 ,/*int64_t ne01, int64_t ne02, int64_t ne03,*/ 111/*int64_t ne10, int64_t ne11,*/ int64_t ne12 ,/*int64_t ne13,*/ 112/*size_t s0,*/ size_t s1 ,size_t s2 ,size_t s3 , 113/*size_t nb00,*/ size_t nb01 ,size_t nb02 ,size_t nb03 , 114size_t s10 ,size_t s11 ,size_t s12 , 115const sycl::nd_item < 3 > & item_ct1 /*, size_t s13*/ ) { 116 117const int i00 = item_ct1 .get_group (2 )* item_ct1 .get_local_range (2 )+ 118item_ct1 .get_local_id (2 ); 119const int i10 = item_ct1 .get_local_range (1 )* item_ct1 .get_group (1 )+ 120item_ct1 .get_local_id (1 ); 121const int i11 = (item_ct1 .get_group (0 )* item_ct1 .get_local_range (0 )+ 122item_ct1 .get_local_id (0 )) / 123ne12 ; 124const int i12 = (item_ct1 .get_group (0 )* item_ct1 .get_local_range (0 )+ 125item_ct1 .get_local_id (0 )) % 126ne12 ; 127 128if (i00 >=ne00 ) { 129return ; 130 } 131 132const int i01 = src1 [i10 * s10 + i11 * s11 + i12 * s12 ]; 133 134dst_t * dst_row = dst + i10 * s1 + i11 * s2 + i12 * s3 ; 135const src0_t * src0_row = (const src0_t * )((const char * )src0 + i01 * nb01 + i11 * nb02 + i12 * nb03 ); 136 137dst_row [i00 ]= src0_row [i00 ]; 138} 139 140template < int qk ,int qr ,dequantize_kernel_t dq > 141static void get_rows_sycl (ggml_backend_sycl_context & ctx ,const ggml_tensor * src0 ,const ggml_tensor * src1 , 142ggml_tensor * dst ,const void * src0_dd , 143const int32_t * src1_dd ,float * dst_dd , 144queue_ptr stream ) { 145 146GGML_TENSOR_BINARY_OP_LOCALS 147 148const sycl::range < 3 > block_dims (1 ,1 ,SYCL_GET_ROWS_BLOCK_SIZE ); 149const int block_num_x = (ne00 + 2 * SYCL_GET_ROWS_BLOCK_SIZE - 1 ) / (2 * SYCL_GET_ROWS_BLOCK_SIZE ); 150const sycl::range < 3 > block_nums (ne11 * ne12 ,ne10 ,block_num_x ); 151 152// strides in elements 153//const size_t s0 = nb0 / ggml_element_size(dst); 154const size_t s1 = nb1 /ggml_element_size (dst ); 155const size_t s2 = nb2 /ggml_element_size (dst ); 156const size_t s3 = nb3 /ggml_element_size (dst ); 157 158const size_t s10 = nb10 /ggml_element_size (src1 ); 159const size_t s11 = nb11 /ggml_element_size (src1 ); 160const size_t s12 = nb12 /ggml_element_size (src1 ); 161//const size_t s13 = nb13 / ggml_element_size(src1); 162 163GGML_ASSERT (ne00 %2 == 0 ); 164 165stream -> parallel_for (sycl::nd_range < 3 > (block_nums * block_dims ,block_dims ), 166 [= ](sycl::nd_item < 3 > item_ct1 ) { 167k_get_rows < qk ,qr ,dq > ( 168src0_dd ,src1_dd ,dst_dd ,ne00 ,ne12 ,s1 ,s2 , 169s3 ,nb01 ,nb02 ,nb03 ,s10 ,s11 ,s12 ,item_ct1 ); 170 }); 171 172GGML_UNUSED (dst ); 173GGML_UNUSED (ctx ); 174} 175 176template < int qk ,int qr ,dequantize_kernel_f32_t dq > 177static void get_rows_sycl_f32 (ggml_backend_sycl_context & ctx ,const ggml_tensor * src0 ,const ggml_tensor * src1 , 178ggml_tensor * dst ,const void * src0_dd , 179const int32_t * src1_dd ,float * dst_dd , 180queue_ptr stream ) { 181 182GGML_TENSOR_BINARY_OP_LOCALS 183 184const sycl::range < 3 > block_dims (1 ,1 ,SYCL_GET_ROWS_BLOCK_SIZE ); 185const int block_num_x = (ne00 + 2 * SYCL_GET_ROWS_BLOCK_SIZE - 1 ) / (2 * SYCL_GET_ROWS_BLOCK_SIZE ); 186const sycl::range < 3 > block_nums (ne11 * ne12 ,ne10 ,block_num_x ); 187 188const size_t s1 = nb1 /ggml_element_size (dst ); 189const size_t s2 = nb2 /ggml_element_size (dst ); 190const size_t s3 = nb3 /ggml_element_size (dst ); 191 192const size_t s10 = nb10 /ggml_element_size (src1 ); 193const size_t s11 = nb11 /ggml_element_size (src1 ); 194const size_t s12 = nb12 /ggml_element_size (src1 ); 195 196GGML_ASSERT (ne00 %2 == 0 ); 197 198stream -> parallel_for (sycl::nd_range < 3 > (block_nums * block_dims ,block_dims ), 199 [= ](sycl::nd_item < 3 > item_ct1 ) { 200k_get_rows_f32 < qk ,qr ,dq > ( 201src0_dd ,src1_dd ,dst_dd ,ne00 ,ne12 ,s1 ,s2 , 202s3 ,nb01 ,nb02 ,nb03 ,s10 ,s11 ,s12 ,item_ct1 ); 203 }); 204 205GGML_UNUSED (dst ); 206GGML_UNUSED (ctx ); 207} 208 209template < typename src0_t ,typename dst_t > 210static void get_rows_sycl_float (ggml_backend_sycl_context & ctx ,const ggml_tensor * src0 , 211const ggml_tensor * src1 ,ggml_tensor * dst , 212const src0_t * src0_dd ,const int32_t * src1_dd , 213dst_t * dst_dd ,queue_ptr stream ) { 214 215GGML_TENSOR_BINARY_OP_LOCALS 216 217const sycl::range < 3 > block_dims (1 ,1 ,SYCL_GET_ROWS_BLOCK_SIZE ); 218const int block_num_x = (ne00 + SYCL_GET_ROWS_BLOCK_SIZE - 1 ) /SYCL_GET_ROWS_BLOCK_SIZE ; 219const sycl::range < 3 > block_nums (ne11 * ne12 ,ne10 ,block_num_x ); 220 221// strides in elements 222//const size_t s0 = nb0 / ggml_element_size(dst); 223const size_t s1 = nb1 /ggml_element_size (dst ); 224const size_t s2 = nb2 /ggml_element_size (dst ); 225const size_t s3 = nb3 /ggml_element_size (dst ); 226 227const size_t s10 = nb10 /ggml_element_size (src1 ); 228const size_t s11 = nb11 /ggml_element_size (src1 ); 229const size_t s12 = nb12 /ggml_element_size (src1 ); 230//const size_t s13 = nb13 / ggml_element_size(src1); 231 232 { 233 dpct::has_capability_or_fail (stream -> get_device (), 234 {sycl::aspect::fp16 }); 235 236stream -> parallel_for ( 237 sycl::nd_range < 3 > (block_nums * block_dims ,block_dims ), 238 [= ](sycl::nd_item < 3 > item_ct1 ) { 239k_get_rows_float (src0_dd ,src1_dd ,dst_dd ,ne00 ,ne12 ,s1 ,s2 , 240s3 ,nb01 ,nb02 ,nb03 ,s10 ,s11 ,s12 ,item_ct1 ); 241 }); 242 } 243 244GGML_UNUSED (dst ); 245GGML_UNUSED (ctx ); 246} 247 248void ggml_sycl_op_get_rows (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 249GGML_ASSERT (dst -> src [1 ]-> type == GGML_TYPE_I32 ); 250GGML_ASSERT (dst -> type == GGML_TYPE_F32 || dst -> type == GGML_TYPE_I32 ); 251 252GGML_ASSERT (dst -> src [0 ]-> nb [0 ]== ggml_type_size (dst -> src [0 ]-> type )); 253GGML_ASSERT (dst -> src [1 ]-> nb [0 ]== ggml_type_size (dst -> src [1 ]-> type )); 254GGML_ASSERT (dst -> nb [0 ]== ggml_type_size (dst -> type )); 255 256const int32_t * src1_i32 = (const int32_t * )dst -> src [1 ]-> data ; 257/* TODO: Refactor and remove duplicates */ 258switch (dst -> src [0 ]-> type ) { 259case GGML_TYPE_F16 : 260get_rows_sycl_float (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const sycl::half * )dst -> src [0 ]-> data , 261src1_i32 , (float * )dst -> data ,ctx .stream ()); 262break ; 263case GGML_TYPE_BF16 : 264get_rows_sycl_float (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const sycl::ext::oneapi::bfloat16 * )dst -> src [0 ]-> data , 265src1_i32 , (float * )dst -> data ,ctx .stream ()); 266break ; 267case GGML_TYPE_F32 : 268get_rows_sycl_float (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 269src1_i32 , (float * )dst -> data ,ctx .stream ()); 270break ; 271case GGML_TYPE_I32 : 272get_rows_sycl_float (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const int32_t * )dst -> src [0 ]-> data , 273src1_i32 , (int32_t * )dst -> data ,ctx .stream ()); 274break ; 275case GGML_TYPE_Q1_0 : 276get_rows_sycl < QK1_0 ,1 ,dequantize_q1_0 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 277src1_i32 , (float * )dst -> data ,ctx .stream ()); 278break ; 279case GGML_TYPE_MXFP4 : 280get_rows_sycl < QK_MXFP4 ,2 ,dequantize_mxfp4 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 281src1_i32 , (float * )dst -> data ,ctx .stream ()); 282break ; 283case GGML_TYPE_NVFP4 : 284get_rows_sycl < QK_NVFP4 ,1 ,dequantize_nvfp4 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 285src1_i32 , (float * )dst -> data ,ctx .stream ()); 286break ; 287case GGML_TYPE_IQ2_XXS : 288get_rows_sycl < QK_K ,1 ,dequantize_iq2_xxs > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 289src1_i32 , (float * )dst -> data ,ctx .stream ()); 290break ; 291case GGML_TYPE_IQ2_XS : 292get_rows_sycl < QK_K ,1 ,dequantize_iq2_xs > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 293src1_i32 , (float * )dst -> data ,ctx .stream ()); 294break ; 295case GGML_TYPE_IQ2_S : 296get_rows_sycl < QK_K ,1 ,dequantize_iq2_s > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 297src1_i32 , (float * )dst -> data ,ctx .stream ()); 298break ; 299case GGML_TYPE_IQ3_XXS : 300get_rows_sycl < QK_K ,1 ,dequantize_iq3_xxs > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 301src1_i32 , (float * )dst -> data ,ctx .stream ()); 302break ; 303case GGML_TYPE_IQ1_S : 304get_rows_sycl < QK_K ,1 ,dequantize_iq1_s > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 305src1_i32 , (float * )dst -> data ,ctx .stream ()); 306break ; 307case GGML_TYPE_IQ1_M : 308get_rows_sycl < QK_K ,1 ,dequantize_iq1_m > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 309src1_i32 , (float * )dst -> data ,ctx .stream ()); 310break ; 311case GGML_TYPE_IQ3_S : 312get_rows_sycl < QK_K ,1 ,dequantize_iq3_s > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 313src1_i32 , (float * )dst -> data ,ctx .stream ()); 314break ; 315case GGML_TYPE_IQ4_NL : 316get_rows_sycl < QK4_NL ,1 ,dequantize_iq4_nl > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 317src1_i32 , (float * )dst -> data ,ctx .stream ()); 318break ; 319case GGML_TYPE_IQ4_XS : 320get_rows_sycl < QK_K ,1 ,dequantize_iq4_xs > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 321src1_i32 , (float * )dst -> data ,ctx .stream ()); 322break ; 323case GGML_TYPE_Q2_K : 324get_rows_sycl_f32 < QK_K ,1 ,dequantize_q2_K_f32 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 325src1_i32 , (float * )dst -> data ,ctx .stream ()); 326break ; 327case GGML_TYPE_Q3_K : 328get_rows_sycl < QK_K ,1 ,dequantize_q3_K > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 329src1_i32 , (float * )dst -> data ,ctx .stream ()); 330break ; 331case GGML_TYPE_Q4_0 : 332get_rows_sycl < QK4_0 ,QR4_0 ,dequantize_q4_0 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 333src1_i32 , (float * )dst -> data ,ctx .stream ()); 334break ; 335case GGML_TYPE_Q4_1 : 336get_rows_sycl < QK4_1 ,QR4_1 ,dequantize_q4_1 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 337src1_i32 , (float * )dst -> data ,ctx .stream ()); 338break ; 339case GGML_TYPE_Q4_K : 340get_rows_sycl_f32 < QK_K ,1 ,dequantize_q4_K_f32 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 341src1_i32 , (float * )dst -> data ,ctx .stream ()); 342break ; 343case GGML_TYPE_Q5_0 : 344get_rows_sycl < QK5_0 ,QR5_0 ,dequantize_q5_0 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 345src1_i32 , (float * )dst -> data ,ctx .stream ()); 346break ; 347case GGML_TYPE_Q5_1 : 348get_rows_sycl < QK5_1 ,QR5_1 ,dequantize_q5_1 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 349src1_i32 , (float * )dst -> data ,ctx .stream ()); 350break ; 351case GGML_TYPE_Q5_K : 352get_rows_sycl_f32 < QK_K ,1 ,dequantize_q5_K_f32 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 353src1_i32 , (float * )dst -> data ,ctx .stream ()); 354break ; 355case GGML_TYPE_Q6_K : 356get_rows_sycl < QK_K ,1 ,dequantize_q6_K > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 357src1_i32 , (float * )dst -> data ,ctx .stream ()); 358break ; 359case GGML_TYPE_Q8_0 : 360get_rows_sycl < QK8_0 ,QR8_0 ,dequantize_q8_0 > (ctx ,dst -> src [0 ],dst -> src [1 ],dst , (const float * )dst -> src [0 ]-> data , 361src1_i32 , (float * )dst -> data ,ctx .stream ()); 362break ; 363default : 364// TODO: k-quants 365GGML_LOG_ERROR ("%s: unsupported type: %s\n" ,__func__ ,ggml_type_name (dst -> src [0 ]-> type )); 366GGML_ABORT ("fatal error" ); 367 } 368}