Могу ли я передать подмножество матрицы в другую функцию в MKL?

Я пытаюсь оптимизировать множество матричных вычислений в 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; 

person poliu2s    schedule 19.08.2013    source источник


Ответы (1)


То, что вы сделали, - это официальный способ ссылки на подматрицу.

Одной из наиболее важных причин, по которой функции BLAS принимают начальные измерения матриц в качестве входных параметров, является возможность легкого обращения к подматрице без дополнительного копирования данных.

person kangshiyin    schedule 21.08.2013