GGML_ASSERT(dim >= 0 && dim < 4);
int64_t o[4] = {0, 0, 0, 0};
- o[dim] = src0->ne[dim];
+ if (dim == 0) {
+ o[dim] = src0->ne[dim]/ggml_blck_size(src0->type);
+ } else {
+ o[dim] = src0->ne[dim];
+ }
const char * x;
for (int i3 = 0; i3 < ne3; i3++) {
for (int i2 = ith; i2 < ne2; i2 += nth) {
for (int i1 = 0; i1 < ne1; i1++) {
- for (int i0 = 0; i0 < ne0; i0++) {
- if (i0 < ne00 && i1 < ne01 && i2 < ne02 && i3 < ne03) {
+ for (int i0 = 0; i0 < ne0/ggml_blck_size(dst->type); i0++) {
+ if (i0 < ne00/ggml_blck_size(src0->type) && i1 < ne01 && i2 < ne02 && i3 < ne03) {
x = (const char *)src0->data + (i0 )*nb00 + (i1 )*nb01 + (i2 )*nb02 + (i3 )*nb03;
} else {
x = (const char *)src1->data + (i0 - o[0])*nb10 + (i1 - o[1])*nb11 + (i2 - o[2])*nb12 + (i3 - o[3])*nb13;
ggml_tensor * dst) {
const ggml_tensor * src0 = dst->src[0];
+ const ggml_tensor * src1 = dst->src[1];
+
+ if (ggml_is_quantized(src0->type)) {
+ GGML_ASSERT(ggml_is_contiguous(src0));
+ GGML_ASSERT(ggml_is_contiguous(src1));
+ GGML_ASSERT(src0->ne[0] % ggml_blck_size(src0->type) == 0);
+ GGML_ASSERT(src1->ne[0] % ggml_blck_size(src1->type) == 0);
+ }
switch (src0->type) {
case GGML_TYPE_F16: