@@ -961,6 +961,7 @@ struct vk_device_struct {
961961 vk_pipeline pipeline_col2im_1d_f32;
962962 vk_pipeline pipeline_col2im_1d_f16;
963963 vk_pipeline pipeline_col2im_1d_bf16;
964+ vk_pipeline pipeline_out_prod_f32;
964965 vk_pipeline pipeline_snake_f32;
965966 vk_pipeline pipeline_snake_f16;
966967 vk_pipeline pipeline_snake_bf16;
@@ -5479,6 +5480,8 @@ static void ggml_vk_load_shaders(vk_device& device, vk_pipeline requested) {
54795480 ggml_vk_create_pipeline(device, device->pipeline_col2im_1d_f16, "col2im_1d_f16", col2im_1d_f16_len, col2im_1d_f16_data, "main", 2, sizeof(vk_op_col2im_1d_push_constants), {256, 1, 1}, {}, 1, true);
54805481 ggml_vk_create_pipeline(device, device->pipeline_col2im_1d_bf16, "col2im_1d_bf16", col2im_1d_bf16_len, col2im_1d_bf16_data, "main", 2, sizeof(vk_op_col2im_1d_push_constants), {256, 1, 1}, {}, 1, true);
54815482
5483+ ggml_vk_create_pipeline(device, device->pipeline_out_prod_f32, "out_prod_f32", out_prod_f32_len, out_prod_f32_data, "main", 3, sizeof(vk_op_binary_push_constants), {256, 1, 1}, {}, 1);
5484+
54825485 ggml_vk_create_pipeline(device, device->pipeline_snake_f32, "snake_f32", snake_f32_len, snake_f32_data, "main", 4, sizeof(vk_op_snake_push_constants), {256, 1, 1}, {}, 1);
54835486 ggml_vk_create_pipeline(device, device->pipeline_snake_f16, "snake_f16", snake_f16_len, snake_f16_data, "main", 4, sizeof(vk_op_snake_push_constants), {256, 1, 1}, {}, 1);
54845487 ggml_vk_create_pipeline(device, device->pipeline_snake_bf16, "snake_bf16", snake_bf16_len, snake_bf16_data, "main", 4, sizeof(vk_op_snake_push_constants), {256, 1, 1}, {}, 1);
@@ -10745,6 +10748,11 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const
1074510748 return ctx->device->pipeline_add_id_f32;
1074610749 }
1074710750 return nullptr;
10751+ case GGML_OP_OUT_PROD:
10752+ if (src0->type == GGML_TYPE_F32 && src1->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32) {
10753+ return ctx->device->pipeline_out_prod_f32;
10754+ }
10755+ return nullptr;
1074810756 case GGML_OP_CONCAT: {
1074910757 if (src0->type != src1->type || src0->type != dst->type) {
1075010758 return nullptr;
@@ -11701,6 +11709,7 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co
1170111709 case GGML_OP_DIV:
1170211710 case GGML_OP_MUL:
1170311711 case GGML_OP_ADD1:
11712+ case GGML_OP_OUT_PROD:
1170411713 case GGML_OP_ARANGE:
1170511714 case GGML_OP_FILL:
1170611715 case GGML_OP_SCALE:
@@ -12014,6 +12023,24 @@ static void ggml_vk_add(ggml_backend_vk_context * ctx, vk_context& subctx, const
1201412023 });
1201512024}
1201612025
12026+ static void ggml_vk_out_prod(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
12027+ const uint32_t src0_type_size = ggml_type_size(src0->type);
12028+ const uint32_t src1_type_size = ggml_type_size(src1->type);
12029+ const uint32_t dst_type_size = ggml_type_size(dst->type);
12030+
12031+ ggml_vk_op_f32<vk_op_binary_push_constants>(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_OUT_PROD, {
12032+ (uint32_t)ggml_nelements(dst),
12033+ (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3],
12034+ (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)src0->nb[1] / src0_type_size, (uint32_t)src0->nb[2] / src0_type_size, (uint32_t)src0->nb[3] / src0_type_size,
12035+ (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3],
12036+ (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size,
12037+ (uint32_t) dst->ne[0], (uint32_t) dst->ne[1], (uint32_t) dst->ne[2],(uint32_t) dst->ne[3],
12038+ (uint32_t) dst->nb[0] / dst_type_size, (uint32_t) dst->nb[1] / dst_type_size, (uint32_t) dst->nb[2] / dst_type_size, (uint32_t) dst->nb[3] / dst_type_size,
12039+ 0,
12040+ 0.0f, 0.0f, 0,
12041+ });
12042+ }
12043+
1201712044static void ggml_vk_sub(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) {
1201812045 const uint32_t src0_type_size = ggml_type_size(src0->type);
1201912046 const uint32_t src1_type_size = ggml_type_size(src1->type);
@@ -14801,6 +14828,9 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr
1480114828 ggml_vk_add(ctx, compute_ctx, src0, src1, node);
1480214829 }
1480314830 break;
14831+ case GGML_OP_OUT_PROD:
14832+ ggml_vk_out_prod(ctx, compute_ctx, src0, src1, node);
14833+ break;
1480414834 case GGML_OP_SUB:
1480514835 ggml_vk_sub(ctx, compute_ctx, src0, src1, node);
1480614836
@@ -17655,6 +17685,10 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm
1765517685 case GGML_OP_OPT_STEP_ADAMW:
1765617686 case GGML_OP_OPT_STEP_SGD:
1765717687 return ggml_is_contiguous(op->src[0]) && op->src[0]->type == GGML_TYPE_F32;
17688+ case GGML_OP_OUT_PROD:
17689+ return ggml_is_contiguous(op->src[0]) && op->src[0]->type == GGML_TYPE_F32
17690+ && ggml_is_contiguous(op->src[1]) && op->src[1]->type == GGML_TYPE_F32
17691+ && op->type == GGML_TYPE_F32;
1765817692 case GGML_OP_LOG:
1765917693 case GGML_OP_TRI:
1766017694 case GGML_OP_DIAG:
0 commit comments