Skip to content

Commit e2486eb

Browse files
Upgrade init_tensor API to return a ggml_status
To prepare for an 'abort-free' ggml (ggml not to abort on ooms but return a oom status), as agreeed with Diego in the ggml repo, upgrade the init_tensor() and view_init() APIs to return a ggml_status.
1 parent 63ac128 commit e2486eb

File tree

16 files changed

+90
-35
lines changed

16 files changed

+90
-35
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ lcov-report/
4545
tags
4646
.build/
4747
build*
48+
release
49+
debug
4850
!build-info.cmake
4951
!build-info.cpp.in
5052
!build-info.sh

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
3838
_(NOTE: this guideline is yet to be applied to the `llama.cpp` codebase. New code should follow this guideline.)_
3939
40-
- Try to follow the existing patterns in the code (indentation, spaces, etc.). In case of doubt use `clang-format` to format the added code
40+
- Try to follow the existing patterns in the code (indentation, spaces, etc.). In case of doubt use `clang-format` (from clang-tools v15+) to format the added code
4141
- For anything not covered in the current guidelines, refer to the [C++ Core Guidelines](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)
4242
- Tensors store data in row-major order. We refer to dimension 0 as columns, 1 as rows, 2 as matrices
4343
- Matrix multiplication is unconventional: [`C = ggml_mul_mat(ctx, A, B)`](https://github.com/ggml-org/llama.cpp/blob/880e352277fc017df4d5794f0c21c44e1eae2b84/ggml.h#L1058-L1064) means $C^T = A B^T \Leftrightarrow C = B A^T.$

ggml/include/ggml-backend.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ extern "C" {
5656
GGML_API void ggml_backend_buffer_free (ggml_backend_buffer_t buffer);
5757
GGML_API void * ggml_backend_buffer_get_base (ggml_backend_buffer_t buffer);
5858
GGML_API size_t ggml_backend_buffer_get_size (ggml_backend_buffer_t buffer);
59-
GGML_API void ggml_backend_buffer_init_tensor (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor);
59+
GGML_API enum ggml_status ggml_backend_buffer_init_tensor (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor);
6060
GGML_API size_t ggml_backend_buffer_get_alignment (ggml_backend_buffer_t buffer);
6161
GGML_API size_t ggml_backend_buffer_get_max_size (ggml_backend_buffer_t buffer);
6262
GGML_API size_t ggml_backend_buffer_get_alloc_size(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor);
@@ -342,8 +342,8 @@ extern "C" {
342342
GGML_API bool ggml_backend_compare_graph_backend(ggml_backend_t backend1, ggml_backend_t backend2, struct ggml_cgraph * graph, ggml_backend_eval_callback callback, void * user_data);
343343

344344
// Tensor initialization
345-
GGML_API void ggml_backend_tensor_alloc(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor, void * addr);
346-
GGML_API void ggml_backend_view_init(struct ggml_tensor * tensor);
345+
GGML_API enum ggml_status ggml_backend_tensor_alloc(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor, void * addr);
346+
GGML_API enum ggml_status ggml_backend_view_init(struct ggml_tensor * tensor);
347347

348348
// CPU buffer types are always available
349349
GGML_API ggml_backend_buffer_t ggml_backend_cpu_buffer_from_ptr(void * ptr, size_t size);

ggml/src/ggml-alloc.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -956,12 +956,20 @@ static bool alloc_tensor_range(struct ggml_context * ctx,
956956
if (t->view_src == NULL) {
957957
ggml_tallocr_alloc(&tallocr, t);
958958
} else if (t->buffer == NULL) {
959-
ggml_backend_view_init(t);
959+
enum ggml_status status = ggml_backend_view_init(t);
960+
if (status != GGML_STATUS_SUCCESS) {
961+
GGML_LOG_WARN("%s: failed to ggml_backend_view_init: %s\n", __func__, ggml_status_to_string(status));
962+
return false;
963+
}
960964
}
961965
} else {
962966
if (t->view_src != NULL && t->buffer == NULL) {
963967
// view of a pre-allocated tensor
964-
ggml_backend_view_init(t);
968+
enum ggml_status status = ggml_backend_view_init(t);
969+
if (status != GGML_STATUS_SUCCESS) {
970+
GGML_LOG_WARN("%s: failed to ggml_backend_view_init: %s\n", __func__, ggml_status_to_string(status));
971+
return false;
972+
}
965973
}
966974
}
967975
}

ggml/src/ggml-backend-impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ extern "C" {
4444
// base address of the buffer
4545
void * (*get_base) (ggml_backend_buffer_t buffer);
4646
// (optional) initialize a tensor in the buffer (eg. add tensor extras)
47-
void (*init_tensor) (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor);
47+
enum ggml_status (*init_tensor) (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor);
4848
// tensor data access
4949
void (*memset_tensor)(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor, uint8_t value, size_t offset, size_t size);
5050
void (*set_tensor) (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor, const void * data, size_t offset, size_t size);

ggml/src/ggml-backend.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,13 @@ void * ggml_backend_buffer_get_base(ggml_backend_buffer_t buffer) {
126126
return base;
127127
}
128128

129-
void ggml_backend_buffer_init_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor) {
129+
// Check with reviewers: any cons for that method to return a ggml_status?
130+
enum ggml_status ggml_backend_buffer_init_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor) {
130131
// init_tensor is optional
131132
if (buffer->iface.init_tensor) {
132-
buffer->iface.init_tensor(buffer, tensor);
133+
return buffer->iface.init_tensor(buffer, tensor);
133134
}
135+
return GGML_STATUS_SUCCESS; // check with reviewers. Should we add a GGML_STATUS_SKIP ...
134136
}
135137

136138
void ggml_backend_buffer_clear(ggml_backend_buffer_t buffer, uint8_t value) {
@@ -1641,18 +1643,19 @@ ggml_backend_t ggml_backend_sched_get_tensor_backend(ggml_backend_sched_t sched,
16411643

16421644
// utils
16431645

1644-
void ggml_backend_view_init(struct ggml_tensor * tensor) {
1646+
// Check with reviewers: should we return a ggml_status?
1647+
enum ggml_status ggml_backend_view_init(struct ggml_tensor * tensor) {
16451648
GGML_ASSERT(tensor->buffer == NULL);
16461649
GGML_ASSERT(tensor->view_src != NULL);
16471650
GGML_ASSERT(tensor->view_src->buffer != NULL);
16481651
GGML_ASSERT(tensor->view_src->data != NULL);
16491652

16501653
tensor->buffer = tensor->view_src->buffer;
16511654
tensor->data = (char *)tensor->view_src->data + tensor->view_offs;
1652-
ggml_backend_buffer_init_tensor(tensor->buffer, tensor);
1655+
return ggml_backend_buffer_init_tensor(tensor->buffer, tensor);
16531656
}
16541657

1655-
void ggml_backend_tensor_alloc(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor, void * addr) {
1658+
enum ggml_status ggml_backend_tensor_alloc(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor, void * addr) {
16561659
GGML_ASSERT(tensor->buffer == NULL);
16571660
GGML_ASSERT(tensor->data == NULL);
16581661
GGML_ASSERT(tensor->view_src == NULL);
@@ -1662,7 +1665,7 @@ void ggml_backend_tensor_alloc(ggml_backend_buffer_t buffer, struct ggml_tensor
16621665

16631666
tensor->buffer = buffer;
16641667
tensor->data = addr;
1665-
ggml_backend_buffer_init_tensor(buffer, tensor);
1668+
return ggml_backend_buffer_init_tensor(buffer, tensor);
16661669
}
16671670

16681671
static struct ggml_tensor * graph_copy_dup_tensor(struct ggml_hash_set hash_set, struct ggml_tensor ** node_copies,

ggml/src/ggml-cann/ggml-cann.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -796,11 +796,11 @@ static bool need_transform(ggml_type type) {
796796
* @param buffer The CANN buffer from which to initialize the tensor.
797797
* @param tensor Pointer to the tensor to be initialized.
798798
*/
799-
static void ggml_backend_cann_buffer_init_tensor(
799+
static enum ggml_status ggml_backend_cann_buffer_init_tensor(
800800
ggml_backend_buffer_t buffer, ggml_tensor* tensor) {
801801
if (tensor->view_src != NULL && tensor->view_offs == 0) {
802802
GGML_ASSERT(tensor->view_src->buffer->buft == buffer->buft);
803-
return;
803+
return GGML_STATUS_SUCCESS;
804804
}
805805

806806
// TODO: can backend doesn't support quantized yet. Just leave the code
@@ -817,6 +817,7 @@ static void ggml_backend_cann_buffer_init_tensor(
817817
memset_size, 0, memset_size));
818818
}
819819
}
820+
return GGML_STATUS_SUCCESS;
820821
}
821822

822823
// TODO: need handle tensor which has paddings.

ggml/src/ggml-cpu/amx/amx.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,11 @@ static void * ggml_backend_amx_buffer_get_base(ggml_backend_buffer_t buffer) {
5050
return (void *) (buffer->context);
5151
}
5252

53-
static void ggml_backend_amx_buffer_init_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor) {
53+
static enum ggml_status ggml_backend_amx_buffer_init_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor) {
5454
tensor->extra = (void *) ggml::cpu::amx::get_tensor_traits(buffer, tensor);
5555

5656
GGML_UNUSED(buffer);
57+
return GGML_STATUS_SUCCESS;
5758
}
5859

5960
static void ggml_backend_amx_buffer_memset_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor,

ggml/src/ggml-cpu/ggml-cpu-aarch64.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4135,10 +4135,11 @@ static const ggml::cpu::tensor_traits * ggml_aarch64_get_optimal_repack_type(con
41354135
return nullptr;
41364136
}
41374137

4138-
static void ggml_backend_cpu_aarch64_buffer_init_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor) {
4138+
static enum ggml_status ggml_backend_cpu_aarch64_buffer_init_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor) {
41394139
tensor->extra = (void *) const_cast<ggml::cpu::tensor_traits *>(ggml_aarch64_get_optimal_repack_type(tensor));
41404140

41414141
GGML_UNUSED(buffer);
4142+
return GGML_STATUS_SUCCESS;
41424143
}
41434144

41444145
static void ggml_backend_cpu_aarch64_buffer_set_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor,

ggml/src/ggml-cuda/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.18) # for CMAKE_CUDA_ARCHITECTURES
33
find_package(CUDAToolkit)
44

55
if (CUDAToolkit_FOUND)
6-
message(STATUS "CUDA Toolkit found")
6+
message(STATUS "CUDA Toolkit found: ${CUDAToolkit_VERSION}")
77

88
if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
99
# native == GPUs available at build time

ggml/src/ggml-cuda/ggml-cuda.cu

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -534,12 +534,12 @@ static void * ggml_backend_cuda_buffer_get_base(ggml_backend_buffer_t buffer) {
534534
return ctx->dev_ptr;
535535
}
536536

537-
static void ggml_backend_cuda_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
537+
static enum ggml_status ggml_backend_cuda_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
538538
ggml_backend_cuda_buffer_context * ctx = (ggml_backend_cuda_buffer_context *)buffer->context;
539539

540540
if (tensor->view_src != NULL) {
541541
assert(tensor->view_src->buffer->buft == buffer->buft);
542-
return;
542+
return GGML_STATUS_SUCCESS;
543543
}
544544

545545
if (ggml_is_quantized(tensor->type) && tensor->view_src == nullptr && ggml_backend_buffer_get_usage(buffer) != GGML_BACKEND_BUFFER_USAGE_COMPUTE) {
@@ -552,6 +552,7 @@ static void ggml_backend_cuda_buffer_init_tensor(ggml_backend_buffer_t buffer, g
552552
CUDA_CHECK(cudaMemset((char *)tensor->data + original_size, 0, padded_size - original_size));
553553
}
554554
}
555+
return GGML_STATUS_SUCCESS;
555556
}
556557

557558
static void ggml_backend_cuda_buffer_memset_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, uint8_t value, size_t offset, size_t size) {
@@ -786,7 +787,7 @@ static void * ggml_backend_cuda_split_buffer_get_base(ggml_backend_buffer_t buff
786787
GGML_UNUSED(buffer);
787788
}
788789

789-
static void ggml_backend_cuda_split_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
790+
static enum ggml_status ggml_backend_cuda_split_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
790791
GGML_ASSERT(tensor->view_src == nullptr); // views of split tensors are not supported
791792

792793
ggml_backend_cuda_split_buffer_context * ctx = (ggml_backend_cuda_split_buffer_context *)buffer->context;
@@ -832,6 +833,7 @@ static void ggml_backend_cuda_split_buffer_init_tensor(ggml_backend_buffer_t buf
832833
}
833834
}
834835
tensor->extra = extra;
836+
return GGML_STATUS_SUCCESS;
835837
}
836838

837839
static void ggml_backend_cuda_split_buffer_set_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, const void * data, size_t offset, size_t size) {

ggml/src/ggml-opencl/ggml-opencl.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1222,7 +1222,7 @@ static void * ggml_backend_opencl_buffer_get_base(ggml_backend_buffer_t buffer)
12221222
GGML_UNUSED(buffer);
12231223
}
12241224

