| 66 | } |
| 67 | |
| 68 | bool test_roll(std::array<int64_t, 4> ne, std::array<int, 4> shift, bool permute) { |
| 69 | ggml_time_init(); |
| 70 | |
| 71 | ggml_init_params params { |
| 72 | /*.mem_size =*/ 64 * ggml_tensor_overhead() + ggml_graph_overhead(), |
| 73 | /*.mem_buffer =*/ NULL, |
| 74 | /*.no_alloc =*/ true |
| 75 | }; |
| 76 | |
| 77 | ggml_context_ptr ctx_ptr{ggml_init(params)}; |
| 78 | ggml_context * ctx = ctx_ptr.get(); |
| 79 | ggml_cgraph * gf = ggml_new_graph(ctx); |
| 80 | |
| 81 | // Build graph |
| 82 | ggml_tensor * src = ggml_new_tensor(ctx, GGML_TYPE_F32, 4, ne.data()); |
| 83 | ggml_tensor * res; |
| 84 | if (!permute) { |
| 85 | res = ggml_roll(ctx, src, shift[0], shift[1], shift[2], shift[3]); |
| 86 | } else { |
| 87 | ggml_tensor * p = ggml_permute(ctx, src, 0, 3, 1, 2); |
| 88 | res = ggml_roll(ctx, p, shift[0], shift[2], shift[3], shift[1]); |
| 89 | res = ggml_cont(ctx, ggml_permute(ctx, res, 0, 2, 3, 1)); |
| 90 | } |
| 91 | ggml_build_forward_expand(gf, res); |
| 92 | |
| 93 | // Create backend & allocate buffers |
| 94 | ggml_backend_ptr backend_ptr{ggml_backend_cpu_init()}; |
| 95 | ggml_backend_t backend = backend_ptr.get(); |
| 96 | ggml_backend_cpu_set_n_threads(backend, 2); |
| 97 | ggml_backend_buffer_ptr buffer{ggml_backend_alloc_ctx_tensors(ctx, backend)}; |
| 98 | |
| 99 | std::vector<float> src_values = f32_range(ggml_nelements(src)); |
| 100 | ggml_backend_tensor_set(src, src_values.data(), 0, ggml_nbytes(src)); |
| 101 | |
| 102 | // Execute and compare results |
| 103 | ggml_backend_graph_compute(backend, gf); |
| 104 | |
| 105 | std::vector<float> res_values(ggml_nelements(res)); |
| 106 | ggml_backend_tensor_get(res, res_values.data(), 0, ggml_nbytes(res)); |
| 107 | |
| 108 | std::vector<float> expected = roll_reference(src_values.data(), ne, shift); |
| 109 | |
| 110 | bool passed = check_equal(res_values, expected); |
| 111 | |
| 112 | printf("ggml_roll(%d(%d), %d(%d), %d(%d), %d(%d), %s): %s\n", |
| 113 | int(ne[0]), int(shift[0]), |
| 114 | int(ne[1]), int(shift[1]), |
| 115 | int(ne[2]), int(shift[2]), |
| 116 | int(ne[3]), int(shift[3]), |
| 117 | permute ? "permuted" : "contiguous", |
| 118 | passed ? "\033[32mPASSED\033[0m" : "\033[31mFAILED\033[0m"); |
| 119 | return passed; |
| 120 | } |
| 121 | |
| 122 | int main() { |
| 123 | bool passed = true; |
no test coverage detected