0

我正在尝试优化 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; 
4

1 回答 1

1

您所做的正是引用子矩阵的官方方式。

BLAS 函数将矩阵的前导维度作为输入参数的最重要原因之一是能够轻松引用子矩阵而无需额外的数据复制。

于 2013-08-21T10:58:48.137 回答