1225-
static void ggml_backend_opencl_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
1225+
static enum ggml_status ggml_backend_opencl_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
12261226
ggml_backend_opencl_buffer_context * ctx = (ggml_backend_opencl_buffer_context *) buffer->context;
12271227

12281228
ggml_cl2_init(buffer->buft->device);
@@ -1262,6 +1262,7 @@ static void ggml_backend_opencl_buffer_init_tensor(ggml_backend_buffer_t buffer,
12621262
tensor->extra = extra;
12631263
}
12641264
}
1265+
return GGML_STATUS_SUCCESS;
12651266
}
12661267

12671268
// The optimized gemm and gemv kernels are used for large matrices without batch.

ggml/src/ggml-rpc/ggml-rpc.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ static rpc_tensor serialize_tensor(const ggml_tensor * tensor) {
464464
return result;
465465
}
466466

467-
static void ggml_backend_rpc_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
467+
static enum ggml_status ggml_backend_rpc_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
468468
ggml_backend_rpc_buffer_context * ctx = (ggml_backend_rpc_buffer_context *)buffer->context;
469469

470470
// CUDA backend on the server pads everything to 512 due to CUDA limitations.
@@ -478,6 +478,7 @@ static void ggml_backend_rpc_buffer_init_tensor(ggml_backend_buffer_t buffer, gg
478478
bool status = send_rpc_cmd(ctx->sock, RPC_CMD_INIT_TENSOR, &request, sizeof(request), nullptr, 0);
479479
GGML_ASSERT(status);
480480
}
481+
return GGML_STATUS_SUCCESS;
481482
}
482483

