#include #include #include #include #include #include #include static bool is_pow2(size_t x) { return (x & (x - 1)) == 0; } static void test_buffer(ggml_backend_t backend, ggml_backend_buffer_type_t buft) { GGML_ASSERT(ggml_backend_get_default_buffer_type(backend) == buft); GGML_ASSERT(ggml_backend_buft_supports_backend(buft, backend)); //ggml_backend_buffer_t buffer = ggml_backend_alloc_buffer(backend, 1024); ggml_backend_buffer_t buffer = ggml_backend_buft_alloc_buffer(buft, 1024); GGML_ASSERT(buffer != NULL); GGML_ASSERT(is_pow2(ggml_backend_buffer_get_alignment(buffer))); GGML_ASSERT(ggml_backend_buffer_get_base(buffer) != NULL); GGML_ASSERT(ggml_backend_buffer_get_size(buffer) >= 1024); struct ggml_init_params params = { /* .mem_size = */ 1024, /* .mem_base = */ NULL, /* .no_alloc = */ true, }; struct ggml_context * ctx = ggml_init(params); static const size_t n = 10; struct ggml_tensor * tensor = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, n); GGML_ASSERT(ggml_backend_buffer_get_alloc_size(buffer, tensor) >= n * sizeof(float)); ggml_tallocr_t allocr = ggml_tallocr_new_from_buffer(buffer); ggml_tallocr_alloc(allocr, tensor); GGML_ASSERT(tensor->data != NULL); GGML_ASSERT(tensor->data >= ggml_backend_buffer_get_base(buffer)); float data[n]; for (size_t i = 0; i < n; i++) { data[i] = (float) i; } ggml_backend_tensor_set(tensor, data, 0, sizeof(data)); float data2[n]; ggml_backend_tensor_get(tensor, data2, 0, sizeof(data2)); GGML_ASSERT(memcmp(data, data2, sizeof(data)) == 0); ggml_tallocr_free(allocr); ggml_backend_buffer_free(buffer); ggml_free(ctx); } int main() { // enumerate backends printf("Testing %zu backends\n\n", ggml_backend_reg_get_count()); for (size_t i = 0; i < ggml_backend_reg_get_count(); i++) { printf("Backend %zu/%zu (%s)\n", i + 1, ggml_backend_reg_get_count(), ggml_backend_reg_get_name(i)); ggml_backend_t backend = ggml_backend_reg_init_backend(i, NULL); GGML_ASSERT(backend != NULL); printf(" Backend name: %s\n", ggml_backend_name(backend)); test_buffer(backend, ggml_backend_reg_get_default_buffer_type(i)); ggml_backend_free(backend); printf(" OK\n\n"); } }