First rough draft of recoverable errors feature.

This commit is contained in:
KerfuffleV2 2023-05-04 14:42:30 -06:00
parent 3924088512
commit 1a6987ad92
2 changed files with 145 additions and 19 deletions

116
ggml.c
View file

@ -4245,6 +4245,10 @@ struct ggml_context {
struct ggml_scratch scratch;
struct ggml_scratch scratch_save;
#ifdef GGML_RECOVERABLE_ERRORS
enum ggml_errcode last_error_code;
char last_error_msg[GGML_ERROR_BUFFER_LEN];
#endif
};
struct ggml_context_container {
@ -4566,6 +4570,10 @@ struct ggml_context * ggml_init(struct ggml_init_params params) {
/*.objects_end =*/ NULL,
/*.scratch =*/ { 0, 0, NULL, },
/*.scratch_save =*/ { 0, 0, NULL, },
#ifdef GGML_RECOVERABLE_ERRORS
/*.last_error_code =*/ GGML_ERRCODE_SUCCESS,
/*.last_error_msg =*/ { 0 },
#endif
};
GGML_ASSERT(ctx->mem_buffer != NULL);
@ -4620,6 +4628,24 @@ size_t ggml_set_scratch(struct ggml_context * ctx, struct ggml_scratch scratch)
return result;
}
#ifdef GGML_RECOVERABLE_ERRORS
// enum ggml_errcode ggml_clear_error(struct ggml_context * ctx) {
// enum ggml_errcode last_code = ctx->last_error_code;
// ctx->last_error_code = GGML_ERRCODE_SUCCESS;
// ctx->last_error_msg[0] = 0;
// return last_code;
// }
enum ggml_errcode ggml_last_error_code(struct ggml_context * ctx) {
return ctx->last_error_code;
}
char * ggml_last_error_msg(struct ggml_context * ctx) {
return ctx->last_error_code == GGML_ERRCODE_SUCCESS ? "Success" : &ctx->last_error_msg;
}
#endif
////////////////////////////////////////////////////////////////////////////////
struct ggml_tensor * ggml_new_tensor_impl(
@ -4652,12 +4678,11 @@ struct ggml_tensor * ggml_new_tensor_impl(
if (ctx->scratch.data == NULL || data != NULL) {
size_needed += sizeof(struct ggml_tensor);
if (cur_end + size_needed + GGML_OBJECT_SIZE > ctx->mem_size) {
GGML_PRINT("%s: not enough space in the context's memory pool (needed %zu, available %zu)\n",
__func__, cur_end + size_needed + GGML_OBJECT_SIZE, ctx->mem_size);
assert(false);
return NULL;
}
GGML_RECOVERABLE_ASSERT(ctx, GGML_ERRCODE_CTX_MEMORY_LIMIT,
cur_end + size_needed + GGML_OBJECT_SIZE <= ctx->mem_size,
"%s: not enough space in the context's memory pool (needed %zu, available %zu)\n",
__func__, cur_end + size_needed + GGML_OBJECT_SIZE, ctx->mem_size
);
*obj_new = (struct ggml_object) {
.offs = cur_end + GGML_OBJECT_SIZE,
@ -4665,18 +4690,16 @@ struct ggml_tensor * ggml_new_tensor_impl(
.next = NULL,
};
} else {
if (ctx->scratch.offs + size_needed > ctx->scratch.size) {
GGML_PRINT("%s: not enough space in the scratch memory\n", __func__);
assert(false);
return NULL;
}
GGML_RECOVERABLE_ASSERT(ctx, GGML_ERRCODE_SCRATCH_MEMORY_LIMIT,
ctx->scratch.offs + size_needed <= ctx->scratch.size,
"%s: not enough space in the scratch memory\n", __func__
);
if (cur_end + sizeof(struct ggml_tensor) + GGML_OBJECT_SIZE > ctx->mem_size) {
GGML_PRINT("%s: not enough space in the context's memory pool (needed %zu, available %zu)\n",
__func__, cur_end + sizeof(struct ggml_tensor) + GGML_OBJECT_SIZE, ctx->mem_size);
assert(false);
return NULL;
}
GGML_RECOVERABLE_ASSERT(ctx, GGML_ERRCODE_CTX_MEMORY_LIMIT,
cur_end + sizeof(struct ggml_tensor) + GGML_OBJECT_SIZE <= ctx->mem_size,
"%s: not enough space in the context's memory pool (needed %zu, available %zu)\n",
__func__, cur_end + sizeof(struct ggml_tensor) + GGML_OBJECT_SIZE, ctx->mem_size
);
data = (char * const) ctx->scratch.data + ctx->scratch.offs;
@ -4794,6 +4817,7 @@ struct ggml_tensor * ggml_new_i32(struct ggml_context * ctx, int32_t value) {
ctx->scratch.data = NULL;
struct ggml_tensor * result = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, 1);
if (result == NULL) return NULL;
ctx->scratch = ctx->scratch_save;
@ -4807,6 +4831,7 @@ struct ggml_tensor * ggml_new_f32(struct ggml_context * ctx, float value) {
ctx->scratch.data = NULL;
struct ggml_tensor * result = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 1);
if (result == NULL) return NULL;
ctx->scratch = ctx->scratch_save;
@ -5090,6 +5115,7 @@ struct ggml_tensor * ggml_view_tensor(
struct ggml_context * ctx,
const struct ggml_tensor * src) {
struct ggml_tensor * result = ggml_new_tensor_impl(ctx, src->type, src->n_dims, src->ne, src->data);
if (result == NULL) return NULL;
result->nb[0] = src->nb[0];
result->nb[1] = src->nb[1];
@ -5114,6 +5140,7 @@ struct ggml_tensor * ggml_dup_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_DUP;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5142,7 +5169,10 @@ struct ggml_tensor * ggml_add_impl(
struct ggml_tensor * a,
struct ggml_tensor * b,
bool inplace) {
GGML_ASSERT(ggml_are_same_shape(a, b));
GGML_RECOVERABLE_ASSERT(ctx, GGML_ERRCODE_BAD_SHAPE,
ggml_are_same_shape(a, b),
"Shape mismatch in ggml_add"
);
bool is_node = false;
@ -5151,6 +5181,7 @@ struct ggml_tensor * ggml_add_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_ADD;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5190,6 +5221,7 @@ struct ggml_tensor * ggml_sub_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_SUB;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5233,6 +5265,7 @@ struct ggml_tensor * ggml_mul_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_MUL;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5276,6 +5309,7 @@ struct ggml_tensor * ggml_div_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_DIV;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5312,6 +5346,7 @@ struct ggml_tensor * ggml_sqr_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_SQR;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5346,6 +5381,7 @@ struct ggml_tensor * ggml_sqrt_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_SQRT;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5379,6 +5415,7 @@ struct ggml_tensor * ggml_sum(
}
struct ggml_tensor * result = ggml_new_tensor_1d(ctx, a->type, 1);
if (result == NULL) return NULL;
result->op = GGML_OP_SUM;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5402,6 +5439,7 @@ struct ggml_tensor * ggml_mean(
int64_t ne[GGML_MAX_DIMS] = { 1, a->ne[1], a->ne[2], a->ne[3] };
struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, a->n_dims, ne);
if (result == NULL) return NULL;
result->op = GGML_OP_MEAN;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5430,6 +5468,7 @@ struct ggml_tensor * ggml_repeat(
}
struct ggml_tensor * result = ggml_new_tensor(ctx, a->type, b->n_dims, b->ne);
if (result == NULL) return NULL;
result->op = GGML_OP_REPEAT;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5452,6 +5491,7 @@ struct ggml_tensor * ggml_abs_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_ABS;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5487,6 +5527,7 @@ struct ggml_tensor * ggml_sgn_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_SGN;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5521,6 +5562,7 @@ struct ggml_tensor * ggml_neg_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_NEG;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5555,6 +5597,7 @@ struct ggml_tensor * ggml_step_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_STEP;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5589,6 +5632,7 @@ struct ggml_tensor * ggml_relu_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_RELU;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5623,6 +5667,7 @@ struct ggml_tensor * ggml_gelu_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_GELU;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5657,6 +5702,7 @@ struct ggml_tensor * ggml_silu_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_SILU;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5692,6 +5738,7 @@ struct ggml_tensor * ggml_norm_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_NORM;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5725,6 +5772,7 @@ struct ggml_tensor * ggml_rms_norm_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_RMS_NORM;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5763,6 +5811,7 @@ struct ggml_tensor * ggml_mul_mat(
const int64_t ne[4] = { a->ne[1], b->ne[1], a->ne[2], b->ne[3] };
struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, MIN(a->n_dims, b->n_dims), ne);
if (result == NULL) return NULL;
result->op = GGML_OP_MUL_MAT;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5792,6 +5841,7 @@ struct ggml_tensor * ggml_scale_impl(
// TODO: when implement backward, fix this:
//struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
struct ggml_tensor * result = ggml_view_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_SCALE;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5833,6 +5883,7 @@ struct ggml_tensor * ggml_cpy_impl(
// make a view of the destination
struct ggml_tensor * result = ggml_view_tensor(ctx, b);
if (result == NULL) return NULL;
result->op = GGML_OP_CPY;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5870,6 +5921,7 @@ struct ggml_tensor * ggml_cont_impl(
}
struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_CONT;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5909,6 +5961,7 @@ struct ggml_tensor * ggml_reshape(
}
struct ggml_tensor * result = ggml_new_tensor_impl(ctx, a->type, b->n_dims, b->ne, a->data);
if (result == NULL) return NULL;
result->op = GGML_OP_RESHAPE;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5935,6 +5988,7 @@ struct ggml_tensor * ggml_reshape_2d(
const int64_t ne[2] = { ne0, ne1 };
struct ggml_tensor * result = ggml_new_tensor_impl(ctx, a->type, 2, ne, a->data);
if (result == NULL) return NULL;
result->op = GGML_OP_RESHAPE;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5962,6 +6016,7 @@ struct ggml_tensor * ggml_reshape_3d(
const int64_t ne[3] = { ne0, ne1, ne2 };
struct ggml_tensor * result = ggml_new_tensor_impl(ctx, a->type, 3, ne, a->data);
if (result == NULL) return NULL;
result->op = GGML_OP_RESHAPE;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -5983,6 +6038,7 @@ struct ggml_tensor * ggml_view_1d(
}
struct ggml_tensor * result = ggml_new_tensor_impl(ctx, a->type, 1, &ne0, (char *) a->data + offset);
if (result == NULL) return NULL;
result->op = GGML_OP_VIEW;
result->grad = NULL;
@ -6008,6 +6064,7 @@ struct ggml_tensor * ggml_view_2d(
const int64_t ne[GGML_MAX_DIMS] = { ne0, ne1, 1, 1 };
struct ggml_tensor * result = ggml_new_tensor_impl(ctx, a->type, 2, ne, (char *) a->data + offset);
if (result == NULL) return NULL;
result->nb[1] = nb1;
result->nb[2] = result->nb[1]*ne1;
@ -6039,6 +6096,7 @@ struct ggml_tensor * ggml_view_3d(
const int64_t ne[GGML_MAX_DIMS] = { ne0, ne1, ne2, 1 };
struct ggml_tensor * result = ggml_new_tensor_impl(ctx, a->type, 3, ne, (char *) a->data + offset);
if (result == NULL) return NULL;
result->nb[1] = nb1;
result->nb[2] = nb2;
@ -6081,6 +6139,7 @@ struct ggml_tensor * ggml_permute(
}
struct ggml_tensor * result = ggml_view_tensor(ctx, a);
if (result == NULL) return NULL;
int ne[GGML_MAX_DIMS];
int nb[GGML_MAX_DIMS];
@ -6159,6 +6218,7 @@ struct ggml_tensor * ggml_get_rows(
// TODO: implement non F32 return
//struct ggml_tensor * result = ggml_new_tensor_2d(ctx, a->type, a->ne[0], b->ne[0]);
struct ggml_tensor * result = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, a->ne[0], b->ne[0]);
if (result == NULL) return NULL;
result->op = GGML_OP_GET_ROWS;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -6184,7 +6244,9 @@ struct ggml_tensor * ggml_diag_mask_inf(
// TODO: when implement backward, fix this:
//struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
struct ggml_tensor * result = ggml_view_tensor(ctx, a);
if (result == NULL) return NULL;
struct ggml_tensor * b = ggml_new_i32(ctx, n_past);
GGML_ASSERT(b != NULL);
ggml_set_name(b, "n_past");
result->op = GGML_OP_DIAG_MASK_INF;
@ -6210,6 +6272,7 @@ struct ggml_tensor * ggml_soft_max(
// TODO: when implement backward, fix this:
//struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
struct ggml_tensor * result = ggml_view_tensor(ctx, a);
if (result == NULL) return NULL;
result->op = GGML_OP_SOFT_MAX;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -6238,8 +6301,9 @@ struct ggml_tensor * ggml_rope(
// TODO: when implement backward, fix this:
//struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
struct ggml_tensor * result = ggml_view_tensor(ctx, a);
if (result == NULL) return NULL;
struct ggml_tensor * b = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, 3);
GGML_ASSERT(b != NULL);
((int32_t *) b->data)[0] = n_past;
((int32_t *) b->data)[1] = n_dims;
((int32_t *) b->data)[2] = mode;
@ -6271,8 +6335,10 @@ struct ggml_tensor * ggml_alibi(
// TODO: when implement backward, fix this:
//struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
struct ggml_tensor * result = ggml_view_tensor(ctx, a);
if (result == NULL) return NULL;
struct ggml_tensor * b = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, 2);
GGML_ASSERT(b != NULL);
((int32_t *) b->data)[0] = n_past;
((int32_t *) b->data)[1] = n_head;
@ -6302,6 +6368,7 @@ struct ggml_tensor * ggml_conv_1d_1s(
const int64_t ne[4] = { b->ne[0], a->ne[2], 1, 1, };
struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, 2, ne);
if (result == NULL) return NULL;
result->op = GGML_OP_CONV_1D_1S;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -6329,6 +6396,7 @@ struct ggml_tensor * ggml_conv_1d_2s(
const int64_t ne[4] = { b->ne[0]/2, a->ne[2], 1, 1, };
struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, 2, ne);
if (result == NULL) return NULL;
result->op = GGML_OP_CONV_1D_2S;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -6358,6 +6426,7 @@ struct ggml_tensor * ggml_flash_attn(
//struct ggml_tensor * result = ggml_dup_tensor(ctx, q);
struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, 4, q->ne);
if (result == NULL) return NULL;
result->op = GGML_OP_FLASH_ATTN;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -6365,6 +6434,7 @@ struct ggml_tensor * ggml_flash_attn(
result->src1 = k;
result->opt[0] = v;
result->opt[1] = ggml_new_i32(ctx, masked ? 1 : 0);
GGML_ASSERT(result->opt[1] != NULL);
return result;
}
@ -6390,6 +6460,7 @@ struct ggml_tensor * ggml_flash_ff(
//struct ggml_tensor * result = ggml_dup_tensor(ctx, a);
struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, 4, a->ne);
if (result == NULL) return NULL;
result->op = GGML_OP_FLASH_FF;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -6416,8 +6487,10 @@ struct ggml_tensor * ggml_map_unary_impl_f32(
}
struct ggml_tensor * addr_tensor = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, sizeof(void *) / sizeof(int32_t));
if (addr_tensor == NULL) return NULL;
*((void (**)(void))addr_tensor->data) = (void (*)(void))fun;
struct ggml_tensor *result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
GGML_ASSERT(result != NULL);
result->op = GGML_OP_MAP_UNARY;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -6458,8 +6531,10 @@ struct ggml_tensor * ggml_map_binary_impl_f32(
}
struct ggml_tensor * addr_tensor = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, sizeof(void *) / sizeof(int32_t));
if (addr_tensor == NULL) return NULL;
*((void (**)(void))addr_tensor->data) = (void (*)(void))fun;
struct ggml_tensor *result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
GGML_ASSERT(result != NULL);
result->op = GGML_OP_MAP_BINARY;
result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL;
@ -11741,6 +11816,9 @@ static thread_ret_t ggml_graph_compute_thread(void * data) {
}
void ggml_graph_compute(struct ggml_context * ctx, struct ggml_cgraph * cgraph) {
#ifdef GGML_RECOVERABLE_ERRORS
GGML_ASSERT(ctx->last_error_code == GGML_ERRCODE_SUCCESS);
#endif
const int n_threads = cgraph->n_threads;
struct ggml_compute_state_shared state_shared = {

48
ggml.h
View file

@ -205,6 +205,45 @@
} \
} while (0)
#define GGML_RECOVERABLE_ERRORS
#ifndef GGML_RECOVERABLE_ERRORS
#define GGML_RECOVERABLE_ASSERT(_ctx, _code, x, ...) \
do { \
if (!(x)) { \
printf(__VA_ARGS__); \
fprintf(stderr, "GGML_ASSERT: %s:%d: %s\n", __FILE__, __LINE__, #x); \
abort(); \
} \
} while (0)
#else
#define GGML_ERROR_BUFFER_LEN 256
#define GGML_RECOVERABLE_ASSERT(ctx, errcode, x, ...) \
do { \
if ((ctx)->last_error_code != GGML_ERRCODE_SUCCESS) { \
fprintf(stderr, "GGML_RECOVERABLE_ASSERT: Cannot continue due previous error condition: %s\n", (ctx)->last_error_msg); \
GGML_ASSERT(false); \
} else if (!(x)) { \
snprintf((ctx)->last_error_msg, GGML_ERROR_BUFFER_LEN - 1, __VA_ARGS__); \
(ctx)->last_error_msg[GGML_ERROR_BUFFER_LEN - 1] = 0; \
(ctx)->last_error_code = errcode; \
return NULL; \
} \
} while (0)
#endif
enum ggml_errcode {
GGML_ERRCODE_SUCCESS = 0,
GGML_ERRCODE_OTHER,
GGML_ERRCODE_CTX_MEMORY_LIMIT,
GGML_ERRCODE_SCRATCH_MEMORY_LIMIT,
GGML_ERRCODE_BAD_TYPE,
GGML_ERRCODE_BAD_DIMENSIONS,
GGML_ERRCODE_BAD_SHAPE,
};
#ifdef __cplusplus
extern "C" {
#endif
@ -425,6 +464,15 @@ extern "C" {
GGML_API size_t ggml_set_scratch(struct ggml_context * ctx, struct ggml_scratch scratch);
#ifdef GGML_RECOVERABLE_ERRORS
// GGML_API enum ggml_errcode ggml_clear_error(
// struct ggml_context * ctx);
GGML_API enum ggml_errcode ggml_last_error_code(
struct ggml_context * ctx);
GGML_API char * ggml_last_error_msg(
struct ggml_context * ctx);
#endif
GGML_API struct ggml_tensor * ggml_new_tensor(
struct ggml_context * ctx,
enum ggml_type type,