@@ -2125,6 +2125,34 @@ struct test_get_rows_back : public test_case {
21252125 }
21262126};
21272127
2128+ static void init_set_rows_row_ids (ggml_tensor * t, int num_rows) {
2129+ std::random_device rd;
2130+ std::default_random_engine rng (rd ());
2131+ for (int i2 = 0 ; i2 < t->ne [2 ]; i2++) {
2132+ for (int i1 = 0 ; i1 < t->ne [1 ]; i1++) {
2133+ // generate a shuffled subset of row indices
2134+ std::vector<int64_t > data (num_rows);
2135+ for (int i = 0 ; i < num_rows; i++) {
2136+ data[i] = i;
2137+ }
2138+ std::shuffle (data.begin (), data.end (), rng);
2139+ data.resize (t->ne [0 ]);
2140+
2141+ const size_t offs = i1*t->nb [1 ] + i2*t->nb [2 ];
2142+ if (t->type == GGML_TYPE_I32) {
2143+ // TODO: Make a template or something
2144+ std::vector<int32_t > data_i32 (t->ne [0 ]);
2145+ for (int i = 0 ; i < t->ne [0 ]; i++) {
2146+ data_i32[i] = static_cast <int32_t >(data[i]);
2147+ }
2148+ ggml_backend_tensor_set (t, data_i32.data (), offs, t->ne [0 ]*sizeof (int32_t ));
2149+ } else {
2150+ ggml_backend_tensor_set (t, data.data (), offs, t->ne [0 ]*sizeof (int64_t ));
2151+ }
2152+ }
2153+ }
2154+ }
2155+
21282156// GGML_OP_SET_ROWS
21292157struct test_set_rows : public test_case {
21302158 const ggml_type type;
@@ -2168,37 +2196,13 @@ struct test_set_rows : public test_case {
21682196 }
21692197
21702198 void initialize_tensors (ggml_context * ctx) override {
2171- std::random_device rd;
2172- std::default_random_engine rng (rd ());
21732199 for (ggml_tensor * t = ggml_get_first_tensor (ctx); t != NULL ; t = ggml_get_next_tensor (ctx, t)) {
21742200 if (t->type == GGML_TYPE_I64 || t->type == GGML_TYPE_I32) {
21752201 if (ggml_is_view_op (t->op )) {
21762202 continue ;
21772203 }
21782204
2179- for (int i2 = 0 ; i2 < t->ne [2 ]; i2++) {
2180- for (int i1 = 0 ; i1 < t->ne [1 ]; i1++) {
2181- // generate a shuffled subset of row indices
2182- std::vector<int64_t > data (ne[1 ]);
2183- for (int i = 0 ; i < ne[1 ]; i++) {
2184- data[i] = i;
2185- }
2186- std::shuffle (data.begin (), data.end (), rng);
2187- data.resize (t->ne [0 ]);
2188-
2189- const size_t offs = i1*t->nb [1 ] + i2*t->nb [2 ];
2190- if (t->type == GGML_TYPE_I32) {
2191- // TODO: Make a template or something
2192- std::vector<int32_t > data_i32 (t->ne [0 ]);
2193- for (int i = 0 ; i < t->ne [0 ]; i++) {
2194- data_i32[i] = static_cast <int32_t >(data[i]);
2195- }
2196- ggml_backend_tensor_set (t, data_i32.data (), offs, t->ne [0 ]*sizeof (int32_t ));
2197- } else {
2198- ggml_backend_tensor_set (t, data.data (), offs, t->ne [0 ]*sizeof (int64_t ));
2199- }
2200- }
2201- }
2205+ init_set_rows_row_ids (t, ne[1 ]);
22022206 } else {
22032207 init_tensor_uniform (t);
22042208 }
@@ -2227,6 +2231,67 @@ struct test_set_rows : public test_case {
22272231 }
22282232};
22292233
2234+ // GGML_OP_ROPE + GGML_OP_VIEW + GGML_OP_SET_ROWS
2235+ struct test_rope_set_rows : public test_case {
2236+ const ggml_type type;
2237+ const ggml_type type_idx;
2238+ const std::array<int64_t , 4 > ne;
2239+ int mode;
2240+
2241+ std::string vars () override {
2242+ return VARS_TO_STR4 (type, type_idx, ne, mode);
2243+ }
2244+
2245+ std::string op_desc (ggml_tensor * t) override {
2246+ GGML_UNUSED (t);
2247+ return " ROPE_SET_ROWS" ;
2248+ }
2249+
2250+ bool run_whole_graph () override { return true ; }
2251+
2252+ test_rope_set_rows (ggml_type type,
2253+ ggml_type type_idx,
2254+ std::array<int64_t , 4 > ne,
2255+ int mode)
2256+ : type(type), type_idx(type_idx), ne(ne), mode(mode) {}
2257+
2258+ ggml_tensor * build_graph (ggml_context * ctx) override {
2259+ ggml_tensor * src = ggml_new_tensor_4d (ctx, GGML_TYPE_F32, ne[0 ], ne[1 ], ne[2 ], 1 );
2260+ ggml_set_name (src, " src" );
2261+
2262+ ggml_tensor * pos = ggml_new_tensor_1d (ctx, GGML_TYPE_I32, ne[2 ]);
2263+
2264+ ggml_tensor * rope = ggml_rope (ctx, src, pos, ne[0 ], mode);
2265+
2266+ ggml_tensor * view = ggml_view_2d (ctx, rope, ne[0 ] * ne[1 ], ne[2 ], rope->nb [2 ], 0 );
2267+
2268+ ggml_tensor * dst = ggml_new_tensor_4d (ctx, type, ne[0 ] * ne[1 ], ne[2 ] * ne[3 ], 1 , 1 );
2269+ ggml_set_name (dst, " dst" );
2270+
2271+ ggml_tensor * row_idxs = ggml_new_tensor_3d (ctx, type_idx, ne[2 ], 1 , 1 );
2272+ ggml_set_name (row_idxs, " row_idxs" );
2273+
2274+ ggml_tensor * out = ggml_set_rows (ctx, dst, view, row_idxs);
2275+ ggml_set_name (out, " out" );
2276+
2277+ return out;
2278+ }
2279+
2280+ void initialize_tensors (ggml_context * ctx) override {
2281+ for (ggml_tensor * t = ggml_get_first_tensor (ctx); t != NULL ; t = ggml_get_next_tensor (ctx, t)) {
2282+ if (t->type == GGML_TYPE_I64 || t->type == GGML_TYPE_I32) {
2283+ if (ggml_is_view_op (t->op )) {
2284+ continue ;
2285+ }
2286+
2287+ init_set_rows_row_ids (t, ne[2 ]);
2288+ } else {
2289+ init_tensor_uniform (t);
2290+ }
2291+ }
2292+ }
2293+ };
2294+
22302295// GGML_OP_ARGMAX
22312296struct test_argmax : public test_case {
22322297 const ggml_type type;
@@ -6163,6 +6228,13 @@ static std::vector<std::unique_ptr<test_case>> make_test_cases_eval() {
61636228 }
61646229 }
61656230
6231+ for (int mode : { GGML_ROPE_TYPE_NORMAL, GGML_ROPE_TYPE_NEOX }) {
6232+ for (ggml_type type : {GGML_TYPE_F16, GGML_TYPE_F32}) {
6233+ test_cases.emplace_back (new test_rope_set_rows (type, GGML_TYPE_I64, { 128 , 32 , 1 , 100 }, mode));
6234+ test_cases.emplace_back (new test_rope_set_rows (type, GGML_TYPE_I64, { 128 , 32 , 512 , 1 }, mode));
6235+ }
6236+ }
6237+
61666238 for (ggml_type type_input : {GGML_TYPE_F32}) {
61676239 for (ggml_op_pool pool_type : {GGML_OP_POOL_AVG, GGML_OP_POOL_MAX}) {
61686240 for (int k0 : {1 , 3 }) {
0 commit comments