483484
static void ggml_backend_rpc_buffer_set_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, const void * data, size_t offset, size_t size) {

ggml/src/ggml-sycl/ggml-sycl.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,14 +280,14 @@ static void * ggml_backend_sycl_buffer_get_base(ggml_backend_buffer_t buffer) {
280280
return ctx->dev_ptr;
281281
}
282282

283-
static void
283+
static enum ggml_status
284284
ggml_backend_sycl_buffer_init_tensor(ggml_backend_buffer_t buffer,
285285
ggml_tensor *tensor) try {
286286
ggml_backend_sycl_buffer_context * ctx = (ggml_backend_sycl_buffer_context *)buffer->context;
287287

288288
if (tensor->view_src != NULL) {
289289
assert(tensor->view_src->buffer->buft == buffer->buft);
290-
return;
290+
return GGML_STATUS_SUCCESS;
291291
}
292292

293293

@@ -302,6 +302,7 @@ ggml_backend_sycl_buffer_init_tensor(ggml_backend_buffer_t buffer,
302302
padded_size - original_size).wait()));
303303
}
304304
}
305+
return GGML_STATUS_SUCCESS;
305306
}
306307
catch (sycl::exception const &exc) {
307308
std::cerr << exc.what() << "Exception caught at file:" << __FILE__
@@ -709,7 +710,7 @@ static void * ggml_backend_sycl_split_buffer_get_base(ggml_backend_buffer_t buff
709710
GGML_UNUSED(buffer);
710711
}
711712

712-
static void
713+
static enum ggml_status
713714
ggml_backend_sycl_split_buffer_init_tensor(ggml_backend_buffer_t buffer,
714715
ggml_tensor *tensor) try {
715716
GGML_ASSERT(tensor->view_src == nullptr); // views of split tensors are not supported
@@ -784,6 +785,7 @@ ggml_backend_sycl_split_buffer_init_tensor(ggml_backend_buffer_t buffer,
784785
}
785786
}
786787
tensor->extra = extra;
788+
return GGML_STATUS_SUCCESS;
787789
}
788790
catch (sycl::exception const &exc) {
789791
std::cerr << exc.what() << "Exception caught at file:" << __FILE__

ggml/src/ggml-vulkan/ggml-vulkan.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7844,11 +7844,12 @@ static void * ggml_backend_vk_buffer_get_base(ggml_backend_buffer_t buffer) {
78447844
UNUSED(buffer);
78457845
}
78467846

7847-
static void ggml_backend_vk_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
7847+
static enum ggml_status ggml_backend_vk_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) {
78487848
VK_LOG_DEBUG("ggml_backend_vk_buffer_init_tensor(" << buffer << " (" << buffer->context << "), " << tensor << ")");
78497849
if (tensor->view_src != nullptr) {
78507850
GGML_ASSERT(tensor->view_src->buffer->buft == buffer->buft);
78517851
}
7852+
return GGML_STATUS_SUCCESS;
78527853
}
78537854

