char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Zijun Yuopenvino: OV 2026.2, context-shift, Q5_1 support, gemma4 dense/embedding, and -fa off (#24503)890f1a27e

char/aliceai-t5-moe
3.7 KiB95 linesraw
1#include "../op_table.h"
2#include "../utils.h"
3
4#include <array>
5#include <cstdint>
6#include <openvino/op/constant.hpp>
7#include <openvino/op/gather.hpp>
8#include <openvino/op/pad.hpp>
9#include <openvino/op/reshape.hpp>
10#include <openvino/op/shape_of.hpp>
11#include <vector>
12
13namespace ov {
14namespace frontend {
15namespace ggml {
16namespace op {
17
18namespace {
19
20ov::Output<ov::Node> translate_circular_pad(ov::Output<ov::Node> input,
21                                            const std::array<int32_t, 8> & pads,
22                                            const ov::Shape & input_shape) {
23    ov::Output<ov::Node> result = input;
24
25    const std::array<int32_t, 4> pads_begin = {pads[6], pads[4], pads[2], pads[0]};
26    const std::array<int32_t, 4> pads_end = {pads[7], pads[5], pads[3], pads[1]};
27
28    for (size_t axis = 0; axis < input_shape.size(); ++axis) {
29        const int64_t input_dim = static_cast<int64_t>(input_shape[axis]);
30        const int64_t pad_begin = pads_begin[axis];
31        const int64_t pad_end = pads_end[axis];
32
33        if (pad_begin == 0 && pad_end == 0) {
34            continue;
35        }
36
37        FRONT_END_CHECK_IMPLEMENTED(input_dim > 0, "Circular PAD requires static non-zero input dimensions");
38
39        std::vector<int64_t> indices(static_cast<size_t>(input_dim + pad_begin + pad_end));
40        for (int64_t index = 0; index < static_cast<int64_t>(indices.size()); ++index) {
41            int64_t wrapped = (index - pad_begin) % input_dim;
42            if (wrapped < 0) {
43                wrapped += input_dim;
44            }
45            indices[static_cast<size_t>(index)] = wrapped;
46        }
47
48        auto gather_indices = ov::op::v0::Constant::create(ov::element::i64, {indices.size()}, indices);
49        auto gather_axis = ov::op::v0::Constant::create(ov::element::i64, ov::Shape{}, {axis});
50        result = std::make_shared<ov::op::v8::Gather>(result, gather_indices, gather_axis);
51    }
52
53    return result;
54}
55
56}  // namespace
57
58OutputVector translate_pad(const NodeContext & context) {
59    num_inputs_check(context, 1, 1);
60
61    auto input = process_view_input_new(context, 0);
62    if (context.get_input_shape(0) == context.get_output_shape()) {
63        auto input_shape = std::make_shared<ov::op::v3::ShapeOf>(input);
64        auto res = std::make_shared<ov::op::v1::Reshape>(input, input_shape, false);
65        return rename_outputs_with_suffix({res}, context.get_name());
66    }
67
68    const int32_t * op_params = context.get_output_op_params();
69    FRONT_END_CHECK_IMPLEMENTED(op_params != nullptr, "PAD requires output op params");
70
71    const std::array<int32_t, 8> pads = {op_params[0], op_params[1], op_params[2], op_params[3],
72                                         op_params[4], op_params[5], op_params[6], op_params[7]};
73    const bool circular = op_params[8] != 0;
74
75    if (circular) {
76        auto res = translate_circular_pad(input, pads, context.get_input_shape(0).to_shape());
77        return rename_outputs_with_suffix({res}, context.get_name());
78    }
79
80    const std::vector<int64_t> pads_begin = {pads[6], pads[4], pads[2], pads[0]};
81    const std::vector<int64_t> pads_end = {pads[7], pads[5], pads[3], pads[1]};
82
83    auto pads_begin_node = ov::op::v0::Constant::create(ov::element::i64, {pads_begin.size()}, pads_begin);
84    auto pads_end_node = ov::op::v0::Constant::create(ov::element::i64, {pads_end.size()}, pads_end);
85    auto pad_value = ov::op::v0::Constant::create(context.get_input_type(0), ov::Shape{}, {0});
86    auto res =
87        std::make_shared<ov::op::v1::Pad>(input, pads_begin_node, pads_end_node, pad_value, ov::op::PadMode::CONSTANT);
88
89    return rename_outputs_with_suffix({res}, context.get_name());
90}
91
92}  // namespace op
93}  // namespace ggml
94}  // namespace frontend
95}  // namespace ov