特征 使用 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
然后我用谷歌搜索文档,结果遇到了一个短语,提到 simd 在添加稀疏矩阵时是隐式的(所以我知道这是可能的,并且在 eigen 的模板化肠子的某个地方,有一个 simd 循环在内部向量上;但我不知道该怎么做(。
接下来,我检查并发现Eigen
在整个代码中只有三次调用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 规范循环形式(,"在simd
构造唯一允许的随机访问迭代器类型 [...]是指针类型。所涉及的迭代器显然不是指针类型。也许可以将它们更改为允许 OpenMP simd 循环,但这需要深入了解相关类型的实现和数据布局。
如果要更改每个条目并且矩阵为压缩形式,则可以使用.coeffs()
成员函数:
smat.coeffs() = value;
遍历单个列会有点困难,但您可以通过查看smat.outerIndexPtr()[col]
来找出每列的开头(col+1
的开头是col
的结尾(。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 特征 使用 SIMD 迭代稀疏矩阵中的内部迭代器
- 我如何从循环内部使用迭代器的函数内部的getter中检索特定的成员
- 容器末端和指向内部项的迭代器之间的区别.C++
- C++ std::迭代器,内部不使用 std::vector 或 std::list
- 矢量迭代器不可解引用(矢量内部的矢量)
- 为什么 QVector 的迭代器使用前缀增加,而后缀在内部减少?
- 将迭代器放在容器内部
- 在将其用作参数时,在内部增加迭代器是否安全