char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
6703d7894
char/aliceai-t5-moe
1#include "binbcast.hpp" 2 3#include <algorithm> 4#include <cstddef> 5#include <cstdint> 6#include <sycl/sycl.hpp> 7 8#include "ggml.h" 9 10template < float (* bin_op )(const float ,const float ),typename src0_t ,typename src1_t ,typename dst_t > 11static void k_bin_bcast (const src0_t * src0 ,const src1_t * src1 ,dst_t * dst , 12int ne0 ,int ne1 ,int ne2 ,int ne3 , 13int ne10 ,int ne11 ,int ne12 ,int ne13 , 14/*int s0, */ int s1 ,int s2 ,int s3 , 15int s00 ,int s01 ,int s02 ,int s03 , 16int s10 ,int s11 ,int s12 ,int s13 , 17const sycl::nd_item < 3 > & item_ct1 ) { 18const int i0s = item_ct1 .get_local_range (2 )* item_ct1 .get_group (2 )+ 19item_ct1 .get_local_id (2 ); 20const int i1 = (item_ct1 .get_local_range (1 )* item_ct1 .get_group (1 )+ 21item_ct1 .get_local_id (1 )); 22const int i2 = (item_ct1 .get_local_range (0 )* item_ct1 .get_group (0 )+ 23item_ct1 .get_local_id (0 )) / 24ne3 ; 25const int i3 = (item_ct1 .get_local_range (0 )* item_ct1 .get_group (0 )+ 26item_ct1 .get_local_id (0 )) % 27ne3 ; 28 29if (i0s >=ne0 || i1 >=ne1 || i2 >=ne2 || i3 >=ne3 ) { 30return ; 31 } 32 33const int i11 = i1 %ne11 ; 34const int i12 = i2 %ne12 ; 35const int i13 = i3 %ne13 ; 36 37const size_t i_src0 = i3 * s03 + i2 * s02 + i1 * s01 ; 38const size_t i_src1 = i13 * s13 + i12 * s12 + i11 * s11 ; 39const size_t i_dst = i3 * s3 + i2 * s2 + i1 * s1 ; 40 41const src0_t * src0_row = src0 + i_src0 ; 42const src1_t * src1_row = src1 + i_src1 ; 43dst_t * dst_row = dst + i_dst ; 44 45for (int i0 = i0s ;i0 < ne0 ; 46i0 += item_ct1 .get_local_range (2 )* item_ct1 .get_group_range (2 )) { 47const int i10 = i0 %ne10 ; 48dst_row [i0 ]= (dst_t )bin_op (src0 ? (float )src0_row [i0 * s00 ] :0.0f , (float )src1_row [i10 * s10 ]); 49 } 50} 51 52template < float (* bin_op )(const float ,const float ),typename src0_t ,typename src1_t ,typename dst_t > 53static void k_bin_bcast_unravel (const src0_t * src0 ,const src1_t * src1 ,dst_t * dst , 54int ne0 ,int ne1 ,int ne2 ,int ne3 , 55int ne10 ,int ne11 ,int ne12 ,int ne13 , 56/*int s0, */ int s1 ,int s2 ,int s3 , 57int s00 ,int s01 ,int s02 ,int s03 , 58int s10 ,int s11 ,int s12 ,int s13 , 59const sycl::nd_item < 3 > & item_ct1 ) { 60 61const int i = item_ct1 .get_local_range (2 )* item_ct1 .get_group (2 )+ 62item_ct1 .get_local_id (2 ); 63 64const int i3 = i /(ne2 * ne1 * ne0 ); 65const int i2 = (i /(ne1 * ne0 )) %ne2 ; 66const int i1 = (i /ne0 ) %ne1 ; 67const int i0 = i %ne0 ; 68 69if (i0 >=ne0 || i1 >=ne1 || i2 >=ne2 || i3 >=ne3 ) { 70return ; 71 } 72 73const int i11 = i1 %ne11 ; 74const int i12 = i2 %ne12 ; 75const int i13 = i3 %ne13 ; 76 77const size_t i_src0 = i3 * s03 + i2 * s02 + i1 * s01 ; 78const size_t i_src1 = i13 * s13 + i12 * s12 + i11 * s11 ; 79const size_t i_dst = i3 * s3 + i2 * s2 + i1 * s1 ; 80 81const src0_t * src0_row = src0 + i_src0 ; 82const src1_t * src1_row = src1 + i_src1 ; 83dst_t * dst_row = dst + i_dst ; 84 85const int i10 = i0 %ne10 ; 86dst_row [i0 ]= (dst_t )bin_op (src0 ? (float )src0_row [i0 * s00 ] :0.0f , (float )src1_row [i10 * s10 ]); 87} 88 89 90template < float (* bin_op )(const float ,const float )> 91struct bin_bcast_sycl { 92template < typename src0_t ,typename src1_t ,typename dst_t > 93void operator()(const src0_t * src0_dd ,const src1_t * src1_dd ,dst_t * dst_dd ,const int64_t ne00 , 94const int64_t ne01 ,const int64_t ne02 ,const int64_t ne03 ,const int64_t ne10 ,const int64_t ne11 , 95const int64_t ne12 ,const int64_t ne13 ,const int64_t ne0 ,const int64_t ne1 ,const int64_t ne2 , 96const int64_t ne3 ,const size_t nb00 ,const size_t nb01 ,const size_t nb02 ,const size_t nb03 , 97const size_t nb10 ,const size_t nb11 ,const size_t nb12 ,const size_t nb13 ,const size_t nb0 , 98const size_t nb1 ,const size_t nb2 ,const size_t nb3 ,const bool src0_is_contiguous , 99const bool src1_is_contiguous ,const bool src0_is_permuted ,const bool src1_is_permuted , 100queue_ptr stream ) { 101int nr0 = ne10 /ne0 ; 102int nr1 = ne11 /ne1 ; 103int nr2 = ne12 /ne2 ; 104int nr3 = ne13 /ne3 ; 105 106int nr [4 ]= {nr0 ,nr1 ,nr2 ,nr3 }; 107 108// collapse dimensions until first broadcast dimension 109int64_t cne []= {ne0 ,ne1 ,ne2 ,ne3 }; 110int64_t cne0 []= {ne00 ,ne01 ,ne02 ,ne03 }; 111int64_t cne1 []= {ne10 ,ne11 ,ne12 ,ne13 }; 112size_t cnb []= {nb0 ,nb1 ,nb2 ,nb3 }; 113size_t cnb0 []= {nb00 ,nb01 ,nb02 ,nb03 }; 114size_t cnb1 []= {nb10 ,nb11 ,nb12 ,nb13 }; 115auto collapse = [](int64_t cne []) { 116cne [0 ] *=cne [1 ]; 117cne [1 ]= cne [2 ]; 118cne [2 ]= cne [3 ]; 119cne [3 ]= 1 ; 120 }; 121 122auto collapse_nb = [](size_t cnb [],int64_t cne []) { 123cnb [1 ] *=cne [1 ]; 124cnb [2 ] *=cne [2 ]; 125cnb [3 ] *=cne [3 ]; 126 }; 127 128if (src0_is_contiguous && src1_is_contiguous && !src0_is_permuted && !src1_is_permuted ) { 129for (int i = 0 ;i < 4 ;i ++ ) { 130if (nr [i ]!= 1 ) { 131break ; 132 } 133if (i > 0 ) { 134collapse_nb (cnb ,cne ); 135collapse_nb (cnb0 ,cne0 ); 136collapse_nb (cnb1 ,cne1 ); 137collapse (cne ); 138collapse (cne0 ); 139collapse (cne1 ); 140 } 141 } 142 } 143 { 144int64_t ne0 = cne [0 ]; 145int64_t ne1 = cne [1 ]; 146int64_t ne2 = cne [2 ]; 147int64_t ne3 = cne [3 ]; 148 149int64_t ne10 = cne1 [0 ]; 150int64_t ne11 = cne1 [1 ]; 151int64_t ne12 = cne1 [2 ]; 152int64_t ne13 = cne1 [3 ]; 153 154size_t nb0 = cnb [0 ]; 155size_t nb1 = cnb [1 ]; 156size_t nb2 = cnb [2 ]; 157size_t nb3 = cnb [3 ]; 158 159size_t nb00 = cnb0 [0 ]; 160size_t nb01 = cnb0 [1 ]; 161size_t nb02 = cnb0 [2 ]; 162size_t nb03 = cnb0 [3 ]; 163 164size_t nb10 = cnb1 [0 ]; 165size_t nb11 = cnb1 [1 ]; 166size_t nb12 = cnb1 [2 ]; 167size_t nb13 = cnb1 [3 ]; 168 169// size_t s0 = nb0 / sizeof(dst_t); 170size_t s1 = nb1 /sizeof (dst_t ); 171size_t s2 = nb2 /sizeof (dst_t ); 172size_t s3 = nb3 /sizeof (dst_t ); 173 174size_t s10 = nb10 /sizeof (src1_t ); 175size_t s11 = nb11 /sizeof (src1_t ); 176size_t s12 = nb12 /sizeof (src1_t ); 177size_t s13 = nb13 /sizeof (src1_t ); 178 179size_t s00 = nb00 /sizeof (src0_t ); 180size_t s01 = nb01 /sizeof (src0_t ); 181size_t s02 = nb02 /sizeof (src0_t ); 182size_t s03 = nb03 /sizeof (src0_t ); 183 184GGML_UNUSED (s00 ); 185 186GGML_ASSERT (nb0 %sizeof (dst_t )== 0 ); 187GGML_ASSERT (nb1 %sizeof (dst_t )== 0 ); 188GGML_ASSERT (nb2 %sizeof (dst_t )== 0 ); 189GGML_ASSERT (nb3 %sizeof (dst_t )== 0 ); 190 191GGML_ASSERT (nb00 %sizeof (src0_t )== 0 ); 192GGML_ASSERT (nb01 %sizeof (src0_t )== 0 ); 193GGML_ASSERT (nb02 %sizeof (src0_t )== 0 ); 194GGML_ASSERT (nb03 %sizeof (src0_t )== 0 ); 195 196GGML_ASSERT (nb10 %sizeof (src1_t )== 0 ); 197GGML_ASSERT (nb11 %sizeof (src1_t )== 0 ); 198GGML_ASSERT (nb12 %sizeof (src1_t )== 0 ); 199GGML_ASSERT (nb13 %sizeof (src1_t )== 0 ); 200 201const int block_size = 128 ; 202 203int64_t hne0 = std::max (ne0 /2LL ,1LL ); 204 205 sycl::range < 3 > block_dims (1 ,1 ,1 ); 206block_dims [2 ]= std::min < unsigned int > (hne0 ,block_size ); 207block_dims [1 ]= std::min < unsigned int > ( 208ne1 ,block_size / (unsigned int )block_dims [2 ]); 209block_dims [0 ]= std::min ( 210 std::min < unsigned int > ( 211ne2 * ne3 ,block_size / (unsigned int )block_dims [2 ] / 212 (unsigned int )block_dims [1 ]), 21364U ); 214 215 sycl::range < 3 > block_nums ( 216 (ne2 * ne3 + block_dims [0 ]- 1 ) /block_dims [0 ], 217 (ne1 + block_dims [1 ]- 1 ) /block_dims [1 ], 218 (hne0 + block_dims [2 ]- 1 ) /block_dims [2 ]); 219 220if (block_nums [0 ]> 65535 ) { 221// this is the maximum number of blocks in z direction, fallback to 1D grid kernel 222int block_num = (ne0 * ne1 * ne2 * ne3 + block_size - 1 ) /block_size ; 223 { 224 dpct::has_capability_or_fail (stream -> get_device (), 225 {sycl::aspect::fp16 }); 226 227stream -> parallel_for ( 228 sycl::nd_range < 3 > (sycl::range < 3 > (1 ,1 ,block_num )* 229 sycl::range < 3 > (1 ,1 ,block_size ), 230 sycl::range < 3 > (1 ,1 ,block_size )), 231 [= ](sycl::nd_item < 3 > item_ct1 ) { 232k_bin_bcast_unravel < bin_op > ( 233src0_dd ,src1_dd ,dst_dd ,ne0 ,ne1 ,ne2 ,ne3 , 234ne10 ,ne11 ,ne12 ,ne13 ,s1 ,s2 ,s3 ,s00 ,s01 ,s02 , 235s03 ,s10 ,s11 ,s12 ,s13 ,item_ct1 ); 236 }); 237 } 238 }else { 239/* 240DPCT1049:16: The work-group size passed to the SYCL kernel may 241exceed the limit. To get the device limit, query 242info::device::max_work_group_size. Adjust the work-group size if 243needed. 244*/ 245 dpct::has_capability_or_fail (stream -> get_device (), 246 {sycl::aspect::fp16 }); 247 248stream -> parallel_for ( 249 sycl::nd_range < 3 > (block_nums * block_dims ,block_dims ), 250 [= ](sycl::nd_item < 3 > item_ct1 ) { 251k_bin_bcast < bin_op > (src0_dd ,src1_dd ,dst_dd ,ne0 ,ne1 , 252ne2 ,ne3 ,ne10 ,ne11 ,ne12 ,ne13 , 253s1 ,s2 ,s3 ,s00 ,s01 ,s02 ,s03 ,s10 ,s11 ,s12 ,s13 , 254item_ct1 ); 255 }); 256 } 257 } 258 } 259}; 260 261template < class op > 262inline void ggml_sycl_op_bin_bcast (ggml_backend_sycl_context & ctx ,const ggml_tensor * src0 ,const ggml_tensor * src1 , 263ggml_tensor * dst ) { 264 dpct::queue_ptr main_stream = ctx .stream (); 265GGML_TENSOR_BINARY_OP_LOCALS 266 267if (src0 -> type == GGML_TYPE_F32 && src1 -> type == GGML_TYPE_F32 && dst -> type == GGML_TYPE_F32 ) { 268op ()((const float * )src0 -> data , (const float * )src1 -> data , (float * )dst -> data ,ne00 ,ne01 ,ne02 ,ne03 ,ne10 , 269ne11 ,ne12 ,ne13 ,ne0 ,ne1 ,ne2 ,ne3 ,nb00 ,nb01 ,nb02 ,nb03 ,nb10 ,nb11 ,nb12 ,nb13 ,nb0 ,nb1 ,nb2 ,nb3 , 270ggml_is_contiguous (src0 ),ggml_is_contiguous (src1 ),ggml_is_permuted (src0 ),ggml_is_permuted (src1 ),main_stream ); 271 }else if (src0 -> type == GGML_TYPE_F16 && src1 -> type == GGML_TYPE_F16 && dst -> type == GGML_TYPE_F16 ) { 272op ()((const sycl::half * )src0 -> data , (const sycl::half * )src1 -> data , (sycl::half * )dst -> data ,ne00 ,ne01 , 273ne02 ,ne03 ,ne10 ,ne11 ,ne12 ,ne13 ,ne0 ,ne1 ,ne2 ,ne3 ,nb00 ,nb01 ,nb02 ,nb03 ,nb10 ,nb11 ,nb12 ,nb13 , 274nb0 ,nb1 ,nb2 ,nb3 ,ggml_is_contiguous (src0 ),ggml_is_contiguous (src1 ),ggml_is_permuted (src0 ),ggml_is_permuted (src1 ), 275main_stream ); 276 }else if (src0 -> type == GGML_TYPE_F16 && src1 -> type == GGML_TYPE_F32 && dst -> type == GGML_TYPE_F16 ) { 277op ()((const sycl::half * )src0 -> data , (const float * )src1 -> data , (sycl::half * )dst -> data ,ne00 ,ne01 ,ne02 , 278ne03 ,ne10 ,ne11 ,ne12 ,ne13 ,ne0 ,ne1 ,ne2 ,ne3 ,nb00 ,nb01 ,nb02 ,nb03 ,nb10 ,nb11 ,nb12 ,nb13 ,nb0 ,nb1 , 279nb2 ,nb3 ,ggml_is_contiguous (src0 ),ggml_is_contiguous (src1 ),ggml_is_permuted (src0 ),ggml_is_permuted (src1 ), 280main_stream ); 281 }else if (src0 -> type == GGML_TYPE_I32 && src1 -> type == GGML_TYPE_I32 && dst -> type == GGML_TYPE_I32 ) { 282op ()((const int32_t * )src0 -> data , (const int32_t * )src1 -> data , (int32_t * )dst -> data ,ne00 ,ne01 ,ne02 ,ne03 , 283ne10 ,ne11 ,ne12 ,ne13 ,ne0 ,ne1 ,ne2 ,ne3 ,nb00 ,nb01 ,nb02 ,nb03 ,nb10 ,nb11 ,nb12 ,nb13 ,nb0 ,nb1 ,nb2 , 284nb3 ,ggml_is_contiguous (src0 ),ggml_is_contiguous (src1 ),ggml_is_permuted (src0 ),ggml_is_permuted (src1 ), 285main_stream ); 286 }else if (src0 -> type == GGML_TYPE_I16 && src1 -> type == GGML_TYPE_I16 && dst -> type == GGML_TYPE_I16 ) { 287op ()((const int16_t * )src0 -> data , (const int16_t * )src1 -> data , (int16_t * )dst -> data ,ne00 ,ne01 ,ne02 ,ne03 , 288ne10 ,ne11 ,ne12 ,ne13 ,ne0 ,ne1 ,ne2 ,ne3 ,nb00 ,nb01 ,nb02 ,nb03 ,nb10 ,nb11 ,nb12 ,nb13 ,nb0 ,nb1 ,nb2 , 289nb3 ,ggml_is_contiguous (src0 ),ggml_is_contiguous (src1 ),ggml_is_permuted (src0 ),ggml_is_permuted (src1 ), 290main_stream ); 291#ifdef GGML_SYCL_HAS_BF16 292} else if ( src0 -> type == GGML_TYPE_BF16 && src1 -> type == GGML_TYPE_BF16 && dst -> type == GGML_TYPE_BF16 ) { 293op ()((const sycl::ext::oneapi:: bfloat16 * ) src0 -> data , (const sycl::ext::oneapi:: bfloat16 * ) src1 -> data , 294(sycl::ext::oneapi:: bfloat16 * ) dst -> data , ne00 , ne01 , ne02 , ne03 , ne10 , ne11 , ne12 , ne13 , ne0 , ne1 , ne2 , 295ne3 , nb00 , nb01 , nb02 , nb03 , nb10 , nb11 , nb12 , nb13 , nb0 , nb1 , nb2 , nb3 , ggml_is_contiguous ( src0 ), 296ggml_is_contiguous ( src1 ), ggml_is_permuted ( src0 ), ggml_is_permuted ( src1 ), main_stream ); 297} else if ( src0 -> type == GGML_TYPE_BF16 && src1 -> type == GGML_TYPE_F32 && dst -> type == GGML_TYPE_BF16 ) { 298op ()((const sycl::ext::oneapi:: bfloat16 * ) src0 -> data , (const float * ) src1 -> data , 299(sycl::ext::oneapi:: bfloat16 * ) dst -> data , ne00 , ne01 , ne02 , ne03 , ne10 , ne11 , ne12 , ne13 , ne0 , ne1 , ne2 , 300ne3 , nb00 , nb01 , nb02 , nb03 , nb10 , nb11 , nb12 , nb13 , nb0 , nb1 , nb2 , nb3 , ggml_is_contiguous ( src0 ), 301ggml_is_contiguous ( src1 ), ggml_is_permuted ( src0 ), ggml_is_permuted ( src1 ), main_stream ); 302#endif 303} else { 304fprintf ( stderr , "%s: unsupported types: dst: %s, src0: %s, src1: %s\n" , __func__ , ggml_type_name ( dst -> type ), 305ggml_type_name ( src0 -> type ), ggml_type_name ( src1 -> type )); 306GGML_ABORT ( "fatal error" ); 307} 308} 309 310inline void ggml_sycl_op_add ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 311 312ggml_sycl_op_bin_bcast < bin_bcast_sycl < op_add >> ( ctx , dst -> src [ 0 ], dst -> src [ 1 ], dst ); 313} 314 315inline void ggml_sycl_op_sub ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 316 317ggml_sycl_op_bin_bcast < bin_bcast_sycl < op_sub >> ( ctx , dst -> src [ 0 ], dst -> src [ 1 ], dst ); 318} 319 320inline void ggml_sycl_op_mul ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 321 322ggml_sycl_op_bin_bcast < bin_bcast_sycl < op_mul >> ( ctx , dst -> src [ 0 ], dst -> src [ 1 ], dst ); 323} 324 325inline void ggml_sycl_op_div ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 326 327ggml_sycl_op_bin_bcast < bin_bcast_sycl < op_div >> ( ctx , dst -> src [ 0 ], dst -> src [ 1 ], dst ); 328} 329 330inline void ggml_sycl_op_repeat ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 331ggml_sycl_op_bin_bcast < bin_bcast_sycl < op_repeat >> ( ctx , dst , dst -> src [ 0 ], dst ); 332} 333 334 335void ggml_sycl_add ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 336scope_op_debug_print scope_dbg_print ( __func__ , dst , /*num_src=*/ 2 ); 337ggml_sycl_op_add ( ctx , dst ); 338} 339 340void ggml_sycl_sub ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 341scope_op_debug_print scope_dbg_print ( __func__ , dst , /*num_src=*/ 2 ); 342ggml_sycl_op_sub ( ctx , dst ); 343} 344 345void ggml_sycl_mul ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 346scope_op_debug_print scope_dbg_print ( __func__ , dst , /*num_src=*/ 2 ); 347ggml_sycl_op_mul ( ctx , dst ); 348} 349 350void ggml_sycl_div ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 351scope_op_debug_print scope_dbg_print ( __func__ , dst , /*num_src=*/ 2 ); 352ggml_sycl_op_div ( ctx , dst ); 353} 354 355void ggml_sycl_repeat ( ggml_backend_sycl_context & ctx , ggml_tensor * dst ) { 356scope_op_debug_print scope_dbg_print ( __func__ , dst , /*num_src=*/ 1 ); 357ggml_sycl_op_repeat ( ctx , dst ); 358} 359 360// fused ADD+ADD: dst = (src0 + src1) + src2. Same indexing as k_bin_bcast, so mixed 361// types, broadcast, and non-contiguous layouts that add() already handles also fuse. 362template < float ( * bin_op )(const float , const float ), typename src0_t , typename src1_t , typename src2_t , typename dst_t > 363static void k_bin_bcast3 (const src0_t * src0 , const src1_t * src1 , const src2_t * src2 , dst_t * dst , 364int ne0 , int ne1 , int ne2 , int ne3 , 365int ne10 , int ne11 , int ne12 , int ne13 , 366int ne20 , int ne21 , int ne22 , int ne23 , 367int s1 , int s2 , int s3 , 368int s00 , int s01 , int s02 , int s03 , 369int s10 , int s11 , int s12 , int s13 , 370int s20 , int s21 , int s22 , int s23 , 371const sycl:: nd_item < 3 > & item_ct1 ) { 372const int i0s = item_ct1 . get_local_range ( 2 ) * item_ct1 . get_group ( 2 ) + 373item_ct1 . get_local_id ( 2 ); 374const int i1 = ( item_ct1 . get_local_range ( 1 ) * item_ct1 . get_group ( 1 ) + 375item_ct1 . get_local_id ( 1 )); 376const int i2 = ( item_ct1 . get_local_range ( 0 ) * item_ct1 . get_group ( 0 ) + 377item_ct1 . get_local_id ( 0 )) / 378ne3 ; 379const int i3 = ( item_ct1 . get_local_range ( 0 ) * item_ct1 . get_group ( 0 ) + 380item_ct1 . get_local_id ( 0 )) % 381ne3 ; 382 383if ( i0s >= ne0 || i1 >= ne1 || i2 >= ne2 || i3 >= ne3 ) { 384return; 385} 386 387const int i11 = i1 % ne11 ; 388const int i12 = i2 % ne12 ; 389const int i13 = i3 % ne13 ; 390const int i21 = i1 % ne21 ; 391const int i22 = i2 % ne22 ; 392const int i23 = i3 % ne23 ; 393 394const size_t i_src0 = i3 * s03 + i2 * s02 + i1 * s01 ; 395const size_t i_src1 = i13 * s13 + i12 * s12 + i11 * s11 ; 396const size_t i_src2 = i23 * s23 + i22 * s22 + i21 * s21 ; 397const size_t i_dst = i3 * s3 + i2 * s2 + i1 * s1 ; 398 399const src0_t * src0_row = src0 + i_src0 ; 400const src1_t * src1_row = src1 + i_src1 ; 401const src2_t * src2_row = src2 + i_src2 ; 402dst_t * dst_row = dst + i_dst ; 403 404for ( int i0 = i0s ; i0 < ne0 ; 405i0 += item_ct1 . get_local_range ( 2 ) * item_ct1 . get_group_range ( 2 )) { 406const int i10 = i0 % ne10 ; 407const int i20 = i0 % ne20 ; 408const float acc = bin_op (( float ) src0_row [ i0 * s00 ], ( float ) src1_row [ i10 * s10 ]); 409dst_row [ i0 ] = ( dst_t ) bin_op ( acc , ( float ) src2_row [ i20 * s20 ]); 410} 411} 412 413template < float ( * bin_op )(const float , const float ), typename src0_t , typename src1_t , typename src2_t , typename dst_t > 414static void k_bin_bcast3_unravel (const src0_t * src0 , const src1_t * src1 , const src2_t * src2 , dst_t * dst , 415int ne0 , int ne1 , int ne2 , int ne3 , 416int ne10 , int ne11 , int ne12 , int ne13 , 417int ne20 , int ne21 , int ne22 , int ne23 , 418int s1 , int s2 , int s3 , 419int s00 , int s01 , int s02 , int s03 , 420int s10 , int s11 , int s12 , int s13 , 421int s20 , int s21 , int s22 , int s23 , 422const sycl:: nd_item < 3 > & item_ct1 ) { 423const int i = item_ct1 . get_local_range ( 2 ) * item_ct1 . get_group ( 2 ) + 424item_ct1 . get_local_id ( 2 ); 425 426const int i3 = i / ( ne2 * ne1 * ne0 ); 427const int i2 = ( i / ( ne1 * ne0 )) % ne2 ; 428const int i1 = ( i / ne0 ) % ne1 ; 429const int i0 = i % ne0 ; 430 431if ( i0 >= ne0 || i1 >= ne1 || i2 >= ne2 || i3 >= ne3 ) { 432return; 433} 434 435const int i11 = i1 % ne11 ; 436const int i12 = i2 % ne12 ; 437const int i13 = i3 % ne13 ; 438const int i21 = i1 % ne21 ; 439const int i22 = i2 % ne22 ; 440const int i23 = i3 % ne23 ; 441 442const size_t i_src0 = i3 * s03 + i2 * s02 + i1 * s01 ; 443const size_t i_src1 = i13 * s13 + i12 * s12 + i11 * s11 ; 444const size_t i_src2 = i23 * s23 + i22 * s22 + i21 * s21 ; 445const size_t i_dst = i3 * s3 + i2 * s2 + i1 * s1 ; 446 447const int i10 = i0 % ne10 ; 448const int i20 = i0 % ne20 ; 449const float acc = bin_op (( float ) src0 [ i_src0 + i0 * s00 ], ( float ) src1 [ i_src1 + i10 * s10 ]); 450dst [ i_dst + i0 ] = ( dst_t ) bin_op ( acc , ( float ) src2 [ i_src2 + i20 * s20 ]); 451} 452 453template < float ( * bin_op )(const float , const float ), typename src0_t , typename src1_t , typename src2_t , typename dst_t > 454static void launch_bin_bcast3 ( ggml_backend_sycl_context & ctx , const ggml_tensor * src0 , const ggml_tensor * src1 , 455const ggml_tensor * src2 , ggml_tensor * dst ) { 456dpct:: queue_ptr stream = ctx . stream (); 457SYCL_CHECK ( ggml_sycl_set_device ( ctx . device )); 458 459GGML_TENSOR_TERNARY_OP_LOCALS 460 461int nr1 [ 4 ] = { ( int ) ( ne10 / ne0 ), ( int ) ( ne11 / ne1 ), ( int ) ( ne12 / ne2 ), ( int ) ( ne13 / ne3 ) }; 462int nr2 [ 4 ] = { ( int ) ( ne20 / ne0 ), ( int ) ( ne21 / ne1 ), ( int ) ( ne22 / ne2 ), ( int ) ( ne23 / ne3 ) }; 463 464int64_t cne [] = { ne0 , ne1 , ne2 , ne3 }; 465int64_t cne0 [] = { ne00 , ne01 , ne02 , ne03 }; 466int64_t cne1 [] = { ne10 , ne11 , ne12 , ne13 }; 467int64_t cne2 [] = { ne20 , ne21 , ne22 , ne23 }; 468size_t cnb [] = { nb0 , nb1 , nb2 , nb3 }; 469size_t cnb0 [] = { nb00 , nb01 , nb02 , nb03 }; 470size_t cnb1 [] = { nb10 , nb11 , nb12 , nb13 }; 471size_t cnb2 [] = { nb20 , nb21 , nb22 , nb23 }; 472 473auto collapse = []( int64_t cne []) { 474cne [ 0 ] *= cne [ 1 ]; 475cne [ 1 ] = cne [ 2 ]; 476cne [ 2 ] = cne [ 3 ]; 477cne [ 3 ] = 1 ; 478}; 479 480auto collapse_nb = []( size_t cnb [], int64_t cne []) { 481cnb [ 1 ] *= cne [ 1 ]; 482cnb [ 2 ] *= cne [ 2 ]; 483cnb [ 3 ] *= cne [ 3 ]; 484}; 485 486const bool can_collapse = ggml_is_contiguous ( src0 ) && ggml_is_contiguous ( src1 ) && ggml_is_contiguous ( src2 ) && 487! ggml_is_permuted ( src0 ) && ! ggml_is_permuted ( src1 ) && ! ggml_is_permuted ( src2 ); 488if ( can_collapse ) { 489for ( int i = 0 ; i < 4 ; i ++ ) { 490if ( nr1 [ i ] != 1 || nr2 [ i ] != 1 ) { 491break; 492} 493if ( i > 0 ) { 494collapse_nb ( cnb , cne ); 495collapse_nb ( cnb0 , cne0 ); 496collapse_nb ( cnb1 , cne1 ); 497collapse_nb ( cnb2 , cne2 ); 498collapse ( cne ); 499collapse ( cne0 ); 500collapse ( cne1 ); 501collapse ( cne2 ); 502} 503} 504} 505 506{ 507int64_t ne0 = cne [ 0 ]; 508int64_t ne1 = cne [ 1 ]; 509int64_t ne2 = cne [ 2 ]; 510int64_t ne3 = cne [ 3 ]; 511 512int64_t ne10 = cne1 [ 0 ]; 513int64_t ne11 = cne1 [ 1 ]; 514int64_t ne12 = cne1 [ 2 ]; 515int64_t ne13 = cne1 [ 3 ]; 516 517int64_t ne20 = cne2 [ 0 ]; 518int64_t ne21 = cne2 [ 1 ]; 519int64_t ne22 = cne2 [ 2 ]; 520int64_t ne23 = cne2 [ 3 ]; 521 522size_t s1 = cnb [ 1 ] / sizeof( dst_t ); 523size_t s2 = cnb [ 2 ] / sizeof( dst_t ); 524size_t s3 = cnb [ 3 ] / sizeof( dst_t ); 525 526size_t s00 = cnb0 [ 0 ] / sizeof( src0_t ); 527size_t s01 = cnb0 [ 1 ] / sizeof( src0_t ); 528size_t s02 = cnb0 [ 2 ] / sizeof( src0_t ); 529size_t s03 = cnb0 [ 3 ] / sizeof( src0_t ); 530 531size_t s10 = cnb1 [ 0 ] / sizeof( src1_t ); 532size_t s11 = cnb1 [ 1 ] / sizeof( src1_t ); 533size_t s12 = cnb1 [ 2 ] / sizeof( src1_t ); 534size_t s13 = cnb1 [ 3 ] / sizeof( src1_t ); 535 536size_t s20 = cnb2 [ 0 ] / sizeof( src2_t ); 537size_t s21 = cnb2 [ 1 ] / sizeof( src2_t ); 538size_t s22 = cnb2 [ 2 ] / sizeof( src2_t ); 539size_t s23 = cnb2 [ 3 ] / sizeof( src2_t ); 540 541GGML_ASSERT ( cnb [ 0 ] % sizeof( dst_t ) == 0 && cnb [ 1 ] % sizeof( dst_t ) == 0 && cnb [ 2 ] % sizeof( dst_t ) == 0 && 542cnb [ 3 ] % sizeof( dst_t ) == 0 ); 543GGML_ASSERT ( cnb0 [ 0 ] % sizeof( src0_t ) == 0 && cnb0 [ 1 ] % sizeof( src0_t ) == 0 && cnb0 [ 2 ] % sizeof( src0_t ) == 0 && 544cnb0 [ 3 ] % sizeof( src0_t ) == 0 ); 545GGML_ASSERT ( cnb1 [ 0 ] % sizeof( src1_t ) == 0 && cnb1 [ 1 ] % sizeof( src1_t ) == 0 && cnb1 [ 2 ] % sizeof( src1_t ) == 0 && 546cnb1 [ 3 ] % sizeof( src1_t ) == 0 ); 547GGML_ASSERT ( cnb2 [ 0 ] % sizeof( src2_t ) == 0 && cnb2 [ 1 ] % sizeof( src2_t ) == 0 && cnb2 [ 2 ] % sizeof( src2_t ) == 0 && 548cnb2 [ 3 ] % sizeof( src2_t ) == 0 ); 549 550const src0_t * src0_dd = (const src0_t * ) src0 -> data ; 551const src1_t * src1_dd = (const src1_t * ) src1 -> data ; 552const src2_t * src2_dd = (const src2_t * ) src2 -> data ; 553dst_t * dst_dd = ( dst_t * ) dst -> data ; 554 555const int block_size = 128 ; 556int64_t hne0 = std:: max ( ne0 / 2LL , 1LL ); 557 558sycl:: range < 3 > block_dims ( 1 , 1 , 1 ); 559block_dims [ 2 ] = std:: min < unsigned int > ( hne0 , block_size ); 560block_dims [ 1 ] = std:: min < unsigned int > ( ne1 , block_size / ( unsigned int ) block_dims [ 2 ]); 561block_dims [ 0 ] = std:: min (std:: min < unsigned int > ( ne2 * ne3 , 562block_size / ( unsigned int ) block_dims [ 2 ] / 563( unsigned int ) block_dims [ 1 ]), 56464U ); 565 566sycl:: range < 3 > block_nums (( ne2 * ne3 + block_dims [ 0 ] - 1 ) / block_dims [ 0 ], 567( ne1 + block_dims [ 1 ] - 1 ) / block_dims [ 1 ], 568( hne0 + block_dims [ 2 ] - 1 ) / block_dims [ 2 ]); 569 570dpct:: has_capability_or_fail ( stream -> get_device (), { sycl::aspect:: fp16 }); 571 572if ( block_nums [ 0 ] > 65535 ) { 573int block_num = ( ne0 * ne1 * ne2 * ne3 + block_size - 1 ) / block_size ; 574stream -> parallel_for ( 575sycl:: nd_range < 3 > (sycl:: range < 3 > ( 1 , 1 , block_num ) * sycl:: range < 3 > ( 1 , 1 , block_size ), 576sycl:: range < 3 > ( 1 , 1 , block_size )), 577[ = ](sycl:: nd_item < 3 > item_ct1 ) { 578k_bin_bcast3_unravel < bin_op > ( src0_dd , src1_dd , src2_dd , dst_dd , ne0 , ne1 , ne2 , ne3 , ne10 , ne11 , 579ne12 , ne13 , ne20 , ne21 , ne22 , ne23 , s1 , s2 , s3 , s00 , s01 , s02 , s03 , 580s10 , s11 , s12 , s13 , s20 , s21 , s22 , s23 , item_ct1 ); 581}); 582} else { 583stream -> parallel_for (sycl:: nd_range < 3 > ( block_nums * block_dims , block_dims ), 584[ = ](sycl:: nd_item < 3 > item_ct1 ) { 585k_bin_bcast3 < bin_op > ( src0_dd , src1_dd , src2_dd , dst_dd , ne0 , ne1 , ne2 , ne3 , ne10 , 586ne11 , ne12 , ne13 , ne20 , ne21 , ne22 , ne23 , s1 , s2 , s3 , s00 , 587s01 , s02 , s03 , s10 , s11 , s12 , s13 , s20 , s21 , s22 , s23 , 588item_ct1 ); 589}); 590} 591} 592} 593 594void ggml_sycl_op_add_add_fused ( ggml_backend_sycl_context & ctx , ggml_tensor * add0 , ggml_tensor * add1 ) { 595const ggml_tensor * src0 = add0 -> src [ 0 ]; 596const ggml_tensor * src1 = add0 -> src [ 1 ]; 597const ggml_tensor * src2 = add1 -> src [ 1 ]; 598ggml_tensor * dst = add1 ; 599 600GGML_ASSERT ( add1 -> src [ 0 ] == add0 ); 601GGML_ASSERT ( ggml_sycl_add_kernel_supports ( src0 -> type , src1 -> type , add0 -> type )); 602GGML_ASSERT ( ggml_sycl_add_kernel_supports ( add0 -> type , src2 -> type , dst -> type )); 603 604if ( src0 -> type == GGML_TYPE_F32 && src1 -> type == GGML_TYPE_F32 && src2 -> type == GGML_TYPE_F32 && 605dst -> type == GGML_TYPE_F32 ) { 606launch_bin_bcast3 < op_add , float , float , float , float > ( ctx , src0 , src1 , src2 , dst ); 607} else if ( src0 -> type == GGML_TYPE_F16 && src1 -> type == GGML_TYPE_F16 && src2 -> type == GGML_TYPE_F16 && 608dst -> type == GGML_TYPE_F16 ) { 609launch_bin_bcast3 < op_add , sycl:: half , sycl:: half , sycl:: half , sycl:: half > ( ctx , src0 , src1 , src2 , dst ); 610} else if ( src0 -> type == GGML_TYPE_F16 && src1 -> type == GGML_TYPE_F32 && src2 -> type == GGML_TYPE_F32 && 611dst -> type == GGML_TYPE_F16 ) { 612launch_bin_bcast3 < op_add , sycl:: half , float , float , sycl:: half > ( ctx , src0 , src1 , src2 , dst ); 613} else if ( src0 -> type == GGML_TYPE_F16 && src1 -> type == GGML_TYPE_F16 && src2 -> type == GGML_TYPE_F32 && 614dst -> type == GGML_TYPE_F16 ) { 615launch_bin_bcast3 < op_add , sycl:: half , sycl:: half , float , sycl:: half > ( ctx , src0 , src1 , src2 , dst ); 616} else if ( src0 -> type == GGML_TYPE_F16 && src1 -> type == GGML_TYPE_F32 && src2 -> type == GGML_TYPE_F16 && 617dst -> type == GGML_TYPE_F16 ) { 618launch_bin_bcast3 < op_add , sycl:: half , float , sycl:: half , sycl:: half > ( ctx , src0 , src1 , src2 , dst ); 619} else if ( src0 -> type == GGML_TYPE_I32 && src1 -> type == GGML_TYPE_I32 && src2 -> type == GGML_TYPE_I32 && 620dst -> type == GGML_TYPE_I32 ) { 621launch_bin_bcast3 < op_add , int32_t , int32_t , int32_t , int32_t > ( ctx , src0 , src1 , src2 , dst ); 622} else if ( src0 -> type == GGML_TYPE_I16 && src1 -> type == GGML_TYPE_I16 && src2 -> type == GGML_TYPE_I16 && 623dst -> type == GGML_TYPE_I16 ) { 624launch_bin_bcast3 < op_add , int16_t , int16_t , int16_t , int16_t > ( ctx , src0 , src1 , src2 , dst ); 625#ifdef GGML_SYCL_HAS_BF16 626} else if ( src0 -> type == GGML_TYPE_BF16 && src1 -> type == GGML_TYPE_BF16 && src2 -> type == GGML_TYPE_BF16 && 627dst -> type == GGML_TYPE_BF16 ) { 628launch_bin_bcast3 < op_add , sycl::ext::oneapi:: bfloat16 , sycl::ext::oneapi:: bfloat16 , 629sycl::ext::oneapi:: bfloat16 , sycl::ext::oneapi:: bfloat16 > ( ctx , src0 , src1 , src2 , dst ); 630} else if ( src0 -> type == GGML_TYPE_BF16 && src1 -> type == GGML_TYPE_F32 && src2 -> type == GGML_TYPE_F32 && 631dst -> type == GGML_TYPE_BF16 ) { 632launch_bin_bcast3 < op_add , sycl::ext::oneapi:: bfloat16 , float , float , sycl::ext::oneapi:: bfloat16 > ( 633ctx , src0 , src1 , src2 , dst ); 634} else if ( src0 -> type == GGML_TYPE_BF16 && src1 -> type == GGML_TYPE_BF16 && src2 -> type == GGML_TYPE_F32 && 635dst -> type == GGML_TYPE_BF16 ) { 636launch_bin_bcast3 < op_add , sycl::ext::oneapi:: bfloat16 , sycl::ext::oneapi:: bfloat16 , float , 637sycl::ext::oneapi:: bfloat16 > ( ctx , src0 , src1 , src2 , dst ); 638} else if ( src0 -> type == GGML_TYPE_BF16 && src1 -> type == GGML_TYPE_F32 && src2 -> type == GGML_TYPE_BF16 && 639dst -> type == GGML_TYPE_BF16 ) { 640launch_bin_bcast3 < op_add , sycl::ext::oneapi:: bfloat16 , float , sycl::ext::oneapi:: bfloat16 , 641sycl::ext::oneapi:: bfloat16 > ( ctx , src0 , src1 , src2 , dst ); 642#endif 643} else { 644fprintf ( stderr , "%s: unsupported types: dst: %s, src0: %s, src1: %s, src2: %s\n" , __func__ , 645ggml_type_name ( dst -> type ), ggml_type_name ( src0 -> type ), ggml_type_name ( src1 -> type ), 646ggml_type_name ( src2 -> type )); 647GGML_ABORT ( "fatal error" ); 648 } 649} 650