|
|
|
@@ -1347,7 +1347,6 @@ struct vk_mat_mat_id_push_constants {
|
|
|
|
|
uint32_t stride_a; uint32_t stride_b; uint32_t stride_d;
|
|
|
|
|
uint32_t batch_stride_a; uint32_t batch_stride_b; uint32_t batch_stride_d;
|
|
|
|
|
uint32_t nei0; uint32_t nei1; uint32_t nbi1; uint32_t ne11;
|
|
|
|
|
uint32_t padded_N;
|
|
|
|
|
uint32_t n_experts;
|
|
|
|
|
uint32_t hoist_row_ids;
|
|
|
|
|
};
|
|
|
|
@@ -2403,9 +2402,8 @@ struct ggml_backend_vk_context {
|
|
|
|
|
// Cache most recent tensor that was converted into prealloc_y, and what pipeline it used to convert.
|
|
|
|
|
vk_pipeline_struct * prealloc_y_last_pipeline_used {};
|
|
|
|
|
const ggml_tensor * prealloc_y_last_tensor_used {};
|
|
|
|
|
// True when prealloc_y holds the padded fp16 layout used by the coopmat2 B decode-vector callback.
|
|
|
|
|
// If false, then it's contiguous.
|
|
|
|
|
bool prealloc_y_last_decode_vector_staging {};
|
|
|
|
|
// True when the K dimension in prealloc_y is padded.
|
|
|
|
|
bool prealloc_y_last_k_padded {};
|
|
|
|
|
|
|
|
|
|
// Track which nodes have been used since the last sync, and whether they were written to
|
|
|
|
|
std::vector<const ggml_tensor *> unsynced_nodes_written;
|
|
|
|
@@ -8984,13 +8982,13 @@ static void ggml_vk_matmul_id(
|
|
|
|
|
uint32_t m, uint32_t n, uint32_t k, uint32_t stride_a, uint32_t stride_b, uint32_t stride_d,
|
|
|
|
|
uint32_t batch_stride_a, uint32_t batch_stride_b, uint32_t batch_stride_d,
|
|
|
|
|
uint32_t n_as, uint32_t nei0, uint32_t nei1, uint32_t nbi1, uint32_t ne11,
|
|
|
|
|
uint32_t padded_n, bool hoist_row_ids) {
|
|
|
|
|
bool hoist_row_ids) {
|
|
|
|
|
VK_LOG_DEBUG("ggml_vk_matmul_id(a: (" << a.buffer->buffer << ", " << a.offset << ", " << a.size << "), b: (" << b.buffer->buffer << ", " << b.offset << ", " << b.size << "), d: (" << d.buffer->buffer << ", " << d.offset << ", " << d.size << "), ids: (" << ids.buffer->buffer << ", " << ids.offset << ", " << ids.size << "), expert_count: (" << expert_count_buf.buffer->buffer << ", " << expert_count_buf.offset << ", " << expert_count_buf.size << "), " <<
|
|
|
|
|
"m: " << m << ", n: " << n << ", k: " << k << ", stride_a: " << stride_a << ", stride_b: " << stride_b << ", stride_d: " << stride_d << ", " <<
|
|
|
|
|
"batch_stride_a: " << batch_stride_a << ", batch_stride_b: " << batch_stride_b << ", batch_stride_d: " << batch_stride_d << ", " <<
|
|
|
|
|
"n_as: " << n_as << ", nei0: " << nei0 << ", nei1: " << nei1 << ", nbi1: " << nbi1 << ", ne11: " << ne11 << ")");
|
|
|
|
|
const vk_mat_mat_id_push_constants pc = { m, n, k, stride_a, stride_b, stride_d, batch_stride_a, batch_stride_b, batch_stride_d,
|
|
|
|
|
nei0, nei1, nbi1, ne11, padded_n, n_as, uint32_t(hoist_row_ids) };
|
|
|
|
|
nei0, nei1, nbi1, ne11, n_as, uint32_t(hoist_row_ids) };
|
|
|
|
|
ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { a, b, d, ids, expert_count_buf }, pc, { m, nei1, n_as });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -9455,27 +9453,27 @@ static void ggml_vk_mul_mat_q_f16(ggml_backend_vk_context * ctx, vk_context& sub
|
|
|
|
|
if (y_non_contig) {
|
|
|
|
|
if (ctx->prealloc_y_last_pipeline_used != to_fp16_vk_1.get() ||
|
|
|
|
|
ctx->prealloc_y_last_tensor_used != src1 ||
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging) {
|
|
|
|
|
ctx->prealloc_y_last_k_padded) {
|
|
|
|
|
if (ctx->prealloc_y_need_sync) {
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
}
|
|
|
|
|
ggml_vk_cpy_to_contiguous(ctx, subctx, to_fp16_vk_1, src1, ggml_vk_subbuffer(ctx, d_Qy, qy_buf_offset), ggml_vk_subbuffer(ctx, d_Y, 0));
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = to_fp16_vk_1.get();
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = src1;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (quantize_y) {
|
|
|
|
|
if (ctx->prealloc_y_last_pipeline_used != to_q8_1.get() ||
|
|
|
|
|
ctx->prealloc_y_last_tensor_used != src1 ||
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging) {
|
|
|
|
|
ctx->prealloc_y_last_k_padded) {
|
|
|
|
|
if (ctx->prealloc_y_need_sync) {
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
}
|
|
|
|
|
ggml_vk_quantize_q8_1(ctx, subctx, ggml_vk_subbuffer(ctx, d_Qy, qy_buf_offset), ggml_vk_subbuffer(ctx, d_Y, 0), y_ne);
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = to_q8_1.get();
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = src1;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -9734,27 +9732,27 @@ static void ggml_vk_mul_mat_vec_q_f16(ggml_backend_vk_context * ctx, vk_context&
|
|
|
|
|
GGML_ASSERT(y_sz == ggml_type_size(src1->type) * y_ne);
|
|
|
|
|
if (ctx->prealloc_y_last_pipeline_used != to_fp16_vk_1.get() ||
|
|
|
|
|
ctx->prealloc_y_last_tensor_used != src1 ||
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging) {
|
|
|
|
|
ctx->prealloc_y_last_k_padded) {
|
|
|
|
|
if (ctx->prealloc_y_need_sync) {
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
}
|
|
|
|
|
ggml_vk_cpy_to_contiguous(ctx, subctx, to_fp16_vk_1, src1, d_Qy, d_Y);
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = to_fp16_vk_1.get();
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = src1;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (quantize_y) {
|
|
|
|
|
if (ctx->prealloc_y_last_pipeline_used != to_q8_1.get() ||
|
|
|
|
|
ctx->prealloc_y_last_tensor_used != src1 ||
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging) {
|
|
|
|
|
ctx->prealloc_y_last_k_padded) {
|
|
|
|
|
if (ctx->prealloc_y_need_sync) {
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
}
|
|
|
|
|
ggml_vk_quantize_q8_1(ctx, subctx, d_Qy, d_Y, y_ne);
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = to_q8_1.get();
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = src1;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -10234,8 +10232,6 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context&
|
|
|
|
|
(src0->type == GGML_TYPE_BF16 && src1->type != GGML_TYPE_BF16) ||
|
|
|
|
|
!ggml_vk_dim01_contiguous(src1);
|
|
|
|
|
|
|
|
|
|
const uint32_t y_staged_row_stride = y_decode_vector_staging ? (uint32_t)ggml_vk_align_size(ne10, 4) : (uint32_t)ne10;
|
|
|
|
|
|
|
|
|
|
const bool y_f32_kernel = src1->type == GGML_TYPE_F32 && !y_non_contig;
|
|
|
|
|
|
|
|
|
|
bool quantize_y = ctx->device->integer_dot_product && src1->type == GGML_TYPE_F32 && ggml_is_contiguous(src1) && !y_non_contig && (ne11 * ne10) % 4 == 0;
|
|
|
|
@@ -10250,19 +10246,25 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context&
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const bool qx_needs_dequant = mmp == nullptr || x_non_contig;
|
|
|
|
|
const bool qy_needs_dequant = !quantize_y && ((src1->type != f16_type && !y_f32_kernel) || y_non_contig);
|
|
|
|
|
bool qy_needs_dequant = !quantize_y && ((src1->type != f16_type && !y_f32_kernel) || y_non_contig);
|
|
|
|
|
|
|
|
|
|
if (qx_needs_dequant) {
|
|
|
|
|
// Fall back to dequant + f16 mulmat
|
|
|
|
|
mmp = ggml_vk_get_mul_mat_mat_id_pipeline(ctx, f16_type, y_f32_kernel ? GGML_TYPE_F32 : f16_type, (ggml_prec)dst->op_params[0]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Not implemented
|
|
|
|
|
GGML_ASSERT(y_non_contig || !qy_needs_dequant); // NOLINT
|
|
|
|
|
|
|
|
|
|
const ggml_type effective_src1_type = quantize_y ? GGML_TYPE_Q8_1 : (y_f32_kernel ? GGML_TYPE_F32 : src1->type);
|
|
|
|
|
|
|
|
|
|
const uint32_t kpad = quantize_y ? 0 : ggml_vk_align_size(ne10, ggml_vk_guess_matmul_id_pipeline_align(ctx, mmp, ne01, nei1, qx_needs_dequant ? f16_type : src0->type, effective_src1_type));
|
|
|
|
|
// Coopmat2 MUL_MAT_ID BK specialization constants in ggml_vk_load_shaders are at most 64.
|
|
|
|
|
const uint32_t y_staged_row_stride = ctx->device->coopmat2 && !quantize_y ? ggml_vk_align_size(ne10, 64) : ne10;
|
|
|
|
|
const bool y_needs_k_padding = ne10 != y_staged_row_stride;
|
|
|
|
|
const bool y_needs_reformat = y_non_contig || y_needs_k_padding;
|
|
|
|
|
qy_needs_dequant = qy_needs_dequant || y_needs_k_padding;
|
|
|
|
|
|
|
|
|
|
// Not implemented
|
|
|
|
|
GGML_ASSERT(y_needs_reformat || !qy_needs_dequant); // NOLINT
|
|
|
|
|
|
|
|
|
|
const bool aligned = !quantize_y && ne10 == kpad && ne01 > 8 && nei1 > 8;
|
|
|
|
|
|
|
|
|
|
vk_pipeline pipeline = ggml_vk_guess_matmul_id_pipeline(ctx, mmp, ne01, nei1, aligned, qx_needs_dequant ? f16_type : src0->type, effective_src1_type);
|
|
|
|
@@ -10270,10 +10272,8 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context&
|
|
|
|
|
if (ggml_nbytes(src0) > ctx->device->properties.limits.maxStorageBufferRange) {
|
|
|
|
|
pipeline = ggml_vk_get_64b_indexing_pipeline(ctx, pipeline);
|
|
|
|
|
}
|
|
|
|
|
// Reserve extra storage in the N dimension for the Y matrix, so we can avoid bounds-checking
|
|
|
|
|
uint32_t padded_n = qy_needs_dequant ? ROUNDUP_POW2(ne11, pipeline->wg_denoms[1]) :ne11;
|
|
|
|
|
const uint64_t x_ne = ggml_nelements(src0);
|
|
|
|
|
const uint64_t y_ne = (uint64_t)y_staged_row_stride * padded_n * ne12 * ne13;
|
|
|
|
|
const uint64_t y_ne = (uint64_t)y_staged_row_stride * ne11 * ne12 * ne13;
|
|
|
|
|
const uint64_t d_ne = ggml_nelements(dst);
|
|
|
|
|
|
|
|
|
|
const uint64_t qx_sz = ggml_type_size(src0->type) * x_ne / ggml_blck_size(src0->type);
|
|
|
|
@@ -10292,7 +10292,7 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context&
|
|
|
|
|
y_staged_dst.type = f16_type;
|
|
|
|
|
y_staged_dst.nb[0] = ggml_type_size(f16_type);
|
|
|
|
|
y_staged_dst.nb[1] = y_staged_dst.nb[0] * y_staged_row_stride;
|
|
|
|
|
y_staged_dst.nb[2] = y_staged_dst.nb[1] * padded_n;
|
|
|
|
|
y_staged_dst.nb[2] = y_staged_dst.nb[1] * ne11;
|
|
|
|
|
y_staged_dst.nb[3] = y_staged_dst.nb[2] * y_staged_dst.ne[2];
|
|
|
|
|
return y_staged_dst;
|
|
|
|
|
};
|
|
|
|
@@ -10302,10 +10302,10 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context&
|
|
|
|
|
} else {
|
|
|
|
|
to_fp16_vk_0 = ggml_vk_get_to_fp16(ctx, src0->type);
|
|
|
|
|
}
|
|
|
|
|
if (y_non_contig) {
|
|
|
|
|
if (y_needs_reformat) {
|
|
|
|
|
ggml_tensor y_staged_dst;
|
|
|
|
|
const ggml_tensor * y_staged_dst_ptr = nullptr;
|
|
|
|
|
if (y_decode_vector_staging) {
|
|
|
|
|
if (y_needs_k_padding) {
|
|
|
|
|
y_staged_dst = make_y_staged_dst();
|
|
|
|
|
y_staged_dst_ptr = &y_staged_dst;
|
|
|
|
|
}
|
|
|
|
@@ -10432,14 +10432,18 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context&
|
|
|
|
|
ggml_vk_dispatch_pipeline(ctx, subctx, to_fp16_vk_0,
|
|
|
|
|
{ vk_subbuffer{ d_Qx, qx_buf_offset, qx_sz }, vk_subbuffer{ d_X, 0, x_sz } }, pc, { (uint32_t)x_ne, 1, 1});
|
|
|
|
|
}
|
|
|
|
|
if (y_non_contig) {
|
|
|
|
|
if (y_needs_reformat) {
|
|
|
|
|
if (ctx->prealloc_y_last_pipeline_used != to_fp16_vk_1.get() ||
|
|
|
|
|
ctx->prealloc_y_last_tensor_used != src1 ||
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging != y_decode_vector_staging) {
|
|
|
|
|
ctx->prealloc_y_last_k_padded != y_needs_k_padding) {
|
|
|
|
|
if (ctx->prealloc_y_need_sync) {
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
}
|
|
|
|
|
if (y_decode_vector_staging) {
|
|
|
|
|
if (y_needs_k_padding) {
|
|
|
|
|
GGML_ASSERT(y_sz % 4 == 0);
|
|
|
|
|
// Zero B padding because clamping only A can produce 0 * Inf or NaN.
|
|
|
|
|
subctx->s->buffer->buf.fillBuffer(d_Y->buffer, 0, y_sz, 0);
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
const ggml_tensor y_staged_dst = make_y_staged_dst();
|
|
|
|
|
const uint32_t y_staged_dst_type_size = ggml_type_size(y_staged_dst.type);
|
|
|
|
|
ggml_vk_cpy_to_strided(
|
|
|
|
@@ -10454,27 +10458,27 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context&
|
|
|
|
|
}
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = to_fp16_vk_1.get();
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = src1;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = y_decode_vector_staging;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = y_needs_k_padding;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (quantize_y) {
|
|
|
|
|
if (ctx->prealloc_y_last_pipeline_used != to_q8_1.get() ||
|
|
|
|
|
ctx->prealloc_y_last_tensor_used != src1 ||
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging) {
|
|
|
|
|
ctx->prealloc_y_last_k_padded) {
|
|
|
|
|
if (ctx->prealloc_y_need_sync) {
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
}
|
|
|
|
|
ggml_vk_quantize_q8_1(ctx, subctx, ggml_vk_subbuffer(ctx, d_Qy, qy_buf_offset), ggml_vk_subbuffer(ctx, d_Y, 0), y_ne);
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = to_q8_1.get();
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = src1;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
|
|
|
|
|
uint32_t stride_batch_x = ne00*ne01;
|
|
|
|
|
uint32_t stride_b_y = y_decode_vector_staging ? y_staged_row_stride : ne10;
|
|
|
|
|
uint32_t stride_batch_y = y_decode_vector_staging ? y_staged_row_stride * padded_n : ne10*ne11;
|
|
|
|
|
uint32_t stride_b_y = y_needs_k_padding ? y_staged_row_stride : ne10;
|
|
|
|
|
uint32_t stride_batch_y = y_needs_k_padding ? y_staged_row_stride * ne11 : ne10*ne11;
|
|
|
|
|
|
|
|
|
|
if (!ggml_vk_dim01_contiguous(src0) && !qx_needs_dequant) {
|
|
|
|
|
stride_batch_x = src0->nb[0] / ggml_type_size(src0->type);
|
|
|
|
@@ -10491,13 +10495,13 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context&
|
|
|
|
|
{ d_D, d_buf_offset, d_sz }, { d_ids, ids_buf_offset, ids_sz }, expert_count_buf,
|
|
|
|
|
ne01, ne21, ne10, ne10, stride_b_y, ne01,
|
|
|
|
|
stride_batch_x, stride_batch_y, ne20*ne21,
|
|
|
|
|
n_as, nei0, nei1, nbi1 / ggml_type_size(ids->type), ne11, padded_n, hoist_row_ids
|
|
|
|
|
n_as, nei0, nei1, nbi1 / ggml_type_size(ids->type), ne11, hoist_row_ids
|
|
|
|
|
); // NOLINT
|
|
|
|
|
|
|
|
|
|
if (x_non_contig || qx_needs_dequant) {
|
|
|
|
|
ctx->prealloc_x_need_sync = true;
|
|
|
|
|
}
|
|
|
|
|
if (y_non_contig || quantize_y) {
|
|
|
|
|
if (y_needs_reformat || quantize_y) {
|
|
|
|
|
ctx->prealloc_y_need_sync = true;
|
|
|
|
|
}
|
|
|
|
|
ctx->prealloc_split_k_need_sync = true;
|
|
|
|
@@ -10648,27 +10652,27 @@ static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_conte
|
|
|
|
|
GGML_ASSERT(y_sz == ggml_type_size(src1->type) * y_ne);
|
|
|
|
|
if (ctx->prealloc_y_last_pipeline_used != to_fp16_vk_1.get() ||
|
|
|
|
|
ctx->prealloc_y_last_tensor_used != src1 ||
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging) {
|
|
|
|
|
ctx->prealloc_y_last_k_padded) {
|
|
|
|
|
if (ctx->prealloc_y_need_sync) {
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
}
|
|
|
|
|
ggml_vk_cpy_to_contiguous(ctx, subctx, to_fp16_vk_1, src1, d_Qy, d_Y);
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = to_fp16_vk_1.get();
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = src1;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (quantize_y) {
|
|
|
|
|
if (ctx->prealloc_y_last_pipeline_used != to_q8_1.get() ||
|
|
|
|
|
ctx->prealloc_y_last_tensor_used != src1 ||
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging) {
|
|
|
|
|
ctx->prealloc_y_last_k_padded) {
|
|
|
|
|
if (ctx->prealloc_y_need_sync) {
|
|
|
|
|
ggml_vk_sync_buffers(ctx, subctx);
|
|
|
|
|
}
|
|
|
|
|
ggml_vk_quantize_q8_1(ctx, subctx, d_Qy, d_Y, y_ne);
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = to_q8_1.get();
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = src1;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -15520,7 +15524,7 @@ static void ggml_vk_preallocate_buffers(ggml_backend_vk_context * ctx, vk_contex
|
|
|
|
|
ctx->prealloc_y = ggml_vk_create_buffer_device(ctx->device, ctx->prealloc_size_y);
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = nullptr;
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = nullptr;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
}
|
|
|
|
|
if (ctx->prealloc_split_k == nullptr || (ctx->prealloc_size_split_k > 0 && ctx->prealloc_split_k->size < ctx->prealloc_size_split_k)) {
|
|
|
|
|
VK_LOG_MEMORY("ggml_vk_preallocate_buffers(split_k_size: " << ctx->prealloc_size_split_k << ")");
|
|
|
|
@@ -16145,7 +16149,7 @@ static void ggml_vk_graph_cleanup(ggml_backend_vk_context * ctx) {
|
|
|
|
|
VK_LOG_DEBUG("ggml_vk_graph_cleanup()");
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = {};
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = nullptr;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
|
|
|
|
|
ctx->unsynced_nodes_written.clear();
|
|
|
|
|
ctx->unsynced_nodes_read.clear();
|
|
|
|
@@ -16197,7 +16201,7 @@ static void ggml_vk_cleanup(ggml_backend_vk_context * ctx) {
|
|
|
|
|
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = nullptr;
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = nullptr;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
|
|
|
|
|
ctx->prealloc_size_x = 0;
|
|
|
|
|
ctx->prealloc_size_y = 0;
|
|
|
|
@@ -17395,7 +17399,7 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg
|
|
|
|
|
|
|
|
|
|
ctx->prealloc_y_last_pipeline_used = nullptr;
|
|
|
|
|
ctx->prealloc_y_last_tensor_used = nullptr;
|
|
|
|
|
ctx->prealloc_y_last_decode_vector_staging = false;
|
|
|
|
|
ctx->prealloc_y_last_k_padded = false;
|
|
|
|
|
|
|
|
|
|
if (ctx->prealloc_size_add_rms_partials) {
|
|
|
|
|
ggml_vk_preallocate_buffers(ctx, nullptr);
|
|
|
|
|