summaryrefslogtreecommitdiff
path: root/llama.cpp/ggml/src/ggml-opencl/kernels/set_rows.cl
diff options
context:
space:
mode:
Diffstat (limited to 'llama.cpp/ggml/src/ggml-opencl/kernels/set_rows.cl')
-rw-r--r--llama.cpp/ggml/src/ggml-opencl/kernels/set_rows.cl208
1 files changed, 208 insertions, 0 deletions
diff --git a/llama.cpp/ggml/src/ggml-opencl/kernels/set_rows.cl b/llama.cpp/ggml/src/ggml-opencl/kernels/set_rows.cl
new file mode 100644
index 0000000..fc3ff7a
--- /dev/null
+++ b/llama.cpp/ggml/src/ggml-opencl/kernels/set_rows.cl
@@ -0,0 +1,208 @@
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// v = { mp, L, d }
+inline uint fastdiv(uint n, uint4 v) {
+ uint msbs;
+ msbs = mul_hi(n, v.s0);
+ return (msbs + n) >> v.s1;
+}
+inline uint fastmod(uint n, uint4 v) {
+ uint q = fastdiv(n, v);
+ return n - q * v.s2;
+}
+
+kernel void kernel_set_rows_f32_i64(
+ global char * src0,
+ ulong offset0,
+ global char * src1,
+ ulong offset1,
+ global char * dst,
+ ulong offsetd,
+ int ne01,
+ ulong nb01,
+ ulong nb02,
+ ulong nb03,
+ uint4 ne11,
+ uint4 ne12,
+ ulong nb10,
+ ulong nb11,
+ ulong nb12,
+ int nblk0,
+ ulong nb1,
+ ulong nb2,
+ ulong nb3
+) {
+ src0 = src0 + offset0;
+ src1 = src1 + offset1;
+ dst = dst + offsetd;
+
+ int i03 = get_group_id(2);
+ int i02 = get_group_id(1);
+ int i01 = get_group_id(0)*get_local_size(1) + get_local_id(1);
+
+ if (i01 >= ne01) {
+ return;
+ }
+
+ //int i12 = i03%ne12;
+ //int i11 = i02%ne11;
+ int i12 = fastmod(i03, ne12);
+ int i11 = fastmod(i02, ne11);
+
+ int i10 = i01;
+ long i1 = ((global long *)(src1 + i10*nb10 + i11*nb11 + i12*nb12))[0];
+
+ global float * dst_row = (global float *) (dst + i1*nb1 + i02*nb2 + i03*nb3);
+ global float * src_row = (global float *) (src0 + i01*nb01 + i02*nb02 + i03*nb03);
+
+ for (int ind = get_local_id(0); ind < nblk0; ind += get_local_size(0)) {
+ dst_row[ind] = (float)src_row[ind];
+ }
+}
+
+kernel void kernel_set_rows_f16_i64(
+ global char * src0,
+ ulong offset0,
+ global char * src1,
+ ulong offset1,
+ global char * dst,
+ ulong offsetd,
+ int ne01,
+ ulong nb01,
+ ulong nb02,
+ ulong nb03,
+ uint4 ne11,
+ uint4 ne12,
+ ulong nb10,
+ ulong nb11,
+ ulong nb12,
+ int nblk0,
+ ulong nb1,
+ ulong nb2,
+ ulong nb3
+) {
+ src0 = src0 + offset0;
+ src1 = src1 + offset1;
+ dst = dst + offsetd;
+
+ int i03 = get_group_id(2);
+ int i02 = get_group_id(1);
+ int i01 = get_group_id(0)*get_local_size(1) + get_local_id(1);
+
+ if (i01 >= ne01) {
+ return;
+ }
+
+ //int i12 = i03%ne12;
+ //int i11 = i02%ne11;
+ int i12 = fastmod(i03, ne12);
+ int i11 = fastmod(i02, ne11);
+
+ int i10 = i01;
+ long i1 = ((global long *)(src1 + i10*nb10 + i11*nb11 + i12*nb12))[0];
+
+ global half * dst_row = (global half *) (dst + i1*nb1 + i02*nb2 + i03*nb3);
+ global float * src_row = (global float *) (src0 + i01*nb01 + i02*nb02 + i03*nb03);
+
+ for (int ind = get_local_id(0); ind < nblk0; ind += get_local_size(0)) {
+ dst_row[ind] = src_row[ind];
+ }
+}
+
+kernel void kernel_set_rows_f32_i32(
+ global char * src0,
+ ulong offset0,
+ global char * src1,
+ ulong offset1,
+ global char * dst,
+ ulong offsetd,
+ int ne01,
+ ulong nb01,
+ ulong nb02,
+ ulong nb03,
+ uint4 ne11,
+ uint4 ne12,
+ ulong nb10,
+ ulong nb11,
+ ulong nb12,
+ int nblk0,
+ ulong nb1,
+ ulong nb2,
+ ulong nb3
+) {
+ src0 = src0 + offset0;
+ src1 = src1 + offset1;
+ dst = dst + offsetd;
+
+ int i03 = get_group_id(2);
+ int i02 = get_group_id(1);
+ int i01 = get_group_id(0)*get_local_size(1) + get_local_id(1);
+
+ if (i01 >= ne01) {
+ return;
+ }
+
+ //int i12 = i03%ne12;
+ //int i11 = i02%ne11;
+ int i12 = fastmod(i03, ne12);
+ int i11 = fastmod(i02, ne11);
+
+ int i10 = i01;
+ int i1 = ((global int *)(src1 + i10*nb10 + i11*nb11 + i12*nb12))[0];
+
+ global float * dst_row = (global float *) (dst + i1*nb1 + i02*nb2 + i03*nb3);
+ global float * src_row = (global float *) (src0 + i01*nb01 + i02*nb02 + i03*nb03);
+
+ for (int ind = get_local_id(0); ind < nblk0; ind += get_local_size(0)) {
+ dst_row[ind] = (float)src_row[ind];
+ }
+}
+
+kernel void kernel_set_rows_f16_i32(
+ global char * src0,
+ ulong offset0,
+ global char * src1,
+ ulong offset1,
+ global char * dst,
+ ulong offsetd,
+ int ne01,
+ ulong nb01,
+ ulong nb02,
+ ulong nb03,
+ uint4 ne11,
+ uint4 ne12,
+ ulong nb10,
+ ulong nb11,
+ ulong nb12,
+ int nblk0,
+ ulong nb1,
+ ulong nb2,
+ ulong nb3
+) {
+ src0 = src0 + offset0;
+ src1 = src1 + offset1;
+ dst = dst + offsetd;
+
+ int i03 = get_group_id(2);
+ int i02 = get_group_id(1);
+ int i01 = get_group_id(0)*get_local_size(1) + get_local_id(1);
+
+ if (i01 >= ne01) {
+ return;
+ }
+
+ //int i12 = i03%ne12;
+ //int i11 = i02%ne11;
+ int i12 = fastmod(i03, ne12);
+ int i11 = fastmod(i02, ne11);
+
+ int i10 = i01;
+ int i1 = ((global int *)(src1 + i10*nb10 + i11*nb11 + i12*nb12))[0];
+
+ global half * dst_row = (global half *) (dst + i1*nb1 + i02*nb2 + i03*nb3);
+ global float * src_row = (global float *) (src0 + i01*nb01 + i02*nb02 + i03*nb03);
+
+ for (int ind = get_local_id(0); ind < nblk0; ind += get_local_size(0)) {
+ dst_row[ind] = src_row[ind];
+ }
+}