char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
d415e65a5
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.h" 14 15#include "concat.hpp" 16 17static inline size_t elem_size (ggml_type t ) { 18return ggml_type_size (t ) /ggml_blck_size (t ); 19} 20 21template < typename T > 22static void concat_T_dim0 (const T * x ,const T * y ,T * dst , 23const int ne0 ,const int ne00 , 24const sycl::nd_item < 3 > & item_ct1 ) { 25int nidx = item_ct1 .get_local_id (2 )+ 26item_ct1 .get_group (2 )* item_ct1 .get_local_range (2 ); 27if (nidx >=ne0 ) { 28return ; 29 } 30// operation 31int offset_dst = nidx + item_ct1 .get_group (1 )* ne0 + 32item_ct1 .get_group (0 )* ne0 * item_ct1 .get_group_range (1 ); 33if (nidx < ne00 ) {// src0 34int offset_src = nidx + item_ct1 .get_group (1 )* ne00 + 35item_ct1 .get_group (0 )* ne00 * item_ct1 .get_group_range (1 ); 36dst [offset_dst ]= x [offset_src ]; 37 }else { 38int offset_src = 39nidx - ne00 + item_ct1 .get_group (1 )* (ne0 - ne00 )+ 40item_ct1 .get_group (0 )* (ne0 - ne00 )* item_ct1 .get_group_range (1 ); 41dst [offset_dst ]= y [offset_src ]; 42 } 43} 44 45template < typename T > 46static void concat_T_dim1 (const T * x ,const T * y ,T * dst , 47const int ne0 ,const int ne01 , 48const sycl::nd_item < 3 > & item_ct1 ) { 49int nidx = item_ct1 .get_local_id (2 )+ 50item_ct1 .get_group (2 )* item_ct1 .get_local_range (2 ); 51if (nidx >=ne0 ) { 52return ; 53 } 54// operation 55int offset_dst = nidx + item_ct1 .get_group (1 )* ne0 + 56item_ct1 .get_group (0 )* ne0 * item_ct1 .get_group_range (1 ); 57if (item_ct1 .get_group (1 )< (size_t )ne01 ) {// src0 58int offset_src = 59nidx + item_ct1 .get_group (1 )* ne0 + item_ct1 .get_group (0 )* ne0 * ne01 ; 60dst [offset_dst ]= x [offset_src ]; 61 }else { 62int offset_src = 63nidx + (item_ct1 .get_group (1 )- ne01 )* ne0 + 64item_ct1 .get_group (0 )* ne0 * (item_ct1 .get_group_range (1 )- ne01 ); 65dst [offset_dst ]= y [offset_src ]; 66 } 67} 68 69template < typename T > 70static void concat_T_dim2 (const T * x ,const T * y ,T * dst , 71const int ne0 ,const int ne02 , 72const sycl::nd_item < 3 > & item_ct1 ) { 73int nidx = item_ct1 .get_local_id (2 )+ 74item_ct1 .get_group (2 )* item_ct1 .get_local_range (2 ); 75if (nidx >=ne0 ) { 76return ; 77 } 78// operation 79int offset_dst = nidx + item_ct1 .get_group (1 )* ne0 + 80item_ct1 .get_group (0 )* ne0 * item_ct1 .get_group_range (1 ); 81if (item_ct1 .get_group (0 )< (size_t )ne02 ) {// src0 82int offset_src = nidx + item_ct1 .get_group (1 )* ne0 + 83item_ct1 .get_group (0 )* ne0 * item_ct1 .get_group_range (1 ); 84dst [offset_dst ]= x [offset_src ]; 85 }else { 86int offset_src = 87nidx + item_ct1 .get_group (1 )* ne0 + 88 (item_ct1 .get_group (0 )- ne02 )* ne0 * item_ct1 .get_group_range (1 ); 89dst [offset_dst ]= y [offset_src ]; 90 } 91} 92 93template < typename T > 94static void concat_T_sycl (const T * x ,const T * y ,T * dst , 95int ne00 ,int ne01 ,int ne02 ,int ne0 ,int ne1 , 96int ne2 ,int dim ,queue_ptr stream ) { 97int num_blocks = (ne0 + SYCL_CONCAT_BLOCK_SIZE - 1 ) /SYCL_CONCAT_BLOCK_SIZE ; 98 sycl::range < 3 > gridDim (ne2 ,ne1 ,num_blocks ); 99switch (dim ) { 100case 0 : 101stream -> parallel_for (sycl::nd_range < 3 > (gridDim * sycl::range < 3 > (1 ,1 ,SYCL_CONCAT_BLOCK_SIZE ), 102 sycl::range < 3 > (1 ,1 ,SYCL_CONCAT_BLOCK_SIZE )), 103 [= ](sycl::nd_item < 3 > item_ct1 ) {concat_T_dim0 < T > (x ,y ,dst ,ne0 ,ne00 ,item_ct1 ); }); 104break ; 105case 1 : 106stream -> parallel_for (sycl::nd_range < 3 > (gridDim * sycl::range < 3 > (1 ,1 ,SYCL_CONCAT_BLOCK_SIZE ), 107 sycl::range < 3 > (1 ,1 ,SYCL_CONCAT_BLOCK_SIZE )), 108 [= ](sycl::nd_item < 3 > item_ct1 ) {concat_T_dim1 < T > (x ,y ,dst ,ne0 ,ne01 ,item_ct1 ); }); 109break ; 110// dim >=2 will be dispatched to the default path 111default : 112stream -> parallel_for (sycl::nd_range < 3 > (gridDim * sycl::range < 3 > (1 ,1 ,SYCL_CONCAT_BLOCK_SIZE ), 113 sycl::range < 3 > (1 ,1 ,SYCL_CONCAT_BLOCK_SIZE )), 114 [= ](sycl::nd_item < 3 > item_ct1 ) {concat_T_dim2 < T > (x ,y ,dst ,ne0 ,ne02 ,item_ct1 ); }); 115break ; 116 } 117} 118 119// non-contiguous kernel (slow) 120template < typename T > 121static void concat_T_sycl_non_cont ( 122queue_ptr stream ,const char * src0 ,const char * src1 ,char * dst , 123int64_t ne00 ,int64_t ne01 ,int64_t ne02 ,int64_t ne03 ,uint64_t nb00 , 124uint64_t nb01 ,uint64_t nb02 ,uint64_t nb03 ,int64_t /*ne10*/ , 125int64_t /*ne11*/ ,int64_t /*ne12*/ ,int64_t /*ne13*/ ,uint64_t nb10 , 126uint64_t nb11 ,uint64_t nb12 ,uint64_t nb13 ,int64_t ne0 ,int64_t ne1 , 127int64_t ne2 ,int64_t ne3 ,uint64_t nb0 ,uint64_t nb1 ,uint64_t nb2 , 128uint64_t nb3 ,int32_t dim ) { 129 sycl::range < 3 > gridDim (ne3 ,ne2 ,ne1 ); 130 131// Avoid oversubscribing device when there is not enough elements along the innermost dim to 132// fill a full SYCL_CONCAT_BLOCK_SIZE. For larger # of elements, the full SYCL_CONCAT_BLOCK_SIZE 133// is used. 134const int64_t ne0_pad = GGML_PAD (ne0 ,WARP_SIZE ); 135const int64_t block_ne0 = ne0_pad < SYCL_CONCAT_BLOCK_SIZE ?ne0_pad : (int64_t )SYCL_CONCAT_BLOCK_SIZE ; 136 sycl::range < 3 > blockDim (1 ,1 ,block_ne0 ); 137 138stream -> parallel_for (sycl::nd_range < 3 > (gridDim * blockDim ,blockDim ), [= ](sycl::nd_item < 3 > item_ct1 ) { 139int64_t i3 = item_ct1 .get_group (0 ); 140int64_t i2 = item_ct1 .get_group (1 ); 141int64_t i1 = item_ct1 .get_group (2 ); 142 143int64_t o [4 ]= {0 ,0 ,0 ,0 }; 144o [dim ]= dim == 0 ?ne00 : (dim == 1 ?ne01 : (dim == 2 ?ne02 :ne03 )); 145 146const T * x ; 147 148for (int i0 = item_ct1 .get_local_id (2 );i0 < ne0 ;i0 += item_ct1 .get_local_range (2 )) { 149if (i0 < ne00 && i1 < ne01 && i2 < ne02 && i3 < ne03 ) { 150x = (const T * ) (src0 + (i3 )* nb03 + (i2 )* nb02 + (i1 )* nb01 + (i0 )* nb00 ); 151 }else { 152x = (const T * ) (src1 + (i3 - o [3 ])* nb13 + (i2 - o [2 ])* nb12 + (i1 - o [1 ])* nb11 + 153 (i0 - o [0 ])* nb10 ); 154 } 155 156T * y = (T * )(dst + i3 * nb3 + i2 * nb2 + i1 * nb1 + i0 * nb0 ); 157 158* y = * x ; 159 } 160 }); 161} 162 163template < typename T > 164void concat_impl_sycl (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 165scope_op_debug_print scope_dbg_print (__func__ ,dst ,/*num_src=*/ 2 ); 166const ggml_tensor * src0 = dst -> src [0 ]; 167const ggml_tensor * src1 = dst -> src [1 ]; 168queue_ptr stream = ctx .stream (); 169 170const int32_t dim = ((int32_t * )dst -> op_params )[0 ]; 171 172if (ggml_is_contiguous (src0 )&& ggml_is_contiguous (src1 )) { 173const T * src0_d = (const T * )src0 -> data ; 174const T * src1_d = (const T * )src1 -> data ; 175T * dst_d = (T * )dst -> data ; 176size_t type_size = elem_size (dst -> type ); 177if (dim != 3 ) { 178for (int i3 = 0 ;i3 < dst -> ne [3 ];i3 ++ ) { 179concat_T_sycl < T > (src0_d + i3 * (src0 -> nb [3 ] /type_size ),src1_d + i3 * (src1 -> nb [3 ] /type_size ), 180dst_d + i3 * (dst -> nb [3 ] /type_size ),src0 -> ne [0 ],src0 -> ne [1 ],src0 -> ne [2 ],dst -> ne [0 ], 181dst -> ne [1 ],dst -> ne [2 ],dim ,stream ); 182 } 183 }else { 184const size_t size0 = ggml_nbytes (src0 ); 185const size_t size1 = ggml_nbytes (src1 ); 186 187SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy (dst_d ,src0_d ,size0 ))); 188SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy (dst_d + size0 /type_size ,src1_d ,size1 ))); 189 } 190 }else { 191concat_T_sycl_non_cont < T > (stream , (const char * )src0 -> data , (const char * )src1 -> data , (char * )dst -> data , 192src0 -> ne [0 ],src0 -> ne [1 ],src0 -> ne [2 ],src0 -> ne [3 ],src0 -> nb [0 ],src0 -> nb [1 ], 193src0 -> nb [2 ],src0 -> nb [3 ],src1 -> ne [0 ],src1 -> ne [1 ],src1 -> ne [2 ],src1 -> ne [3 ], 194src1 -> nb [0 ],src1 -> nb [1 ],src1 -> nb [2 ],src1 -> nb [3 ],dst -> ne [0 ],dst -> ne [1 ],dst -> ne [2 ], 195dst -> ne [3 ],dst -> nb [0 ],dst -> nb [1 ],dst -> nb [2 ],dst -> nb [3 ],dim ); 196 } 197} 198 199static void concat_impl_q4_0_sycl (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 200scope_op_debug_print scope_dbg_print (__func__ ,dst ,/*num_src=*/ 2 ); 201const ggml_tensor * src0 = dst -> src [0 ]; 202const ggml_tensor * src1 = dst -> src [1 ]; 203queue_ptr stream = ctx .stream (); 204 205const int32_t dim = ((int32_t * )dst -> op_params )[0 ]; 206 207GGML_ASSERT (src0 -> type == GGML_TYPE_Q4_0 ); 208GGML_ASSERT (src1 -> type == GGML_TYPE_Q4_0 ); 209GGML_ASSERT (dst -> type == GGML_TYPE_Q4_0 ); 210GGML_ASSERT (src0 -> ne [0 ] %QK4_0 == 0 ); 211GGML_ASSERT (src1 -> ne [0 ] %QK4_0 == 0 ); 212GGML_ASSERT (dst -> ne [0 ] %QK4_0 == 0 ); 213 214const int ne00_blk = src0 -> ne [0 ] /QK4_0 ; 215const int ne0_blk = dst -> ne [0 ] /QK4_0 ; 216 217if (ggml_is_contiguous (src0 )&& ggml_is_contiguous (src1 )) { 218const block_q4_0 * src0_d = (const block_q4_0 * )src0 -> data ; 219const block_q4_0 * src1_d = (const block_q4_0 * )src1 -> data ; 220block_q4_0 * dst_d = (block_q4_0 * )dst -> data ; 221const size_t type_size = sizeof (block_q4_0 ); 222 223if (dim != 3 ) { 224for (int i3 = 0 ;i3 < dst -> ne [3 ];i3 ++ ) { 225concat_T_sycl < block_q4_0 > ( 226src0_d + i3 * (src0 -> nb [3 ] /type_size ), 227src1_d + i3 * (src1 -> nb [3 ] /type_size ), 228dst_d + i3 * (dst -> nb [3 ] /type_size ), 229ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],ne0_blk , 230dst -> ne [1 ],dst -> ne [2 ],dim ,stream ); 231 } 232 }else { 233const size_t size0 = ggml_nbytes (src0 ); 234const size_t size1 = ggml_nbytes (src1 ); 235 236SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy (dst_d ,src0_d ,size0 ))); 237SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy ((char * )dst_d + size0 ,src1_d ,size1 ))); 238 } 239 }else { 240concat_T_sycl_non_cont < block_q4_0 > ( 241stream , (const char * )src0 -> data , (const char * )src1 -> data , 242 (char * )dst -> data , 243ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],src0 -> ne [3 ], 244src0 -> nb [0 ],src0 -> nb [1 ],src0 -> nb [2 ],src0 -> nb [3 ], 245src1 -> ne [0 ] /QK4_0 ,src1 -> ne [1 ],src1 -> ne [2 ],src1 -> ne [3 ], 246src1 -> nb [0 ],src1 -> nb [1 ],src1 -> nb [2 ],src1 -> nb [3 ], 247ne0_blk ,dst -> ne [1 ],dst -> ne [2 ],dst -> ne [3 ], 248dst -> nb [0 ],dst -> nb [1 ],dst -> nb [2 ],dst -> nb [3 ],dim ); 249 } 250} 251 252static void concat_impl_q4_1_sycl (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 253scope_op_debug_print scope_dbg_print (__func__ ,dst ,/*num_src=*/ 2 ); 254const ggml_tensor * src0 = dst -> src [0 ]; 255const ggml_tensor * src1 = dst -> src [1 ]; 256queue_ptr stream = ctx .stream (); 257 258const int32_t dim = ((int32_t * )dst -> op_params )[0 ]; 259 260GGML_ASSERT (src0 -> type == GGML_TYPE_Q4_1 ); 261GGML_ASSERT (src1 -> type == GGML_TYPE_Q4_1 ); 262GGML_ASSERT (dst -> type == GGML_TYPE_Q4_1 ); 263GGML_ASSERT (src0 -> ne [0 ] %QK4_1 == 0 ); 264GGML_ASSERT (src1 -> ne [0 ] %QK4_1 == 0 ); 265GGML_ASSERT (dst -> ne [0 ] %QK4_1 == 0 ); 266 267const int ne00_blk = src0 -> ne [0 ] /QK4_1 ; 268const int ne0_blk = dst -> ne [0 ] /QK4_1 ; 269 270if (ggml_is_contiguous (src0 )&& ggml_is_contiguous (src1 )) { 271const block_q4_1 * src0_d = (const block_q4_1 * )src0 -> data ; 272const block_q4_1 * src1_d = (const block_q4_1 * )src1 -> data ; 273block_q4_1 * dst_d = (block_q4_1 * )dst -> data ; 274const size_t type_size = sizeof (block_q4_1 ); 275 276if (dim != 3 ) { 277for (int i3 = 0 ;i3 < dst -> ne [3 ];i3 ++ ) { 278concat_T_sycl < block_q4_1 > ( 279src0_d + i3 * (src0 -> nb [3 ] /type_size ), 280src1_d + i3 * (src1 -> nb [3 ] /type_size ), 281dst_d + i3 * (dst -> nb [3 ] /type_size ), 282ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],ne0_blk , 283dst -> ne [1 ],dst -> ne [2 ],dim ,stream ); 284 } 285 }else { 286const size_t size0 = ggml_nbytes (src0 ); 287const size_t size1 = ggml_nbytes (src1 ); 288 289SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy (dst_d ,src0_d ,size0 ))); 290SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy ((char * )dst_d + size0 ,src1_d ,size1 ))); 291 } 292 }else { 293concat_T_sycl_non_cont < block_q4_1 > ( 294stream , (const char * )src0 -> data , (const char * )src1 -> data , 295 (char * )dst -> data , 296ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],src0 -> ne [3 ], 297src0 -> nb [0 ],src0 -> nb [1 ],src0 -> nb [2 ],src0 -> nb [3 ], 298src1 -> ne [0 ] /QK4_1 ,src1 -> ne [1 ],src1 -> ne [2 ],src1 -> ne [3 ], 299src1 -> nb [0 ],src1 -> nb [1 ],src1 -> nb [2 ],src1 -> nb [3 ], 300ne0_blk ,dst -> ne [1 ],dst -> ne [2 ],dst -> ne [3 ], 301dst -> nb [0 ],dst -> nb [1 ],dst -> nb [2 ],dst -> nb [3 ],dim ); 302 } 303} 304 305static void concat_impl_q5_0_sycl (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 306scope_op_debug_print scope_dbg_print (__func__ ,dst ,/*num_src=*/ 2 ); 307const ggml_tensor * src0 = dst -> src [0 ]; 308const ggml_tensor * src1 = dst -> src [1 ]; 309queue_ptr stream = ctx .stream (); 310 311const int32_t dim = ((int32_t * )dst -> op_params )[0 ]; 312 313GGML_ASSERT (src0 -> type == GGML_TYPE_Q5_0 ); 314GGML_ASSERT (src1 -> type == GGML_TYPE_Q5_0 ); 315GGML_ASSERT (dst -> type == GGML_TYPE_Q5_0 ); 316GGML_ASSERT (src0 -> ne [0 ] %QK5_0 == 0 ); 317GGML_ASSERT (src1 -> ne [0 ] %QK5_0 == 0 ); 318GGML_ASSERT (dst -> ne [0 ] %QK5_0 == 0 ); 319 320const int ne00_blk = src0 -> ne [0 ] /QK5_0 ; 321const int ne0_blk = dst -> ne [0 ] /QK5_0 ; 322 323if (ggml_is_contiguous (src0 )&& ggml_is_contiguous (src1 )) { 324const block_q5_0 * src0_d = (const block_q5_0 * )src0 -> data ; 325const block_q5_0 * src1_d = (const block_q5_0 * )src1 -> data ; 326block_q5_0 * dst_d = (block_q5_0 * )dst -> data ; 327const size_t type_size = sizeof (block_q5_0 ); 328 329if (dim != 3 ) { 330for (int i3 = 0 ;i3 < dst -> ne [3 ];i3 ++ ) { 331concat_T_sycl < block_q5_0 > ( 332src0_d + i3 * (src0 -> nb [3 ] /type_size ), 333src1_d + i3 * (src1 -> nb [3 ] /type_size ), 334dst_d + i3 * (dst -> nb [3 ] /type_size ), 335ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],ne0_blk , 336dst -> ne [1 ],dst -> ne [2 ],dim ,stream ); 337 } 338 }else { 339const size_t size0 = ggml_nbytes (src0 ); 340const size_t size1 = ggml_nbytes (src1 ); 341 342SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy (dst_d ,src0_d ,size0 ))); 343SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy ((char * )dst_d + size0 ,src1_d ,size1 ))); 344 } 345 }else { 346concat_T_sycl_non_cont < block_q5_0 > ( 347stream , (const char * )src0 -> data , (const char * )src1 -> data , 348 (char * )dst -> data , 349ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],src0 -> ne [3 ], 350src0 -> nb [0 ],src0 -> nb [1 ],src0 -> nb [2 ],src0 -> nb [3 ], 351src1 -> ne [0 ] /QK5_0 ,src1 -> ne [1 ],src1 -> ne [2 ],src1 -> ne [3 ], 352src1 -> nb [0 ],src1 -> nb [1 ],src1 -> nb [2 ],src1 -> nb [3 ], 353ne0_blk ,dst -> ne [1 ],dst -> ne [2 ],dst -> ne [3 ], 354dst -> nb [0 ],dst -> nb [1 ],dst -> nb [2 ],dst -> nb [3 ],dim ); 355 } 356} 357 358static void concat_impl_q5_1_sycl (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 359scope_op_debug_print scope_dbg_print (__func__ ,dst ,/*num_src=*/ 2 ); 360const ggml_tensor * src0 = dst -> src [0 ]; 361const ggml_tensor * src1 = dst -> src [1 ]; 362queue_ptr stream = ctx .stream (); 363 364const int32_t dim = ((int32_t * )dst -> op_params )[0 ]; 365 366GGML_ASSERT (src0 -> type == GGML_TYPE_Q5_1 ); 367GGML_ASSERT (src1 -> type == GGML_TYPE_Q5_1 ); 368GGML_ASSERT (dst -> type == GGML_TYPE_Q5_1 ); 369GGML_ASSERT (src0 -> ne [0 ] %QK5_1 == 0 ); 370GGML_ASSERT (src1 -> ne [0 ] %QK5_1 == 0 ); 371GGML_ASSERT (dst -> ne [0 ] %QK5_1 == 0 ); 372 373const int ne00_blk = src0 -> ne [0 ] /QK5_1 ; 374const int ne0_blk = dst -> ne [0 ] /QK5_1 ; 375 376if (ggml_is_contiguous (src0 )&& ggml_is_contiguous (src1 )) { 377const block_q5_1 * src0_d = (const block_q5_1 * )src0 -> data ; 378const block_q5_1 * src1_d = (const block_q5_1 * )src1 -> data ; 379block_q5_1 * dst_d = (block_q5_1 * )dst -> data ; 380const size_t type_size = sizeof (block_q5_1 ); 381 382if (dim != 3 ) { 383for (int i3 = 0 ;i3 < dst -> ne [3 ];i3 ++ ) { 384concat_T_sycl < block_q5_1 > ( 385src0_d + i3 * (src0 -> nb [3 ] /type_size ), 386src1_d + i3 * (src1 -> nb [3 ] /type_size ), 387dst_d + i3 * (dst -> nb [3 ] /type_size ), 388ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],ne0_blk , 389dst -> ne [1 ],dst -> ne [2 ],dim ,stream ); 390 } 391 }else { 392const size_t size0 = ggml_nbytes (src0 ); 393const size_t size1 = ggml_nbytes (src1 ); 394 395SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy (dst_d ,src0_d ,size0 ))); 396SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy ((char * )dst_d + size0 ,src1_d ,size1 ))); 397 } 398 }else { 399concat_T_sycl_non_cont < block_q5_1 > ( 400stream , (const char * )src0 -> data , (const char * )src1 -> data , 401 (char * )dst -> data , 402ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],src0 -> ne [3 ], 403src0 -> nb [0 ],src0 -> nb [1 ],src0 -> nb [2 ],src0 -> nb [3 ], 404src1 -> ne [0 ] /QK5_1 ,src1 -> ne [1 ],src1 -> ne [2 ],src1 -> ne [3 ], 405src1 -> nb [0 ],src1 -> nb [1 ],src1 -> nb [2 ],src1 -> nb [3 ], 406ne0_blk ,dst -> ne [1 ],dst -> ne [2 ],dst -> ne [3 ], 407dst -> nb [0 ],dst -> nb [1 ],dst -> nb [2 ],dst -> nb [3 ],dim ); 408 } 409} 410 411static void concat_impl_q8_0_sycl (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 412scope_op_debug_print scope_dbg_print (__func__ ,dst ,/*num_src=*/ 2 ); 413const ggml_tensor * src0 = dst -> src [0 ]; 414const ggml_tensor * src1 = dst -> src [1 ]; 415queue_ptr stream = ctx .stream (); 416 417const int32_t dim = ((int32_t * )dst -> op_params )[0 ]; 418 419GGML_ASSERT (src0 -> type == GGML_TYPE_Q8_0 ); 420GGML_ASSERT (src1 -> type == GGML_TYPE_Q8_0 ); 421GGML_ASSERT (dst -> type == GGML_TYPE_Q8_0 ); 422GGML_ASSERT (src0 -> ne [0 ] %QK8_0 == 0 ); 423GGML_ASSERT (src1 -> ne [0 ] %QK8_0 == 0 ); 424GGML_ASSERT (dst -> ne [0 ] %QK8_0 == 0 ); 425 426const int ne00_blk = src0 -> ne [0 ] /QK8_0 ; 427const int ne0_blk = dst -> ne [0 ] /QK8_0 ; 428 429if (ggml_is_contiguous (src0 )&& ggml_is_contiguous (src1 )) { 430const block_q8_0 * src0_d = (const block_q8_0 * )src0 -> data ; 431const block_q8_0 * src1_d = (const block_q8_0 * )src1 -> data ; 432block_q8_0 * dst_d = (block_q8_0 * )dst -> data ; 433const size_t type_size = sizeof (block_q8_0 ); 434 435if (dim != 3 ) { 436for (int i3 = 0 ;i3 < dst -> ne [3 ];i3 ++ ) { 437concat_T_sycl < block_q8_0 > ( 438src0_d + i3 * (src0 -> nb [3 ] /type_size ), 439src1_d + i3 * (src1 -> nb [3 ] /type_size ), 440dst_d + i3 * (dst -> nb [3 ] /type_size ), 441ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],ne0_blk , 442dst -> ne [1 ],dst -> ne [2 ],dim ,stream ); 443 } 444 }else { 445const size_t size0 = ggml_nbytes (src0 ); 446const size_t size1 = ggml_nbytes (src1 ); 447SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy (dst_d ,src0_d ,size0 ))); 448SYCL_CHECK (CHECK_TRY_ERROR (stream -> memcpy ((char * )dst_d + size0 ,src1_d ,size1 ))); 449 } 450 }else { 451concat_T_sycl_non_cont < block_q8_0 > ( 452stream , (const char * )src0 -> data , (const char * )src1 -> data , 453 (char * )dst -> data , 454ne00_blk ,src0 -> ne [1 ],src0 -> ne [2 ],src0 -> ne [3 ], 455src0 -> nb [0 ],src0 -> nb [1 ],src0 -> nb [2 ],src0 -> nb [3 ], 456src1 -> ne [0 ] /QK8_0 ,src1 -> ne [1 ],src1 -> ne [2 ],src1 -> ne [3 ], 457src1 -> nb [0 ],src1 -> nb [1 ],src1 -> nb [2 ],src1 -> nb [3 ], 458ne0_blk ,dst -> ne [1 ],dst -> ne [2 ],dst -> ne [3 ], 459dst -> nb [0 ],dst -> nb [1 ],dst -> nb [2 ],dst -> nb [3 ],dim ); 460 } 461} 462 463void ggml_sycl_op_concat (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 464 465switch (dst -> type ) { 466case GGML_TYPE_F32 : 467concat_impl_sycl < float > (ctx ,dst ); 468break ; 469case GGML_TYPE_F16 : 470concat_impl_sycl < sycl::half > (ctx ,dst ); 471break ; 472#ifdef GGML_SYCL_HAS_BF16 473case GGML_TYPE_BF16 : 474concat_impl_sycl < sycl::ext::oneapi::bfloat16 > (ctx ,dst ); 475break ; 476#endif 477case GGML_TYPE_I32 : 478concat_impl_sycl < int32_t > (ctx ,dst ); 479break ; 480case GGML_TYPE_I16 : 481concat_impl_sycl < int16_t > (ctx ,dst ); 482break ; 483case GGML_TYPE_I64 : 484concat_impl_sycl < int64_t > (ctx ,dst ); 485break ; 486case GGML_TYPE_I8 : 487concat_impl_sycl < int8_t > (ctx ,dst ); 488break ; 489case GGML_TYPE_Q4_0 : 490concat_impl_q4_0_sycl (ctx ,dst ); 491break ; 492case GGML_TYPE_Q4_1 : 493concat_impl_q4_1_sycl (ctx ,dst ); 494break ; 495case GGML_TYPE_Q5_0 : 496concat_impl_q5_0_sycl (ctx ,dst ); 497break ; 498case GGML_TYPE_Q5_1 : 499concat_impl_q5_1_sycl (ctx ,dst ); 500break ; 501case GGML_TYPE_Q8_0 : 502concat_impl_q8_0_sycl (ctx ,dst ); 503break ; 504default : 505fprintf (stderr ,"%s: unsupported types: dst: %s\n" ,__func__ ,ggml_type_name (dst -> type )); 506GGML_ASSERT (false); 507break ; 508 } 509}