MKL中的奇怪行为cblas_idamax

时间:2017-09-27 16:42:43

标签: c intel-mkl

我正在尝试使用英特尔MKL库中的 cblas_idamax 函数来获取输入矩阵的每列的最大值。在某些执行中,我得到正确答案,但在其他情况下,我得到错误的索引。这是我的C代码的一个例子:

const MKL_INT nByRow = 2;
const MKL_INT matrix_size = nByRow*nByRow
double * colMaxs = (double *)mkl_malloc(sizeof(double)*nByRow, 64);
double * matrix = (double *)mkl_malloc(sizeof(double)*nByRow, 64);

// matrix is CblasRowMajor
// 1 2
// 3 4
matrix[0]=1;
matrix[1]=2;
matrix[2]=3;
matrix[3]=4;

for(size_t i=0;i<nByRow;i++){
    // calculate the index of the max value in each column
    maxPos = cblas_idamax(matrix_size, matrix + i , nByRow);

    // save the max value
    colMaxs[i] = (*matrix)[i + (maxPos * nByRow)];
}

有时 cblas_idamax 会为每列返回索引1,这是正确的,但其他时间为每列返回3。我认为这是一个与记忆有关的问题。如果有人对这里发生的事情有一些线索,我将非常感激:)

我的电脑是2015年初的MacBook Pro Retina

操作系统:Sierra

处理器:Intel 2.7 GHz Intel Core i5

提前致谢!

1 个答案:

答案 0 :(得分:0)

maxPos是“向量”中的绝对位置,而不是行索引。而且似乎你有太多的间接性。

获取你应该做的元素值

// save the max value
colMaxs[i] = matrix[i + maxPos];

要获取行索引,您需要计算(maxPos-i)/nByRow左右。