store view offset and permute axes in opt[0] instead of storing it in padding

use memcpy to store offset, because offset is of type size_t.
when storing it as int32_t offset would have to be smaller than 2^31 which is not necessarily true.
This commit is contained in:
xaedes 2023-06-08 02:33:57 +02:00
parent b58d73ca8c
commit 6b7487d104
No known key found for this signature in database
GPG key ID: 30030EDD817EA2B1

77
ggml.c
View file

@ -5884,7 +5884,17 @@ struct ggml_tensor * ggml_view_1d(
result->src1 = NULL; result->src1 = NULL;
if (is_node) { if (is_node) {
memcpy(result->padding, &offset, sizeof(offset)); ggml_scratch_save(ctx);
struct ggml_tensor * b = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, 2);
GGML_ASSERT(sizeof(offset) <= ggml_nbytes(b));
memcpy(b->data, &offset, sizeof(offset));
ggml_scratch_load(ctx);
result->opt[0] = b;
} }
return result; return result;
@ -5920,7 +5930,17 @@ struct ggml_tensor * ggml_view_2d(
result->src1 = NULL; result->src1 = NULL;
if (is_node) { if (is_node) {
memcpy(result->padding, &offset, sizeof(offset)); ggml_scratch_save(ctx);
struct ggml_tensor * b = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, 2);
GGML_ASSERT(sizeof(offset) <= ggml_nbytes(b));
memcpy(b->data, &offset, sizeof(offset));
ggml_scratch_load(ctx);
result->opt[0] = b;
} }
return result; return result;
@ -5958,7 +5978,17 @@ struct ggml_tensor * ggml_view_3d(
result->src1 = NULL; result->src1 = NULL;
if (is_node) { if (is_node) {
memcpy(result->padding, &offset, sizeof(offset)); ggml_scratch_save(ctx);
struct ggml_tensor * b = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, 2);
GGML_ASSERT(sizeof(offset) <= ggml_nbytes(b));
memcpy(b->data, &offset, sizeof(offset));
ggml_scratch_load(ctx);
result->opt[0] = b;
} }
return result; return result;
@ -5998,7 +6028,17 @@ struct ggml_tensor * ggml_view_4d(
result->src1 = NULL; result->src1 = NULL;
if (is_node) { if (is_node) {
memcpy(result->padding, &offset, sizeof(offset)); ggml_scratch_save(ctx);
struct ggml_tensor * b = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, 2);
GGML_ASSERT(sizeof(offset) <= ggml_nbytes(b));
memcpy(b->data, &offset, sizeof(offset));
ggml_scratch_load(ctx);
result->opt[0] = b;
} }
return result; return result;
@ -6062,10 +6102,18 @@ struct ggml_tensor * ggml_permute(
result->src1 = NULL; result->src1 = NULL;
if (is_node) { if (is_node) {
result->padding[0] = axis0; ggml_scratch_save(ctx);
result->padding[1] = axis1;
result->padding[2] = axis2; struct ggml_tensor * b = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, 4);
result->padding[3] = axis3;
((int32_t *) b->data)[0] = axis0;
((int32_t *) b->data)[1] = axis1;
((int32_t *) b->data)[2] = axis2;
((int32_t *) b->data)[3] = axis3;
ggml_scratch_load(ctx);
result->opt[0] = b;
} }
return result; return result;
@ -14834,7 +14882,9 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor
// necessary for llama // necessary for llama
if (src0->grad) { if (src0->grad) {
size_t offset; size_t offset;
memcpy(&offset, tensor->padding, sizeof(offset));
GGML_ASSERT(sizeof(offset) <= ggml_nbytes(tensor->opt[0]));
memcpy(&offset, tensor->opt[0]->data, sizeof(offset));
size_t nb1 = tensor->nb[1]; size_t nb1 = tensor->nb[1];
size_t nb2 = tensor->nb[2]; size_t nb2 = tensor->nb[2];
@ -14861,10 +14911,11 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor
{ {
// necessary for llama // necessary for llama
if (src0->grad) { if (src0->grad) {
int axis0 = tensor->padding[0] & 0x3; int32_t * axes = (int32_t *) tensor->opt[0]->data;
int axis1 = tensor->padding[1] & 0x3; int axis0 = axes[0] & 0x3;
int axis2 = tensor->padding[2] & 0x3; int axis1 = axes[1] & 0x3;
int axis3 = tensor->padding[3] & 0x3; int axis2 = axes[2] & 0x3;
int axis3 = axes[3] & 0x3;
int axes_backward[4] = {0,0,0,0}; int axes_backward[4] = {0,0,0,0};
axes_backward[axis0] = 0; axes_backward[axis0] = 0;
axes_backward[axis1] = 1; axes_backward[axis1] = 1;