char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
0190529ec
char/aliceai-t5-moe
1#pragma OPENCL EXTENSION cl_khr_fp16 : enable 2 3#define GELU_COEF_A 0.044715f 4#define GELU_QUICK_COEF -1.702f 5#define SQRT_2_OVER_PI 0.79788456080286535587989211986876f 6#define SQRT_2_INV 0.70710678118654752440084436210484f 7 8//------------------------------------------------------------------------------ 9// geglu 10//------------------------------------------------------------------------------ 11kernel void kernel_geglu( 12 global char * src0, 13 ulong offset0, 14 global char * src1, 15 ulong offset1, 16 global char * dst, 17 ulong offsetd, 18 ulong nb01, 19 ulong nb11, 20 int ne0, 21 ulong nb1, 22 int ne00_off, 23 int ne10_off 24) { 25 src0 = (global char*)((global char*)src0 + offset0); 26 src1 = (global char*)((global char*)src1 + offset1); 27 dst = (global char*)((global char*)dst + offsetd); 28 29 global float * src0_row = (global float *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 30 global float * src1_row = (global float *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 31 global float * dst_row = (global float *) ((global char *) dst + get_group_id(0)*nb1); 32 33 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 34 const float x0 = src0_row[i0]; 35 const float x1 = src1_row[i0]; 36 37 const float gelu = 0.5f*x0*(1.0f + tanh(SQRT_2_OVER_PI*x0*(1.0f + GELU_COEF_A*x0*x0))); 38 39 dst_row[i0] = gelu*x1; 40 } 41} 42 43kernel void kernel_geglu_f16( 44 global char * src0, 45 ulong offset0, 46 global char * src1, 47 ulong offset1, 48 global char * dst, 49 ulong offsetd, 50 ulong nb01, 51 ulong nb11, 52 int ne0, 53 ulong nb1, 54 int ne00_off, 55 int ne10_off 56) { 57 src0 = (global char*)((global char*)src0 + offset0); 58 src1 = (global char*)((global char*)src1 + offset1); 59 dst = (global char*)((global char*)dst + offsetd); 60 61 global half * src0_row = (global half *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 62 global half * src1_row = (global half *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 63 global half * dst_row = (global half *) ((global char *) dst + get_group_id(0)*nb1); 64 65 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 66 const half x0 = src0_row[i0]; 67 const half x1 = src1_row[i0]; 68 69 const half gelu = 0.5f*x0*(1.0f + tanh(SQRT_2_OVER_PI*x0*(1.0f + GELU_COEF_A*x0*x0))); 70 71 dst_row[i0] = gelu*x1; 72 } 73} 74 75//------------------------------------------------------------------------------ 76// reglu 77//------------------------------------------------------------------------------ 78kernel void kernel_reglu( 79 global char * src0, 80 ulong offset0, 81 global char * src1, 82 ulong offset1, 83 global char * dst, 84 ulong offsetd, 85 ulong nb01, 86 ulong nb11, 87 int ne0, 88 ulong nb1, 89 int ne00_off, 90 int ne10_off 91) { 92 src0 = (global char*)((global char*)src0 + offset0); 93 src1 = (global char*)((global char*)src1 + offset1); 94 dst = (global char*)((global char*)dst + offsetd); 95 96 global float * src0_row = (global float *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 97 global float * src1_row = (global float *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 98 global float * dst_row = (global float *) ((global char *) dst + get_group_id(0)*nb1); 99 100 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 101 const float x0 = src0_row[i0]; 102 const float x1 = src1_row[i0]; 103 104 dst_row[i0] = x0*x1*(x0 > 0.0f); 105 } 106} 107 108kernel void kernel_reglu_f16( 109 global char * src0, 110 ulong offset0, 111 global char * src1, 112 ulong offset1, 113 global char * dst, 114 ulong offsetd, 115 ulong nb01, 116 ulong nb11, 117 int ne0, 118 ulong nb1, 119 int ne00_off, 120 int ne10_off 121) { 122 src0 = (global char*)((global char*)src0 + offset0); 123 src1 = (global char*)((global char*)src1 + offset1); 124 dst = (global char*)((global char*)dst + offsetd); 125 126 global half * src0_row = (global half *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 127 global half * src1_row = (global half *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 128 global half * dst_row = (global half *) ((global char *) dst + get_group_id(0)*nb1); 129 130 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 131 const half x0 = src0_row[i0]; 132 const half x1 = src1_row[i0]; 133 134 dst_row[i0] = x0*x1*(x0 > 0.0f); 135 } 136} 137 138//------------------------------------------------------------------------------ 139// swiglu 140//------------------------------------------------------------------------------ 141kernel void kernel_swiglu( 142 global char * src0, 143 ulong offset0, 144 global char * src1, 145 ulong offset1, 146 global char * dst, 147 ulong offsetd, 148 ulong nb01, 149 ulong nb11, 150 int ne0, 151 ulong nb1, 152 int ne00_off, 153 int ne10_off 154) { 155 src0 = (global char*)((global char*)src0 + offset0); 156 src1 = (global char*)((global char*)src1 + offset1); 157 dst = (global char*)((global char*)dst + offsetd); 158 159 global float * src0_row = (global float *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 160 global float * src1_row = (global float *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 161 global float * dst_row = (global float *) ((global char *) dst + get_group_id(0)*nb1); 162 163 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 164 const float x0 = src0_row[i0]; 165 const float x1 = src1_row[i0]; 166 167 const float silu = x0 / (1.0f + exp(-x0)); 168 169 dst_row[i0] = silu*x1; 170 } 171} 172 173kernel void kernel_swiglu_f16( 174 global char * src0, 175 ulong offset0, 176 global char * src1, 177 ulong offset1, 178 global char * dst, 179 ulong offsetd, 180 ulong nb01, 181 ulong nb11, 182 int ne0, 183 ulong nb1, 184 int ne00_off, 185 int ne10_off 186) { 187 src0 = (global char*)((global char*)src0 + offset0); 188 src1 = (global char*)((global char*)src1 + offset1); 189 dst = (global char*)((global char*)dst + offsetd); 190 191 global half * src0_row = (global half *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 192 global half * src1_row = (global half *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 193 global half * dst_row = (global half *) ((global char *) dst + get_group_id(0)*nb1); 194 195 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 196 const half x0 = src0_row[i0]; 197 const half x1 = src1_row[i0]; 198 199 const half silu = x0 / (1.0f + exp(-x0)); 200 201 dst_row[i0] = silu*x1; 202 } 203} 204 205//------------------------------------------------------------------------------ 206// swiglu_oai 207//------------------------------------------------------------------------------ 208kernel void kernel_swiglu_oai( 209 global char * src0, 210 ulong offset0, 211 global char * src1, 212 ulong offset1, 213 global char * dst, 214 ulong offsetd, 215 ulong nb01, 216 ulong nb11, 217 int ne0, 218 ulong nb1, 219 int ne00_off, 220 int ne10_off, 221 float limit, 222 float alpha 223) { 224 src0 = (global char*)((global char*)src0 + offset0); 225 src1 = (global char*)((global char*)src1 + offset1); 226 dst = (global char*)((global char*)dst + offsetd); 227 228 global float * src0_row = (global float *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 229 global float * src1_row = (global float *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 230 global float * dst_row = (global float *) ((global char *) dst + get_group_id(0)*nb1); 231 232 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 233 float x0 = src0_row[i0]; 234 float x1 = src1_row[i0]; 235 236 x0 = min(x0, limit); 237 x1 = max(min(x1, limit), -limit); 238 239 float out_glu = x0 / (1.0f + exp(-x0 * alpha)); 240 out_glu = out_glu * (1.0f + x1); 241 242 dst_row[i0] = out_glu; 243 } 244} 245 246//------------------------------------------------------------------------------ 247// swiglu_clamp 248//------------------------------------------------------------------------------ 249kernel void kernel_swiglu_clamp( 250 global char * src0, 251 ulong offset0, 252 global char * src1, 253 ulong offset1, 254 global char * dst, 255 ulong offsetd, 256 ulong nb01, 257 ulong nb11, 258 int ne0, 259 ulong nb1, 260 int ne00_off, 261 int ne10_off, 262 float limit 263) { 264 src0 = (global char*)((global char*)src0 + offset0); 265 src1 = (global char*)((global char*)src1 + offset1); 266 dst = (global char*)((global char*)dst + offsetd); 267 268 global float * src0_row = (global float *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 269 global float * src1_row = (global float *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 270 global float * dst_row = (global float *) ((global char *) dst + get_group_id(0)*nb1); 271 272 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 273 const float gate = min(src0_row[i0], limit); 274 const float up = clamp(src1_row[i0], -limit, limit); 275 276 dst_row[i0] = gate / (1.0f + exp(-gate)) * up; 277 } 278} 279 280kernel void kernel_swiglu_clamp_f16( 281 global char * src0, 282 ulong offset0, 283 global char * src1, 284 ulong offset1, 285 global char * dst, 286 ulong offsetd, 287 ulong nb01, 288 ulong nb11, 289 int ne0, 290 ulong nb1, 291 int ne00_off, 292 int ne10_off, 293 float limit 294) { 295 src0 = (global char*)((global char*)src0 + offset0); 296 src1 = (global char*)((global char*)src1 + offset1); 297 dst = (global char*)((global char*)dst + offsetd); 298 299 global half * src0_row = (global half *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 300 global half * src1_row = (global half *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 301 global half * dst_row = (global half *) ((global char *) dst + get_group_id(0)*nb1); 302 303 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 304 const float gate = min((float) src0_row[i0], limit); 305 const float up = clamp((float) src1_row[i0], -limit, limit); 306 307 dst_row[i0] = (half) (gate / (1.0f + exp(-gate)) * up); 308 } 309} 310 311//------------------------------------------------------------------------------ 312// geglu_erf 313//------------------------------------------------------------------------------ 314kernel void kernel_geglu_erf( 315 global char * src0, 316 ulong offset0, 317 global char * src1, 318 ulong offset1, 319 global char * dst, 320 ulong offsetd, 321 ulong nb01, 322 ulong nb11, 323 int ne0, 324 ulong nb1, 325 int ne00_off, 326 int ne10_off 327) { 328 src0 = (global char*)((global char*)src0 + offset0); 329 src1 = (global char*)((global char*)src1 + offset1); 330 dst = (global char*)((global char*)dst + offsetd); 331 332 global float * src0_row = (global float *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 333 global float * src1_row = (global float *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 334 global float * dst_row = (global float *) ((global char *) dst + get_group_id(0)*nb1); 335 336 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 337 const float x0 = src0_row[i0]; 338 const float x1 = src1_row[i0]; 339 340 const float gelu_erf = 0.5f*x0*(1.0f + erf(x0*SQRT_2_INV)); 341 342 dst_row[i0] = gelu_erf*x1; 343 } 344} 345 346kernel void kernel_geglu_erf_f16( 347 global char * src0, 348 ulong offset0, 349 global char * src1, 350 ulong offset1, 351 global char * dst, 352 ulong offsetd, 353 ulong nb01, 354 ulong nb11, 355 int ne0, 356 ulong nb1, 357 int ne00_off, 358 int ne10_off 359) { 360 src0 = (global char*)((global char*)src0 + offset0); 361 src1 = (global char*)((global char*)src1 + offset1); 362 dst = (global char*)((global char*)dst + offsetd); 363 364 global half * src0_row = (global half *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 365 global half * src1_row = (global half *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 366 global half * dst_row = (global half *) ((global char *) dst + get_group_id(0)*nb1); 367 368 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 369 const half x0 = src0_row[i0]; 370 const half x1 = src1_row[i0]; 371 372 const half gelu_erf = 0.5f*x0*(1.0f + erf(x0*SQRT_2_INV)); 373 374 dst_row[i0] = gelu_erf*x1; 375 } 376} 377 378//------------------------------------------------------------------------------ 379// geglu_quick 380//------------------------------------------------------------------------------ 381kernel void kernel_geglu_quick( 382 global char * src0, 383 ulong offset0, 384 global char * src1, 385 ulong offset1, 386 global char * dst, 387 ulong offsetd, 388 ulong nb01, 389 ulong nb11, 390 int ne0, 391 ulong nb1, 392 int ne00_off, 393 int ne10_off 394) { 395 src0 = (global char*)((global char*)src0 + offset0); 396 src1 = (global char*)((global char*)src1 + offset1); 397 dst = (global char*)((global char*)dst + offsetd); 398 399 global float * src0_row = (global float *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 400 global float * src1_row = (global float *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 401 global float * dst_row = (global float *) ((global char *) dst + get_group_id(0)*nb1); 402 403 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 404 const float x0 = src0_row[i0]; 405 const float x1 = src1_row[i0]; 406 407 const float gelu_quick = x0*(1.0f/(1.0f + exp(GELU_QUICK_COEF*x0))); 408 409 dst_row[i0] = gelu_quick*x1; 410 } 411} 412 413kernel void kernel_geglu_quick_f16( 414 global char * src0, 415 ulong offset0, 416 global char * src1, 417 ulong offset1, 418 global char * dst, 419 ulong offsetd, 420 ulong nb01, 421 ulong nb11, 422 int ne0, 423 ulong nb1, 424 int ne00_off, 425 int ne10_off 426) { 427 src0 = (global char*)((global char*)src0 + offset0); 428 src1 = (global char*)((global char*)src1 + offset1); 429 dst = (global char*)((global char*)dst + offsetd); 430 431 global half * src0_row = (global half *) ((global char *) src0 + get_group_id(0)*nb01) + ne00_off; 432 global half * src1_row = (global half *) ((global char *) src1 + get_group_id(0)*nb11) + ne10_off; 433 global half * dst_row = (global half *) ((global char *) dst + get_group_id(0)*nb1); 434 435 for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { 436 const half x0 = src0_row[i0]; 437 const half x1 = src1_row[i0]; 438 439 const half gelu_quick = x0*(1.0f/(1.0f + exp(GELU_QUICK_COEF*x0))); 440 441 dst_row[i0] = gelu_quick*x1; 442 } 443}