|
|
|
|
@@ -2643,7 +2643,7 @@ kernel void kernel_gated_delta_net_impl(
|
|
|
|
|
b_ptr += args.ne21;
|
|
|
|
|
g_ptr += args.ne21*G;
|
|
|
|
|
|
|
|
|
|
if (K > 1u) {
|
|
|
|
|
if (K > 1) {
|
|
|
|
|
const int target_slot = (int)t - shift;
|
|
|
|
|
if (target_slot >= 0 && target_slot < (int)K) {
|
|
|
|
|
device float * dst_state = (device float *) (dst) + attn_size + (uint)target_slot * state_size_per_snap + state_out_base;
|
|
|
|
|
@@ -2655,7 +2655,7 @@ kernel void kernel_gated_delta_net_impl(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (K == 1u) {
|
|
|
|
|
if (K == 1) {
|
|
|
|
|
device float * dst_state = (device float *) (dst) + attn_size + state_out_base;
|
|
|
|
|
FOR_UNROLL (short j = 0; j < NSG; j++) {
|
|
|
|
|
const short is = tx*NSG + j;
|
|
|
|
|
@@ -5104,7 +5104,7 @@ kernel void kernel_upscale_bilinear_f32(
|
|
|
|
|
for (int64_t sx = x_min; sx < x_max; ++sx) {
|
|
|
|
|
const float wx = MAX(0.0f, 1.0f - fabs((float)sx - f00) * invscale0);
|
|
|
|
|
const float w = wx * wy;
|
|
|
|
|
const device const float * src_ptr = (device const float *)(src0 + sy*args.nb01 + sx*args.nb00);
|
|
|
|
|
device const float * src_ptr = (device const float *)(src0 + sy*args.nb01 + sx*args.nb00);
|
|
|
|
|
sum += (*src_ptr) * w;
|
|
|
|
|
wsum += w;
|
|
|
|
|
}
|
|
|
|
|
@@ -5286,7 +5286,7 @@ kernel void kernel_upscale_bicubic_f32(
|
|
|
|
|
const int64_t ix = MAX(0, MIN(args.ne00 - 1, i00 + dx));
|
|
|
|
|
const float wx = (dx == -1) ? w_x0 : (dx == 0) ? w_x1 : (dx == 1) ? w_x2 : w_x3;
|
|
|
|
|
|
|
|
|
|
const device const float * src_ptr = (device const float *)(src_slice + iy * args.nb01 + ix * args.nb00);
|
|
|
|
|
device const float * src_ptr = (device const float *)(src_slice + iy * args.nb01 + ix * args.nb00);
|
|
|
|
|
sum += (*src_ptr) * wx * wy;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -5329,42 +5329,46 @@ kernel void kernel_roll_f32(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
kernel void kernel_pad_f32(
|
|
|
|
|
template <typename T>
|
|
|
|
|
kernel void kernel_pad_impl(
|
|
|
|
|
constant ggml_metal_kargs_pad & args,
|
|
|
|
|
device const char * src0,
|
|
|
|
|
device char * dst,
|
|
|
|
|
uint3 tgpig[[threadgroup_position_in_grid]],
|
|
|
|
|
uint3 tpitg[[thread_position_in_threadgroup]],
|
|
|
|
|
uint3 ntg[[threads_per_threadgroup]]) {
|
|
|
|
|
const int32_t i3 = tgpig.z;
|
|
|
|
|
const int32_t i2 = tgpig.y;
|
|
|
|
|
const int32_t k0 = tgpig.x/args.ne1;
|
|
|
|
|
const int32_t i1 = tgpig.x - k0*args.ne1;
|
|
|
|
|
|
|
|
|
|
const int64_t i3 = tgpig.z;
|
|
|
|
|
const int64_t i2 = tgpig.y;
|
|
|
|
|
const int64_t i1 = tgpig.x;
|
|
|
|
|
const int32_t i03 = i3;
|
|
|
|
|
const int32_t i02 = i2;
|
|
|
|
|
const int32_t i01 = i1;
|
|
|
|
|
|
|
|
|
|
const int64_t i03 = i3;
|
|
|
|
|
const int64_t i02 = i2;
|
|
|
|
|
const int64_t i01 = i1;
|
|
|
|
|
device const T * src0_ptr = (device const T *) (src0 + i03*args.nb03 + i02*args.nb02 + i01*args.nb01);
|
|
|
|
|
device T * dst_ptr = (device T *) (dst + i3*args.nb3 + i2*args.nb2 + i1*args.nb1);
|
|
|
|
|
|
|
|
|
|
device const float * src0_ptr = (device const float *) (src0 + i03*args.nb03 + i02*args.nb02 + i01*args.nb01);
|
|
|
|
|
device float * dst_ptr = (device float *) (dst + i3*args.nb3 + i2*args.nb2 + i1*args.nb1);
|
|
|
|
|
|
|
|
|
|
if (i1 < args.ne01 && i2 < args.ne02 && i3 < args.ne03) {
|
|
|
|
|
for (int i0 = tpitg.x; i0 < args.ne0; i0 += ntg.x) {
|
|
|
|
|
if (i0 < args.ne00) {
|
|
|
|
|
dst_ptr[i0] = src0_ptr[i0];
|
|
|
|
|
} else {
|
|
|
|
|
dst_ptr[i0] = 0.0f;
|
|
|
|
|
}
|
|
|
|
|
for (int32_t l0 = 0; l0 < 1024; l0 += ntg.x) {
|
|
|
|
|
const int32_t i0 = k0*1024 + tpitg.x + l0;
|
|
|
|
|
if (i0 >= args.ne0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i0 = tpitg.x; i0 < args.ne0; i0 += ntg.x) {
|
|
|
|
|
dst_ptr[i0] = 0.0f;
|
|
|
|
|
if (i0 < args.ne00 && i1 < args.ne01 && i2 < args.ne02 && i3 < args.ne03) {
|
|
|
|
|
dst_ptr[i0] = src0_ptr[i0];
|
|
|
|
|
} else {
|
|
|
|
|
dst_ptr[i0] = 0.0f;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typedef decltype(kernel_pad_impl<float>) kernel_pad_t;
|
|
|
|
|
|
|
|
|
|
template [[host_name("kernel_pad_f32")]] kernel kernel_pad_t kernel_pad_impl<float>;
|
|
|
|
|
template [[host_name("kernel_pad_f32_4")]] kernel kernel_pad_t kernel_pad_impl<float4>;
|
|
|
|
|
|
|
|
|
|
// TODO: this is slow - optimize
|
|
|
|
|
kernel void kernel_pad_reflect_1d_f32(
|
|
|
|
|
constant ggml_metal_kargs_pad_reflect_1d & args,
|
|
|
|
|
device const char * src0,
|
|
|
|
|
@@ -7328,23 +7332,27 @@ kernel void kernel_cpy_t_t(
|
|
|
|
|
device const char * src0,
|
|
|
|
|
device char * dst,
|
|
|
|
|
uint3 tgpig[[threadgroup_position_in_grid]],
|
|
|
|
|
ushort tiitg[[thread_index_in_threadgroup]],
|
|
|
|
|
ushort3 tpitg[[thread_position_in_threadgroup]],
|
|
|
|
|
ushort3 ntg[[threads_per_threadgroup]]) {
|
|
|
|
|
const int i03 = tgpig[2];
|
|
|
|
|
const int i02 = tgpig[1];
|
|
|
|
|
const int i01 = ntg[1] == 1 ? tgpig[0]%args.ne01 : tgpig[0]*ntg[1] + tiitg/ntg[0];
|
|
|
|
|
const int iw0 = ntg[1] == 1 ? tgpig[0]/args.ne01 : 0;
|
|
|
|
|
const int32_t i03 = tgpig[2];
|
|
|
|
|
const int32_t i02 = tgpig[1];
|
|
|
|
|
const int32_t i01 = ntg[1] == 1 ? tgpig[0]%args.ne01 : tgpig[0]*ntg[1] + tpitg.y;
|
|
|
|
|
const int32_t iw0 = ntg[1] == 1 ? tgpig[0]/args.ne01 : 0;
|
|
|
|
|
|
|
|
|
|
if (i01 >= args.ne01) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const int64_t n = i03*args.ne02*args.ne01*args.ne00 + i02*args.ne01*args.ne00 + i01*args.ne00;
|
|
|
|
|
|
|
|
|
|
const int64_t i3 = n/(args.ne2*args.ne1*args.ne0);
|
|
|
|
|
const int64_t i2 = (n - i3*args.ne2*args.ne1*args.ne0)/(args.ne1*args.ne0);
|
|
|
|
|
const int64_t i1 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0)/args.ne0;
|
|
|
|
|
const int64_t i0 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0 - i1*args.ne0);
|
|
|
|
|
const int32_t i3 = n/(args.ne2*args.ne1*args.ne0);
|
|
|
|
|
const int32_t i2 = (n - i3*args.ne2*args.ne1*args.ne0)/(args.ne1*args.ne0);
|
|
|
|
|
const int32_t i1 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0)/args.ne0;
|
|
|
|
|
const int32_t i0 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0 - i1*args.ne0);
|
|
|
|
|
|
|
|
|
|
device T1 * dst_data = (device T1 *) (dst + i3*args.nb3 + i2*args.nb2 + i1*args.nb1 + i0*args.nb0);
|
|
|
|
|
|
|
|
|
|
for (int64_t i00 = iw0*ntg[0] + tiitg%ntg[0]; i00 < args.ne00; ) {
|
|
|
|
|
for (int32_t i00 = iw0*ntg[0] + tpitg.x; i00 < args.ne00;) {
|
|
|
|
|
device const T0 * src = (device T0 *)(src0 + i03*args.nb03 + i02*args.nb02 + i01*args.nb01 + i00*args.nb00);
|
|
|
|
|
dst_data[i00] = (T1) src[0];
|
|
|
|
|
break;
|
|
|
|
|
@@ -7376,23 +7384,27 @@ kernel void kernel_cpy_f32_q(
|
|
|
|
|
device const char * src0,
|
|
|
|
|
device char * dst,
|
|
|
|
|
uint3 tgpig[[threadgroup_position_in_grid]],
|
|
|
|
|
ushort tiitg[[thread_index_in_threadgroup]],
|
|
|
|
|
ushort3 tpitg[[thread_position_in_threadgroup]],
|
|
|
|
|
ushort3 ntg[[threads_per_threadgroup]]) {
|
|
|
|
|
const int i03 = tgpig[2];
|
|
|
|
|
const int i02 = tgpig[1];
|
|
|
|
|
const int i01 = ntg[1] == 1 ? tgpig[0]%args.ne01 : tgpig[0]*ntg[1] + tiitg/ntg[0];
|
|
|
|
|
const int iw0 = ntg[1] == 1 ? tgpig[0]/args.ne01 : 0;
|
|
|
|
|
const int32_t i03 = tgpig[2];
|
|
|
|
|
const int32_t i02 = tgpig[1];
|
|
|
|
|
const int32_t i01 = ntg[1] == 1 ? tgpig[0]%args.ne01 : tgpig[0]*ntg[1] + tpitg.y;
|
|
|
|
|
const int32_t iw0 = ntg[1] == 1 ? tgpig[0]/args.ne01 : 0;
|
|
|
|
|
|
|
|
|
|
if (i01 >= args.ne01) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const int64_t n = i03*args.ne02*args.ne01*args.ne00 + i02*args.ne01*args.ne00 + i01*args.ne00;
|
|
|
|
|
|
|
|
|
|
const int64_t i3 = n / (args.ne2*args.ne1*args.ne0);
|
|
|
|
|
const int64_t i2 = (n - i3*args.ne2*args.ne1*args.ne0) / (args.ne1*args.ne0);
|
|
|
|
|
const int64_t i1 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0) / args.ne0;
|
|
|
|
|
const int64_t i0 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0 - i1*args.ne0)/QK;
|
|
|
|
|
const int32_t i3 = n / (args.ne2*args.ne1*args.ne0);
|
|
|
|
|
const int32_t i2 = (n - i3*args.ne2*args.ne1*args.ne0) / (args.ne1*args.ne0);
|
|
|
|
|
const int32_t i1 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0) / args.ne0;
|
|
|
|
|
const int32_t i0 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0 - i1*args.ne0)/QK;
|
|
|
|
|
|
|
|
|
|
device block_q * dst_data = (device block_q *)(dst + i3*args.nb3 + i2*args.nb2 + i1*args.nb1 + i0*args.nb0);
|
|
|
|
|
|
|
|
|
|
for (int64_t i00 = iw0*ntg[0] + tiitg%ntg[0]; i00 < args.nk0; ) {
|
|
|
|
|
for (int32_t i00 = iw0*ntg[0] + tpitg.x; i00 < args.nk0;) {
|
|
|
|
|
device const float * src = (device const float *)(src0 + i03*args.nb03 + i02*args.nb02 + i01*args.nb01 + (i00*QK)*args.nb00);
|
|
|
|
|
|
|
|
|
|
quantize_func(src, dst_data[i00]);
|
|
|
|
|
@@ -7417,24 +7429,28 @@ kernel void kernel_cpy_q_f32(
|
|
|
|
|
device const char * src0,
|
|
|
|
|
device char * dst,
|
|
|
|
|
uint3 tgpig[[threadgroup_position_in_grid]],
|
|
|
|
|
ushort tiitg[[thread_index_in_threadgroup]],
|
|
|
|
|
ushort3 tpitg[[thread_position_in_threadgroup]],
|
|
|
|
|
ushort3 ntg[[threads_per_threadgroup]]) {
|
|
|
|
|
const int i03 = tgpig[2];
|
|
|
|
|
const int i02 = tgpig[1];
|
|
|
|
|
const int i01 = ntg[1] == 1 ? tgpig[0]%args.ne01 : tgpig[0]*ntg[1] + tiitg/ntg[0];
|
|
|
|
|
const int iw0 = ntg[1] == 1 ? tgpig[0]/args.ne01 : 0;
|
|
|
|
|
const int32_t i03 = tgpig[2];
|
|
|
|
|
const int32_t i02 = tgpig[1];
|
|
|
|
|
const int32_t i01 = ntg[1] == 1 ? tgpig[0]%args.ne01 : tgpig[0]*ntg[1] + tpitg.y;
|
|
|
|
|
const int32_t iw0 = ntg[1] == 1 ? tgpig[0]/args.ne01 : 0;
|
|
|
|
|
|
|
|
|
|
if (i01 >= args.ne01) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const int64_t n = i03*args.ne02*args.ne01*args.ne00 + i02*args.ne01*args.ne00 + i01*args.ne00;
|
|
|
|
|
|
|
|
|
|
const int64_t i3 = n/(args.ne2*args.ne1*args.ne0);
|
|
|
|
|
const int64_t i2 = (n - i3*args.ne2*args.ne1*args.ne0)/(args.ne1*args.ne0);
|
|
|
|
|
const int64_t i1 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0)/args.ne0;
|
|
|
|
|
const int64_t i0 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0 - i1*args.ne0);
|
|
|
|
|
const int32_t i3 = n/(args.ne2*args.ne1*args.ne0);
|
|
|
|
|
const int32_t i2 = (n - i3*args.ne2*args.ne1*args.ne0)/(args.ne1*args.ne0);
|
|
|
|
|
const int32_t i1 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0)/args.ne0;
|
|
|
|
|
const int32_t i0 = (n - i3*args.ne2*args.ne1*args.ne0 - i2*args.ne1*args.ne0 - i1*args.ne0);
|
|
|
|
|
|
|
|
|
|
device const block_q * src_data = (device const block_q *)(src0 + i03*args.nb03 + i02*args.nb02 + i01*args.nb01);
|
|
|
|
|
device T4x4 * dst_data = (device T4x4 *)(dst + i3*args.nb3 + i2*args.nb2 + i1*args.nb1 + i0*args.nb0);
|
|
|
|
|
|
|
|
|
|
for (int64_t i00 = iw0*ntg[0] + tiitg%ntg[0]; i00 < args.nk0; ) {
|
|
|
|
|
for (int32_t i00 = iw0*ntg[0] + tpitg.x; i00 < args.nk0;) {
|
|
|
|
|
T4x4 temp;
|
|
|
|
|
dequantize_func(src_data + i00/nl, i00%nl, temp);
|
|
|
|
|
dst_data[i00] = temp;
|
|
|
|
|
|