Intel MKL --- *** glibc обнаружен *** free(): недопустимый следующий размер (быстрый): 0x00000000006302c0 ***

Я новичок в Intel MKL, код и подробности ошибки следуют далее. Я пытаюсь умножить две разреженные матрицы с помощью Intel MKL mkl_scsrmultd() рутина. Я использую две функции gen_col() генерировать вектор столбца и gen_row() создать указатель строки согласно спецификации intel MKL. Я использовал GDB, и я думаю, что ошибка внутри mkl_scsrmultd() rouine.

Сэр,

a_mat - ненулевой массив для матрицы A. A - матрица 8*8 с матрицами 4*4 на диагностике. отсюда умножение с использованием разреженности. произведение A*A будет матрицей 8*8. a_mat и b_mat являются взаимозаменяемыми.

результат сохраняется в q_mat, который должен быть 8*8.

int * gen_col(int M, int N)
{
    int n = 0;
    int m = 0;
    int k = 1;
    int i;
    int *x = (int*)malloc(M*N);
    for (i = 0; i < M*N; i++ ){
        x[i] = m;
        m = m + 1;
        if (m == k*N) {
            m = m - N;
            n = n + 1;
        }
        if (n == N) {
            n = 0;
            k = k + 1;
            m = m + N;
        }
    }
    for (i = 0; i < M*N; i++) {
        x[i]=x[i]+1;
    }
    return x;
}

void * gen_row(int M, int N)
{
    int i;
    int *x = (int*)malloc(M+1);
    for(i = 0; i < M; i++) {
        x[i]= i*N +1;
    }

    x[M]=(M*N + 1);
    return x;
}


#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mkl_types.h"
#include "mkl_spblas.h"
#include "gen_col.h"

int main() {
    int M = 8;
    int N = 4;



    printf("  BK_1  \n");
    float *a_mat, *q_mat, *b_mat, *check_mat;
    printf(" BK_2 \n");

    a_mat = (float*)malloc((M*N)*sizeof(float));
    b_mat = (float*)malloc((M*N)*sizeof(float));
    q_mat = (float*)malloc((M*M)*sizeof(float));


    srand((unsigned int)time(0));
    int i, j;
    for(i=0; i<M; i++) {
        for(j=0; j<N; j++) {
            a_mat[i*N + j] = (float)rand()/RAND_MAX;
            b_mat[i*N + j] = (float)rand()/RAND_MAX;
        }
    }
    for(i=0; i<M; i++) {
        for(j=0; j<M; j++) {
            q_mat[i*M + j] = 0.0;
        }
    }
    printf(" BK_3 \n");
    for(i=0; i<M; i++) {
        for(j=0; j<N; j++) {
            printf("%f ",a_mat[i*N + j]);
        }
        printf(";\n");
    }

    char transa;
    transa = 't';

    MKL_INT *columns = gen_col(M,N);
    printf(" BK_4 \n");
    //int j;
    for (j = 0; j < M*N; j++){
        printf("%d",columns[j]);
    }

    int rowIndex [9]= {1, 5, 9, 13, 17, 21, 25, 29, 33};

    MKL_INT* rowIndex1 = gen_row(M,N);
    printf(" BK_5 \n");
    for (j = 0; j < M+1; j++) {
        printf("%d",rowIndex1[j]);
    }

    MKL_INT m = M;
    mkl_scsrmultd (&transa,&m, &m, &m, a_mat, columns, rowIndex, b_mat, columns, rowIndex, q_mat, &m);
    printf(" BK_6 \n");

}

ошибка

 *** glibc detected *** ./test.out: free(): invalid next size (fast): 0x00000000015e82c0 ***

1 ответ

Я думаю, что ваш призыв к mkl_scsrmultd с тремя &m размеры неверны:

    mkl_scsrmultd (&transa,&m, &m, &m, a_mat, columns, rowIndex, b_mat, columns, rowIndex, q_mat, &m);

Документация по этой функции гласит: https://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-D6F15254-4106-4112-9B11-F19DA5C8DDB1.htm

void mkl_scsrmultd (char *transa, MKL_INT *m, MKL_INT *n, MKL_INT *k, float *a, MKL_INT *ja, MKL_INT *ia, float *b, MKL_INT *jb, MKL_INT *ib, float *c, MKL_INT *ldc);

Подпрограмма mkl_scsrmultd выполняет матрично-матричную операцию, определенную как

C := op(A)*B

A, B - разреженные матрицы в формате CSR (вариация с 3 массивами)

где

m
INTEGER. Number of rows of the matrix A.
n
INTEGER. Number of columns of the matrix A.
k
INTEGER. Number of columns of the matrix B.

Вы выделили 8х4 (M Икс N) матрицы в качестве входа и выхода (q_mat):

    int M = 8;
    int  N  = 4;

    a_mat = (float*)malloc((M*N)*sizeof(float));
    b_mat = (float*)malloc((M*N)*sizeof(float));
    q_mat = (float*)malloc((M*M)*sizeof(float));

но говорит mkl_scsrmultd работать на 8х8 (M Икс M) матрицы. Это не правильно, и mkl_scsrmultd сделал запись вне памяти, выделенной для A, B и C.

Другие вопросы по тегам