Я пытаюсь оптимизировать множество матричных вычислений в MKL, которые требуют от меня выделения больших блоков памяти, используя что-то вроде:
double* test_matrix = (double*)mkl_malloc(n * sizeof(double), 64)
,
Недавно я обнаружил много ошибок выделения памяти, которые появляются, которые трудно воспроизвести и еще сложнее отладить. Я обеспокоен тем, что есть некоторые данные внутреннего заголовка, которые MKL помещает в кучу, которые я не учитываю при использовании моего текущего метода.
Есть ли «официальный» способ передачи подмножества матрицы MKL в другую функцию? Передача копии определенно увеличит мои накладные расходы. В настоящее время я даю ссылку на подмножество матрицы следующим образом:
double* a = (double*)mkl_malloc(4 * 4 * sizeof(double), 64);
double* b = (double*)mkl_malloc(4 * 4 * sizeof(double), 64);
double* c = (double*)mkl_malloc(2 * 2 * sizeof(double), 64);
... fill in values for a and b ...
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
2, 2, 2, 1, &a[2], 4, &b[2], 4, 0, c, 2);
cout << "Result is: " << c[0] << c[1] << c[2] << c[3] << endl;
То, что вы сделали, это именно официальный способ ссылки на подматрицу.
Одна из наиболее важных причин, по которым функции BLAS выбирают в качестве входных параметров матрицы в качестве входных параметров, заключается в том, что они позволяют легко ссылаться на подматрицу без дополнительного копирования данных.
Других решений пока нет …