@@ -2105,6 +2105,35 @@ struct test_get_rows_back : public test_case {
21052105 }
21062106};
21072107
2108+ static void init_set_rows_row_ids (ggml_tensor * t, int num_rows)
2109+ {
2110+ std::random_device rd;
2111+ std::default_random_engine rng (rd ());
2112+ for (int i2 = 0 ; i2 < t->ne [2 ]; i2++) {
2113+ for (int i1 = 0 ; i1 < t->ne [1 ]; i1++) {
2114+ // generate a shuffled subset of row indices
2115+ std::vector<int64_t > data (num_rows);
2116+ for (int i = 0 ; i < num_rows; i++) {
2117+ data[i] = i;
2118+ }
2119+ std::shuffle (data.begin (), data.end (), rng);
2120+ data.resize (t->ne [0 ]);
2121+
2122+ const size_t offs = i1*t->nb [1 ] + i2*t->nb [2 ];
2123+ if (t->type == GGML_TYPE_I32) {
2124+ // TODO: Make a template or something
2125+ std::vector<int32_t > data_i32 (t->ne [0 ]);
2126+ for (int i = 0 ; i < t->ne [0 ]; i++) {
2127+ data_i32[i] = static_cast <int32_t >(data[i]);
2128+ }
2129+ ggml_backend_tensor_set (t, data_i32.data (), offs, t->ne [0 ]*sizeof (int32_t ));
2130+ } else {
2131+ ggml_backend_tensor_set (t, data.data (), offs, t->ne [0 ]*sizeof (int64_t ));
2132+ }
2133+ }
2134+ }
2135+ }
2136+
21082137// GGML_OP_SET_ROWS
21092138struct test_set_rows : public test_case {
21102139 const ggml_type type;
@@ -2148,37 +2177,13 @@ struct test_set_rows : public test_case {
21482177 }
21492178
21502179 void initialize_tensors (ggml_context * ctx) override {
2151- std::random_device rd;
2152- std::default_random_engine rng (rd ());
21532180 for (ggml_tensor * t = ggml_get_first_tensor (ctx); t != NULL ; t = ggml_get_next_tensor (ctx, t)) {
21542181 if (t->type == GGML_TYPE_I64 || t->type == GGML_TYPE_I32) {
21552182 if (ggml_is_view_op (t->op )) {
21562183 continue ;
21572184 }
21582185
2159- for (int i2 = 0 ; i2 < t->ne [2 ]; i2++) {
2160- for (int i1 = 0 ; i1 < t->ne [1 ]; i1++) {
2161- // generate a shuffled subset of row indices
2162- std::vector<int64_t > data (ne[1 ]);
2163- for (int i = 0 ; i < ne[1 ]; i++) {
2164- data[i] = i;
2165- }
2166- std::shuffle (data.begin (), data.end (), rng);
2167- data.resize (t->ne [0 ]);
2168-
2169- const size_t offs = i1*t->nb [1 ] + i2*t->nb [2 ];
2170- if (t->type == GGML_TYPE_I32) {
2171- // TODO: Make a template or something
2172- std::vector<int32_t > data_i32 (t->ne [0 ]);
2173- for (int i = 0 ; i < t->ne [0 ]; i++) {
2174- data_i32[i] = static_cast <int32_t >(data[i]);
2175- }
2176- ggml_backend_tensor_set (t, data_i32.data (), offs, t->ne [0 ]*sizeof (int32_t ));
2177- } else {
2178- ggml_backend_tensor_set (t, data.data (), offs, t->ne [0 ]*sizeof (int64_t ));
2179- }
2180- }
2181- }
2186+ init_set_rows_row_ids (t, ne[1 ]);
21822187 } else {
21832188 init_tensor_uniform (t);
21842189 }
@@ -2207,6 +2212,67 @@ struct test_set_rows : public test_case {
22072212 }
22082213};
22092214
2215+ // GGML_OP_ROPE + GGML_OP_VIEW + GGML_OP_SET_ROWS
2216+ struct test_rope_set_rows : public test_case {
2217+ const ggml_type type;
2218+ const ggml_type type_idx;
2219+ const std::array<int64_t , 4 > ne;
2220+ int mode;
2221+
2222+ std::string vars () override {
2223+ return VARS_TO_STR4 (type, type_idx, ne, mode);
2224+ }
2225+
2226+ std::string op_desc (ggml_tensor * t) override {
2227+ GGML_UNUSED (t);
2228+ return " ROPE_SET_ROWS" ;
2229+ }
2230+
2231+ bool run_whole_graph () override { return true ; }
2232+
2233+ test_rope_set_rows (ggml_type type,
2234+ ggml_type type_idx,
2235+ std::array<int64_t , 4 > ne,
2236+ int mode)
2237+ : type(type), type_idx(type_idx), ne(ne), mode(mode) {}
2238+
2239+ ggml_tensor * build_graph (ggml_context * ctx) override {
2240+ ggml_tensor * src = ggml_new_tensor_4d (ctx, GGML_TYPE_F32, ne[0 ], ne[1 ], ne[2 ], 1 );
2241+ ggml_set_name (src, " src" );
2242+
2243+ ggml_tensor * pos = ggml_new_tensor_1d (ctx, GGML_TYPE_I32, ne[2 ]);
2244+
2245+ ggml_tensor * rope = ggml_rope (ctx, src, pos, ne[0 ], mode);
2246+
2247+ ggml_tensor * view = ggml_view_2d (ctx, rope, ne[0 ] * ne[1 ], ne[2 ], rope->nb [2 ], 0 );
2248+
2249+ ggml_tensor * dst = ggml_new_tensor_4d (ctx, type, ne[0 ] * ne[1 ], ne[2 ] * ne[3 ], 1 , 1 );
2250+ ggml_set_name (dst, " dst" );
2251+
2252+ ggml_tensor * row_idxs = ggml_new_tensor_3d (ctx, type_idx, ne[2 ], 1 , 1 );
2253+ ggml_set_name (row_idxs, " row_idxs" );
2254+
2255+ ggml_tensor * out = ggml_set_rows (ctx, dst, view, row_idxs);
2256+ ggml_set_name (out, " out" );
2257+
2258+ return out;
2259+ }
2260+
2261+ void initialize_tensors (ggml_context * ctx) override {
2262+ for (ggml_tensor * t = ggml_get_first_tensor (ctx); t != NULL ; t = ggml_get_next_tensor (ctx, t)) {
2263+ if (t->type == GGML_TYPE_I64 || t->type == GGML_TYPE_I32) {
2264+ if (ggml_is_view_op (t->op )) {
2265+ continue ;
2266+ }
2267+
2268+ init_set_rows_row_ids (t, ne[2 ]);
2269+ } else {
2270+ init_tensor_uniform (t);
2271+ }
2272+ }
2273+ }
2274+ };
2275+
22102276// GGML_OP_ARGMAX
22112277struct test_argmax : public test_case {
22122278 const ggml_type type;
@@ -6008,6 +6074,13 @@ static std::vector<std::unique_ptr<test_case>> make_test_cases_eval() {
60086074 }
60096075 }
60106076
6077+ for (int mode : { GGML_ROPE_TYPE_NORMAL, GGML_ROPE_TYPE_NEOX }) {
6078+ for (ggml_type type : {GGML_TYPE_F16, GGML_TYPE_F32}) {
6079+ test_cases.emplace_back (new test_rope_set_rows (type, GGML_TYPE_I64, { 128 , 32 , 1 , 100 }, mode));
6080+ test_cases.emplace_back (new test_rope_set_rows (type, GGML_TYPE_I64, { 128 , 32 , 512 , 1 }, mode));
6081+ }
6082+ }
6083+
60116084 for (ggml_type type_input : {GGML_TYPE_F32}) {
60126085 for (ggml_op_pool pool_type : {GGML_OP_POOL_AVG, GGML_OP_POOL_MAX}) {
60136086 for (int k0 : {1 , 3 }) {
0 commit comments