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.