78547855
static void ggml_backend_vk_buffer_memset_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, uint8_t value, size_t offset, size_t size) {

tests/test-backend-ops.cpp

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,11 @@ struct test_case {
633633
ggml_build_forward_expand(gf, out);
634634

635635
// warmup run
636-
ggml_backend_graph_compute(backend, gf);
636+
ggml_status status = ggml_backend_graph_compute(backend, gf);
637+
if (status != GGML_STATUS_SUCCESS) {
638+
fprintf(stderr, "%s: ggml_backend_graph_compute failed. status=%s \n", __func__, ggml_status_to_string(status));
639+
return false;
640+
}
637641

638642
// determine number of runs
639643
int n_runs;
@@ -684,7 +688,11 @@ struct test_case {
684688
int total_runs = 0;
685689
do {
686690
int64_t start_time = ggml_time_us();
687-
ggml_backend_graph_compute(backend, gf);
691+
ggml_status status = ggml_backend_graph_compute(backend, gf);
692+
if (status != GGML_STATUS_SUCCESS) {
693+
fprintf(stderr, "%s: ggml_backend_graph_compute failed. status=%s \n", __func__, ggml_status_to_string(status));
694+
return false;
695+
}
688696
int64_t end_time = ggml_time_us();
689697

690698
total_time_us += end_time - start_time;
@@ -848,8 +856,16 @@ struct test_case {
848856
initialize_tensors(ctx); // Randomizes all tensors (including gradients).
849857
ggml_graph_reset(gb); // Sets gradients to 1 if loss, 0 otherwise.
850858

851-
ggml_backend_graph_compute(backend, gf);
852-
ggml_backend_graph_compute(backend, gb);
859+
ggml_status status = ggml_backend_graph_compute(backend, gf);
860+
if (status != GGML_STATUS_SUCCESS) {
861+
fprintf(stderr, "%s: ggml_backend_graph_compute failed. status=%s \n", __func__, ggml_status_to_string(status));
862+
return false;
863+
}
864+
status = ggml_backend_graph_compute(backend, gb);
865+
if (status != GGML_STATUS_SUCCESS) {
866+
fprintf(stderr, "%s: ggml_backend_graph_compute failed. status=%s \n", __func__, ggml_status_to_string(status));
867+
return false;
868+
}
853869

854870
bool ok = true;
855871
for (struct ggml_tensor * t = ggml_get_first_tensor(ctx); t != nullptr; t = ggml_get_next_tensor(ctx, t)) {
@@ -897,20 +913,36 @@ struct test_case {
897913
float fu, fuh, fdh, fd; // output values for xiu, xiuh, xid, xidh
898914

899915
ggml_backend_tensor_set(t, &xiu, i*sizeof(float), sizeof(float));
900-
ggml_backend_graph_compute(backend, gf);
916+
status = ggml_backend_graph_compute(backend, gf);
917+
if (status != GGML_STATUS_SUCCESS) {
918+
fprintf(stderr, "%s: ggml_backend_graph_compute failed. status=%s \n", __func__, ggml_status_to_string(status));
919+
return false;
920+
}
901921
ggml_backend_tensor_get(out, &fu, 0, ggml_nbytes(out));
902922

903923
ggml_backend_tensor_set(t, &xid, i*sizeof(float), sizeof(float));
904-
ggml_backend_graph_compute(backend, gf);
924+
status = ggml_backend_graph_compute(backend, gf);
925+
if (status != GGML_STATUS_SUCCESS) {
926+
fprintf(stderr, "%s: ggml_backend_graph_compute failed. status=%s \n", __func__, ggml_status_to_string(status));
927+
return false;
928+
}
905929
ggml_backend_tensor_get(out, &fd, 0, ggml_nbytes(out));
906930

907931
if (grad_precise()) {
908932
ggml_backend_tensor_set(t, &xiuh, i*sizeof(float), sizeof(float));
909-
ggml_backend_graph_compute(backend, gf);
933+
status = ggml_backend_graph_compute(backend, gf);
934+
if (status != GGML_STATUS_SUCCESS) {
935+
fprintf(stderr, "%s: ggml_backend_graph_compute failed. status=%s \n", __func__, ggml_status_to_string(status));
936+
return false;
937+
}
910938
ggml_backend_tensor_get(out, &fuh, 0, ggml_nbytes(out));
911939

912940
ggml_backend_tensor_set(t, &xidh, i*sizeof(float), sizeof(float));
913-
ggml_backend_graph_compute(backend, gf);
941+
status = ggml_backend_graph_compute(backend, gf);
942+
if (status != GGML_STATUS_SUCCESS) {
943+
fprintf(stderr, "%s: ggml_backend_graph_compute failed. status=%s \n", __func__, ggml_status_to_string(status));
944+
return false;
945+
}
914946
ggml_backend_tensor_get(out, &fdh, 0, ggml_nbytes(out));
915947

916948
gn[i] = (8.0*(double)fuh + (double)fd - (8.0*(double)fdh + (double)fu)) / (6.0*(double)eps);

0 commit comments

Comments
 (0)