From 0b5dc66f54ba1107c3459c841e365f5da0df05c6 Mon Sep 17 00:00:00 2001 From: saharNooby Date: Tue, 18 Apr 2023 20:34:22 +0400 Subject: [PATCH] Add ggml basics test --- CMakeLists.txt | 3 ++ tests/CMakeLists.txt | 6 ++++ tests/test_ggml_basics_work.c | 62 +++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 tests/CMakeLists.txt create mode 100644 tests/test_ggml_basics_work.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 318ffd1..9aa5a75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,3 +244,6 @@ if (BUILD_SHARED_LIBS) set_target_properties(rwkv PROPERTIES POSITION_INDEPENDENT_CODE ON) target_compile_definitions(rwkv PRIVATE RWKV_SHARED RWKV_BUILD) endif() + +enable_testing() +add_subdirectory(tests) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..19a6d76 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,6 @@ +# --- + +set(TEST_TARGET test_ggml_basics_work) +add_executable(${TEST_TARGET} ${TEST_TARGET}.c) +target_link_libraries(${TEST_TARGET} PRIVATE ggml) +add_test(NAME ${TEST_TARGET} COMMAND $) diff --git a/tests/test_ggml_basics_work.c b/tests/test_ggml_basics_work.c new file mode 100644 index 0000000..4604a5b --- /dev/null +++ b/tests/test_ggml_basics_work.c @@ -0,0 +1,62 @@ +// Tests that ggml basics work. + +#include "ggml.h" + +#include +#include +#include + +#define GGML_TEST_SET_ELEMENT_F32(tensor, i, value) ((float *) tensor->data)[i] = value + +#define GGML_TEST_ASSERT(x, ...) {\ + if (!(x)) {\ + fprintf(stderr, "*** Assertion failed ***\n");\ + fprintf(stderr, __VA_ARGS__);\ + fprintf(stderr, "\n%s:%d\n", __FILE__, __LINE__);\ + abort();\ + }\ + } + +#define GGML_TEST_ASSERT_ELEMENT_F32(tensor, i, expected_value) {\ + float actual = ((float *) tensor->data)[i];\ + GGML_TEST_ASSERT(fabsf(actual - expected_value) <= 0.0000001F, "At %s[%d]: expected %f, actual %f", #tensor, i, expected_value, actual);\ + } + +int main(int argc, const char ** argv) { + struct ggml_init_params params = { + .mem_size = 16 * 1024, + .mem_buffer = NULL, + .no_alloc = false, + }; + + struct ggml_context * ctx = ggml_init(params); + + struct ggml_tensor * x = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 4); + GGML_TEST_SET_ELEMENT_F32(x, 0, -10.0F); + GGML_TEST_SET_ELEMENT_F32(x, 1, 0.0F); + GGML_TEST_SET_ELEMENT_F32(x, 2, 2.5F); + GGML_TEST_SET_ELEMENT_F32(x, 3, 5.0F); + + struct ggml_tensor * y = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 4); + GGML_TEST_SET_ELEMENT_F32(y, 0, 1.0F); + GGML_TEST_SET_ELEMENT_F32(y, 1, 2.0F); + GGML_TEST_SET_ELEMENT_F32(y, 2, 3.0F); + GGML_TEST_SET_ELEMENT_F32(y, 3, 4.0F); + + struct ggml_tensor * sum = ggml_add(ctx, x, y); + + struct ggml_cgraph graph = ggml_build_forward(sum); + graph.n_threads = 2; + ggml_graph_compute(ctx, &graph); + + GGML_TEST_ASSERT_ELEMENT_F32(sum, 0, -9.0F); + GGML_TEST_ASSERT_ELEMENT_F32(sum, 1, 2.0F); + GGML_TEST_ASSERT_ELEMENT_F32(sum, 2, 5.5F); + GGML_TEST_ASSERT_ELEMENT_F32(sum, 3, 9.0F); + + ggml_print_objects(ctx); + + ggml_free(ctx); + + return 0; +}