使用 SIMD 对稀疏矩阵中的内部迭代器进行特征迭代
Eigen Iterate over inner iterator in sparse matrix with SIMD
对稀疏矩阵的本征内部迭代器应用 simd:
for(auto i = 0; i < smat.outerSize(); i++){
#pragma omp simd
for(SMat::InnerIterator iter(smat,i); it; ++it){
it.valueRef() = value;
}
}
这不起作用,因为 for 循环中的括号初始化错误与 simd 不兼容。接下来我尝试:
SMat::InnerIterator iter(smat,i);
#pragma omp simd
for(;it;++it){ // error, declaration or initialization expected
for(it;it;++it){ // error, declaration or initialization expected
然后我 google 并搜索文档,只遇到一个短语提到在添加稀疏矩阵时 simd 是隐式的(所以我知道这是可能的,并且在特征模板的某个地方,有是内部向量上的 simd 循环;但我不知道该怎么做)。
接下来查看发现Eigen
在整个代码中只有3次调用了omp
。这是否意味着 Eigen 仅依赖编译器标志来激活 simd?
最后,我尝试将循环更改为规范形式(根据下面的评论),并得到一个不同的错误:
for(auto it = typename SMat::InnerIterator(smat,i); it; ++it)
// error: '#pragma omp simd' used with class iteration variable 'it'
使用 simd 在 Eigen::SparseMatrix<double>
中触发或迭代内部向量的预期方式是什么?
在此上下文中无法应用 #pragma omp simd
。根据 OpenMP 规范(2.6 规范循环形式),"in the simd
construct the only random access iterator types that are allowed [...] are pointer types."。涉及的迭代器显然不是指针类型。可以将它们更改为允许 OpenMP simd 循环,但这需要深入了解所涉及类型的实现和数据布局。
如果您想更改每个条目并且您的矩阵是压缩形式,您可以使用 .coeffs()
成员函数:
smat.coeffs() = value;
迭代各个列会有点困难,但您可以通过查看 smat.outerIndexPtr()[col]
找出每列的开始(col+1
的开始是 [=14] 的结束=]).
对稀疏矩阵的本征内部迭代器应用 simd:
for(auto i = 0; i < smat.outerSize(); i++){
#pragma omp simd
for(SMat::InnerIterator iter(smat,i); it; ++it){
it.valueRef() = value;
}
}
这不起作用,因为 for 循环中的括号初始化错误与 simd 不兼容。接下来我尝试:
SMat::InnerIterator iter(smat,i);
#pragma omp simd
for(;it;++it){ // error, declaration or initialization expected
for(it;it;++it){ // error, declaration or initialization expected
然后我 google 并搜索文档,只遇到一个短语提到在添加稀疏矩阵时 simd 是隐式的(所以我知道这是可能的,并且在特征模板的某个地方,有是内部向量上的 simd 循环;但我不知道该怎么做)。
接下来查看发现Eigen
在整个代码中只有3次调用了omp
。这是否意味着 Eigen 仅依赖编译器标志来激活 simd?
最后,我尝试将循环更改为规范形式(根据下面的评论),并得到一个不同的错误:
for(auto it = typename SMat::InnerIterator(smat,i); it; ++it)
// error: '#pragma omp simd' used with class iteration variable 'it'
使用 simd 在 Eigen::SparseMatrix<double>
中触发或迭代内部向量的预期方式是什么?
在此上下文中无法应用 #pragma omp simd
。根据 OpenMP 规范(2.6 规范循环形式),"in the simd
construct the only random access iterator types that are allowed [...] are pointer types."。涉及的迭代器显然不是指针类型。可以将它们更改为允许 OpenMP simd 循环,但这需要深入了解所涉及类型的实现和数据布局。
如果您想更改每个条目并且您的矩阵是压缩形式,您可以使用 .coeffs()
成员函数:
smat.coeffs() = value;
迭代各个列会有点困难,但您可以通过查看 smat.outerIndexPtr()[col]
找出每列的开始(col+1
的开始是 [=14] 的结束=]).