Intel MKL Sparse QR Solve in C++ returns not initialized 错误
Intel MKL Sparse QR Solve in C++ returns not initialized error
尝试使用 mkl_sparse_s_qr_solve
时,我收到全 0 的结果和 SPARSE_STATUS_NOT_INITIALIZED
的错误状态,这意味着 handle/matrix 为空。
我已经尝试通读文档并打印所有用于实例化求解所需的 CSR 稀疏矩阵的数组,并且所有数组都包含正确的值。
int main() {
std::vector<int> i_b(22);
std::vector<int> i_e(22);
// j, v, and b vectors are just examples.
// Regardless of the resulting numbers of the solve, I just
// cannot get the SPARSE_STATUS_NOT_INITIALIZED error to stop
// for the qr solver.
std::vector<int> j(44, 0);
std::vector<float> v(44, 1.0);
std::vector<float> b(22, 1.0);
{
struct IncGenerator {
int current_;
IncGenerator(int start) : current_(start) {}
int operator() () {
current_ += 2;
return current_;
}
};
// Fill i_b with {0, 2, 4, ..., 42}
IncGenerator g(-2);
std::generate(i_b.begin(), i_b.end(), g);
// Fill i_e with {2, 4, 6, ..., 44}
IncGenerator f(0);
std::generate(i_e.begin(), i_e.end(), f);
}
// ...
// j, v, and b arrays are all the correct values
// confirmed. The sparse A matrix should have 2 values
// per row, with 22 rows, and 15 columns.
int out;
sparse_matrix_t A;
out = mkl_sparse_s_create_csr(&A, SPARSE_INDEX_BASE_ZERO, 22, 15, &i_b[0], &i_e[0], &j[0], &v[0]);
switch (out) {
case SPARSE_STATUS_SUCCESS:
std::cout << "Successfully created matrix!" << std::endl;
break;
case SPARSE_STATUS_NOT_INITIALIZED:
std::cout << "Not initialized." << std::endl;
break;
case SPARSE_STATUS_ALLOC_FAILED:
std::cout << "Internal memory allocation failed." << std::endl;
break;
default:
std::cout << "Unknown." << std::endl;
break;
}
std::vector<float> X(22 * 15);
out = mkl_sparse_s_qr_solve(SPARSE_OPERATION_NON_TRANSPOSE, A, NULL, SPARSE_LAYOUT_COLUMN_MAJOR, 1, &X[0], 15, &asv[0], 22);
switch (out) {
case SPARSE_STATUS_SUCCESS:
std::cout << "Successfully solved!" << std::endl;
break;
case SPARSE_STATUS_NOT_INITIALIZED:
std::cout << "Not initialized." << std::endl;
break;
case SPARSE_STATUS_ALLOC_FAILED:
std::cout << "Internal memory allocation failed." << std::endl;
break;
default:
std::cout << "Unknown." << std::endl;
break;
}
return 0;
}
因此,出于某种原因我无法用 A
解决,因为它要么认为 A 是空的,要么其他东西未初始化。我不认为 A
是空的(我想检查但没有方便的方法来打印 A
) 作为矩阵的初始化 A
returns 作为成功的操作(我唯一有点怀疑的是行开始 i_b
和行结束 i_e
索引)。
任何人都可以提供一些指导吗?
这不是您应该使用的方式 mkl_sparse_?_qr_solve
。稀疏系统分 3 个步骤(阶段)解决:
- 重新订购。
- 因式分解。
- 求解。
首先,您必须调用 mkl_sparse_qr_reorder
,然后调用 mkl_sparse_?_qr_factorize
,然后才调用 mkl_sparse_?_qr_solve
:
尝试在mkl_sparse_?_qr_solve
之前插入以下代码:
struct matrix_descr descr;
descr.type = SPARSE_MATRIX_TYPE_GENERAL;
out = mkl_sparse_qr_reorder(A, descr);
switch (out) { ... }
out = mkl_sparse_?_qr_factorize(A, NULL);
switch (out) { ... }
或者只需使用 mkl_sparse_?_qr
即可在一个电话中为您完成所有 3 个步骤。将流程分为三个步骤,为您提供更多自由。例如,如果你想解决几个具有相同 A
的系统,你可以通过只调用一次 mkl_sparse_qr_reorder
和 mkl_sparse_?_qr_factorize
来节省时间。
没有直接关系,但不要使用 int
代替 MKL_INT
。当定义了MKL_ILP64
时,MKL_INT
不是int
,而是long long int
.
尝试使用 mkl_sparse_s_qr_solve
时,我收到全 0 的结果和 SPARSE_STATUS_NOT_INITIALIZED
的错误状态,这意味着 handle/matrix 为空。
我已经尝试通读文档并打印所有用于实例化求解所需的 CSR 稀疏矩阵的数组,并且所有数组都包含正确的值。
int main() {
std::vector<int> i_b(22);
std::vector<int> i_e(22);
// j, v, and b vectors are just examples.
// Regardless of the resulting numbers of the solve, I just
// cannot get the SPARSE_STATUS_NOT_INITIALIZED error to stop
// for the qr solver.
std::vector<int> j(44, 0);
std::vector<float> v(44, 1.0);
std::vector<float> b(22, 1.0);
{
struct IncGenerator {
int current_;
IncGenerator(int start) : current_(start) {}
int operator() () {
current_ += 2;
return current_;
}
};
// Fill i_b with {0, 2, 4, ..., 42}
IncGenerator g(-2);
std::generate(i_b.begin(), i_b.end(), g);
// Fill i_e with {2, 4, 6, ..., 44}
IncGenerator f(0);
std::generate(i_e.begin(), i_e.end(), f);
}
// ...
// j, v, and b arrays are all the correct values
// confirmed. The sparse A matrix should have 2 values
// per row, with 22 rows, and 15 columns.
int out;
sparse_matrix_t A;
out = mkl_sparse_s_create_csr(&A, SPARSE_INDEX_BASE_ZERO, 22, 15, &i_b[0], &i_e[0], &j[0], &v[0]);
switch (out) {
case SPARSE_STATUS_SUCCESS:
std::cout << "Successfully created matrix!" << std::endl;
break;
case SPARSE_STATUS_NOT_INITIALIZED:
std::cout << "Not initialized." << std::endl;
break;
case SPARSE_STATUS_ALLOC_FAILED:
std::cout << "Internal memory allocation failed." << std::endl;
break;
default:
std::cout << "Unknown." << std::endl;
break;
}
std::vector<float> X(22 * 15);
out = mkl_sparse_s_qr_solve(SPARSE_OPERATION_NON_TRANSPOSE, A, NULL, SPARSE_LAYOUT_COLUMN_MAJOR, 1, &X[0], 15, &asv[0], 22);
switch (out) {
case SPARSE_STATUS_SUCCESS:
std::cout << "Successfully solved!" << std::endl;
break;
case SPARSE_STATUS_NOT_INITIALIZED:
std::cout << "Not initialized." << std::endl;
break;
case SPARSE_STATUS_ALLOC_FAILED:
std::cout << "Internal memory allocation failed." << std::endl;
break;
default:
std::cout << "Unknown." << std::endl;
break;
}
return 0;
}
因此,出于某种原因我无法用 A
解决,因为它要么认为 A 是空的,要么其他东西未初始化。我不认为 A
是空的(我想检查但没有方便的方法来打印 A
) 作为矩阵的初始化 A
returns 作为成功的操作(我唯一有点怀疑的是行开始 i_b
和行结束 i_e
索引)。
任何人都可以提供一些指导吗?
这不是您应该使用的方式 mkl_sparse_?_qr_solve
。稀疏系统分 3 个步骤(阶段)解决:
- 重新订购。
- 因式分解。
- 求解。
首先,您必须调用 mkl_sparse_qr_reorder
,然后调用 mkl_sparse_?_qr_factorize
,然后才调用 mkl_sparse_?_qr_solve
:
尝试在mkl_sparse_?_qr_solve
之前插入以下代码:
struct matrix_descr descr;
descr.type = SPARSE_MATRIX_TYPE_GENERAL;
out = mkl_sparse_qr_reorder(A, descr);
switch (out) { ... }
out = mkl_sparse_?_qr_factorize(A, NULL);
switch (out) { ... }
或者只需使用 mkl_sparse_?_qr
即可在一个电话中为您完成所有 3 个步骤。将流程分为三个步骤,为您提供更多自由。例如,如果你想解决几个具有相同 A
的系统,你可以通过只调用一次 mkl_sparse_qr_reorder
和 mkl_sparse_?_qr_factorize
来节省时间。
没有直接关系,但不要使用 int
代替 MKL_INT
。当定义了MKL_ILP64
时,MKL_INT
不是int
,而是long long int
.