MKL稀疏矩阵添加在最后一次输入时失败

时间:2014-08-13 01:25:14

标签: c++ intel-mkl

我正在尝试使用MKL例程mkl_dcsradd向其转置添加上三角矩阵。在这种情况下,上三角矩阵存储图的邻接矩阵的一部分,我需要完整版本来实现另一种算法。

在这个简化的例子中,我从(11)边的列表开始,并从中构建一个上三角形的CSR矩阵。我已经检查过这个有用了。但是,当我尝试将其添加到其转置时,dcsradd在最后一行停止,说它已用完了空间。但是,情况并非如此。一个上三角矩阵(沿对角线没有零),n非零条目,当添加到它的转置时,应该产生一个2n(22)非零的矩阵。

当我向dcsradd提供22的最大非零值时,它会失败,但是当我提供23(值过大)时,它会正常工作。这是为什么?

我已将代码简化为演示错误的最小示例:

#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <mkl.h>

int main()
{
    int nnz = 11;
    int numVertices = 10;

    int32_t u[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1 };
    int32_t v[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 8 };
    double  w[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

    int fullNnz = nnz * 2;
    int dim = numVertices;

    double triData[nnz];
    int triCols[nnz];
    int triRows[dim];

    // COO to upper-triangular CSR
    int info = -1;
    int job [] = { 2, 1, 0, 0, nnz, 0 };
    mkl_dcsrcoo(job, &dim,
                triData, triCols, triRows,
                &nnz, w, u, v,
                &info);

    printf("info = %d\n", info);

    // Allocate final memory
    double data[fullNnz];
    int cols[fullNnz];
    int rows[dim];

    // B = A + A^T (to make a full adjacency matrix)
    int request = 0, sort = 0;
    double beta = 1.0;
    int WRONG_NNZ = fullNnz + 1; // What is happening here?
    mkl_dcsradd("t", &request, &sort, &dim, &dim,
                triData, triCols, triRows,
                &beta, triData, triCols, triRows,
                data, cols, rows,
                &WRONG_NNZ, &info);

    printf("info = %d\n", info);

    // Convert back to 0-based indexing (via Cilk)
    cols[:]--;
    rows[:]--;

    printf("data:");
    for (double d : data) printf("%.0f ", d);
    printf("\ncols:");
    for (int c : cols) printf("%d ", c);
    printf("\nrows:");
    for (int r : rows) printf("%d ", r);
    printf("\n");

    return 0;
}

我编译:

icc -O3 -std=c++11 -xHost main.cpp -o main -openmp -L/opt/intel/composerxe/mkl/lib -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -lpthread -lm

当我给出22时,输出为:

info = 0
info = 10
data:1 10 1 2 11 2 3 3 4 4 5 10 5 6 6 7 7 8 11 8 9 0 
cols:1 5 0 2 8 1 3 2 4 3 5 0 4 6 5 7 6 8 1 7 9 -1 
rows:0 2 5 7 9 11 14 16 18 21

但是,当我给23时,输出是:

info = 0
info = 0
data:1 10 1 2 11 2 3 3 4 4 5 10 5 6 6 7 7 8 11 8 9 9 
cols:1 5 0 2 8 1 3 2 4 3 5 0 4 6 5 7 6 8 1 7 9 8
rows:0 2 5 7 9 11 14 16 18 21

0 个答案:

没有答案