char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
1f30ac0ce
char/aliceai-t5-moe
1#version 450 2 3#extension GL_EXT_shader_16bit_storage : require 4#extension GL_EXT_control_flow_attributes : require 5#extension GL_EXT_shader_explicit_arithmetic_types_int32 : require 6 7#include "types.glsl" 8 9layout (push_constant) uniform parameter 10{ 11 BDA_STORAGE_T dst_addr; 12 uint32_t nb10; 13 uint32_t nb11; 14 uint32_t nb12; 15 uint32_t nb13; 16 uint32_t s0; 17 uint32_t s1; 18 uint32_t s2; 19 uint32_t p0; 20 uint32_t p1; 21 uint32_t p2; 22 uint32_t d0; 23 uint32_t d1; 24 uint32_t d2; 25 uint32_t IW; 26 uint32_t IH; 27 uint32_t ID; 28 uint32_t IC; 29 uint32_t KW; 30 uint32_t OH; 31 uint32_t KD_KH_KW; 32 uint32_t KH_KW; 33 uint32_t IC_KD_KH_KW; 34 uint32_t N_OD_OH; 35 uint32_t OD_OH; 36 uint32_t OD_OH_OW_IC_KD_KH_KW; 37 uint32_t OH_OW_IC_KD_KH_KW; 38 uint32_t OW_IC_KD_KH_KW; 39 uint32_t misalign_offsets; 40} p; 41 42uint get_aoffset() { return p.misalign_offsets >> 16; } 43uint get_doffset() { return p.misalign_offsets & 0xFFFF; } 44 45layout(constant_id = 0) const uint BLOCK_SIZE = 32; 46 47layout(local_size_x_id = 0, local_size_y = 1, local_size_z = 1) in; 48 49layout (binding = 0) readonly buffer X {A_TYPE data_a[];}; 50layout (binding = 1) writeonly buffer D {D_TYPE data_d[];}; 51 52#if BDA 53layout (buffer_reference) buffer D_ptr {D_TYPE d;}; 54#endif 55 56void main() { 57 const uint32_t i = gl_GlobalInvocationID.x; 58 59 uint32_t nb10 = p.nb10; 60 uint32_t nb11 = p.nb11; 61 uint32_t nb12 = p.nb12; 62 uint32_t nb13 = p.nb13; 63 uint32_t s0 = p.s0; 64 uint32_t s1 = p.s1; 65 uint32_t s2 = p.s2; 66 uint32_t p0 = p.p0; 67 uint32_t p1 = p.p1; 68 uint32_t p2 = p.p2; 69 uint32_t d0 = p.d0; 70 uint32_t d1 = p.d1; 71 uint32_t d2 = p.d2; 72 uint32_t IW = p.IW; 73 uint32_t IH = p.IH; 74 uint32_t ID = p.ID; 75 uint32_t IC = p.IC; 76 uint32_t KW = p.KW; 77 uint32_t OH = p.OH; 78 uint32_t KD_KH_KW = p.KD_KH_KW; 79 uint32_t KH_KW = p.KH_KW; 80 uint32_t IC_KD_KH_KW = p.IC_KD_KH_KW; 81 uint32_t N_OD_OH = p.N_OD_OH; 82 uint32_t OD_OH = p.OD_OH; 83 uint32_t OD_OH_OW_IC_KD_KH_KW = p.OD_OH_OW_IC_KD_KH_KW; 84 uint32_t OH_OW_IC_KD_KH_KW = p.OH_OW_IC_KD_KH_KW; 85 uint32_t OW_IC_KD_KH_KW = p.OW_IC_KD_KH_KW; 86 87 if (i >= IC_KD_KH_KW) { 88 return; 89 } 90 91 const uint32_t iic = i / KD_KH_KW; 92 const uint32_t ikd = (i - iic * KD_KH_KW) / KH_KW; 93 const uint32_t ikh = (i - iic * KD_KH_KW - ikd * KH_KW) / KW; 94 const uint32_t ikw = i % KW; 95 96 const uint32_t iow = gl_GlobalInvocationID.y; 97 for (uint32_t iz = gl_GlobalInvocationID.z; iz < N_OD_OH; iz += gl_NumWorkGroups.z) { 98 const uint32_t in_ = iz / OD_OH; 99 const uint32_t iod = (iz - in_*OD_OH) / OH; 100 const uint32_t ioh = iz % OH; 101 102 const uint32_t iiw = iow * s0 + ikw * d0 - p0; 103 const uint32_t iih = ioh * s1 + ikh * d1 - p1; 104 const uint32_t iid = iod * s2 + ikd * d2 - p2; 105 106 const BDA_OFFSET_T offset_dst = BDA_OFFSET_T(in_)*OD_OH_OW_IC_KD_KH_KW + BDA_OFFSET_T(iod)*OH_OW_IC_KD_KH_KW + BDA_OFFSET_T(ioh)*OW_IC_KD_KH_KW + BDA_OFFSET_T(iow)*IC_KD_KH_KW + iic*KD_KH_KW + ikd * KH_KW + ikh*KW + ikw; 107 108 const uint32_t offset_src = (in_*IC + iic)*nb13 + iid*nb12 + iih*nb11 + iiw*nb10; 109#if BDA 110 D_ptr dst_addr = D_ptr(p.dst_addr + D_SIZE * offset_dst); 111 if (iih >= IH || iiw >= IW || iid >= ID) { 112 dst_addr.d = D_TYPE(0.0f); 113 } else { 114 dst_addr.d = D_TYPE(data_a[offset_src + get_aoffset()]); 115 } 116#else 117 if (iih >= IH || iiw >= IW || iid >= ID) { 118 data_d[offset_dst + get_doffset()] = D_TYPE(0.0f); 119 } else { 120 data_d[offset_dst + get_doffset()] = D_TYPE(data_a[offset_src + get_aoffset()]); 121 } 122#endif 123 } 124}