mirror of
https://github.com/ggml-org/whisper.cpp.git
synced 2026-10-22 03:48:19 +02:00
ggml-vulkan: add SGN operator, auto-generate Vulkan.csv and ops.md (llama/20219)
This commit is contained in:
committed by
Georgi Gerganov
parent
890c047e30
commit
65dbf3c31a
@@ -763,6 +763,7 @@ struct vk_device_struct {
|
|||||||
vk_pipeline pipeline_ceil[2];
|
vk_pipeline pipeline_ceil[2];
|
||||||
vk_pipeline pipeline_floor[2];
|
vk_pipeline pipeline_floor[2];
|
||||||
vk_pipeline pipeline_trunc[2];
|
vk_pipeline pipeline_trunc[2];
|
||||||
|
vk_pipeline pipeline_sgn[2];
|
||||||
|
|
||||||
vk_pipeline pipeline_add1_f16_f16;
|
vk_pipeline pipeline_add1_f16_f16;
|
||||||
vk_pipeline pipeline_add1_f16_f32;
|
vk_pipeline pipeline_add1_f16_f32;
|
||||||
@@ -4393,6 +4394,7 @@ static void ggml_vk_load_shaders(vk_device& device) {
|
|||||||
CREATE_UNARY(ceil)
|
CREATE_UNARY(ceil)
|
||||||
CREATE_UNARY(floor)
|
CREATE_UNARY(floor)
|
||||||
CREATE_UNARY(trunc)
|
CREATE_UNARY(trunc)
|
||||||
|
CREATE_UNARY(sgn)
|
||||||
#undef CREATE_UNARY
|
#undef CREATE_UNARY
|
||||||
|
|
||||||
#define CREATE_UNARY_RTE(name) \
|
#define CREATE_UNARY_RTE(name) \
|
||||||
@@ -9281,6 +9283,8 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const
|
|||||||
return ctx->device->pipeline_floor[dst->type == GGML_TYPE_F16];
|
return ctx->device->pipeline_floor[dst->type == GGML_TYPE_F16];
|
||||||
case GGML_UNARY_OP_TRUNC:
|
case GGML_UNARY_OP_TRUNC:
|
||||||
return ctx->device->pipeline_trunc[dst->type == GGML_TYPE_F16];
|
return ctx->device->pipeline_trunc[dst->type == GGML_TYPE_F16];
|
||||||
|
case GGML_UNARY_OP_SGN:
|
||||||
|
return ctx->device->pipeline_sgn[dst->type == GGML_TYPE_F16];
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -12875,6 +12879,7 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr
|
|||||||
case GGML_UNARY_OP_CEIL:
|
case GGML_UNARY_OP_CEIL:
|
||||||
case GGML_UNARY_OP_FLOOR:
|
case GGML_UNARY_OP_FLOOR:
|
||||||
case GGML_UNARY_OP_TRUNC:
|
case GGML_UNARY_OP_TRUNC:
|
||||||
|
case GGML_UNARY_OP_SGN:
|
||||||
ggml_vk_unary(ctx, compute_ctx, src0, node);
|
ggml_vk_unary(ctx, compute_ctx, src0, node);
|
||||||
break;
|
break;
|
||||||
case GGML_UNARY_OP_XIELU:
|
case GGML_UNARY_OP_XIELU:
|
||||||
@@ -15004,6 +15009,7 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm
|
|||||||
case GGML_UNARY_OP_CEIL:
|
case GGML_UNARY_OP_CEIL:
|
||||||
case GGML_UNARY_OP_FLOOR:
|
case GGML_UNARY_OP_FLOOR:
|
||||||
case GGML_UNARY_OP_TRUNC:
|
case GGML_UNARY_OP_TRUNC:
|
||||||
|
case GGML_UNARY_OP_SGN:
|
||||||
return ggml_is_contiguous(op->src[0]) &&
|
return ggml_is_contiguous(op->src[0]) &&
|
||||||
(op->src[0]->type == GGML_TYPE_F32 || op->src[0]->type == GGML_TYPE_F16) &&
|
(op->src[0]->type == GGML_TYPE_F32 || op->src[0]->type == GGML_TYPE_F16) &&
|
||||||
(op->type == GGML_TYPE_F32 || op->type == GGML_TYPE_F16) &&
|
(op->type == GGML_TYPE_F32 || op->type == GGML_TYPE_F16) &&
|
||||||
@@ -16170,6 +16176,9 @@ static void ggml_vk_check_results_0(ggml_backend_vk_context * ctx, ggml_cgraph *
|
|||||||
case GGML_UNARY_OP_TRUNC:
|
case GGML_UNARY_OP_TRUNC:
|
||||||
tensor_clone = ggml_trunc(ggml_ctx, src_clone[0]);
|
tensor_clone = ggml_trunc(ggml_ctx, src_clone[0]);
|
||||||
break;
|
break;
|
||||||
|
case GGML_UNARY_OP_SGN:
|
||||||
|
tensor_clone = ggml_sgn(ggml_ctx, src_clone[0]);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
std::cerr << "Missing vk_check_results OP: " << ggml_op_name(tensor->op) << std::endl;
|
std::cerr << "Missing vk_check_results OP: " << ggml_op_name(tensor->op) << std::endl;
|
||||||
GGML_ABORT("fatal error");
|
GGML_ABORT("fatal error");
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
#include "generic_head.glsl"
|
||||||
|
#include "types.glsl"
|
||||||
|
|
||||||
|
#extension GL_EXT_control_flow_attributes : enable
|
||||||
|
|
||||||
|
layout(local_size_x = 512, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
|
||||||
|
layout (binding = 0) readonly buffer X {A_TYPE data_a[];};
|
||||||
|
layout (binding = 1) writeonly buffer D {D_TYPE data_d[];};
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
const uint i = gl_GlobalInvocationID.z * 262144 + gl_GlobalInvocationID.y * 512 + gl_GlobalInvocationID.x;
|
||||||
|
|
||||||
|
if (i >= p.KX) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
data_d[i] = D_TYPE(sign(float(data_a[i])));
|
||||||
|
}
|
||||||
@@ -871,6 +871,8 @@ void process_shaders() {
|
|||||||
string_to_spv("elu_f32", "elu.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}});
|
string_to_spv("elu_f32", "elu.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}});
|
||||||
string_to_spv("xielu_f16", "xielu.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}});
|
string_to_spv("xielu_f16", "xielu.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}});
|
||||||
string_to_spv("xielu_f32", "xielu.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}});
|
string_to_spv("xielu_f32", "xielu.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}});
|
||||||
|
string_to_spv("sgn_f16", "sgn.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}});
|
||||||
|
string_to_spv("sgn_f32", "sgn.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}});
|
||||||
|
|
||||||
string_to_spv("tri_f16", "tri.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}});
|
string_to_spv("tri_f16", "tri.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}});
|
||||||
string_to_spv("tri_f32", "tri.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}});
|
string_to_spv("tri_f32", "tri.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}});
|
||||||
|
|||||||
Reference in New Issue
Block a user