使用SIMD在稀疏矩阵中对内迭代器进行特征迭代

时间:2018-06-05 20:20:13

标签: c++ openmp eigen 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在整个代码中只有三次调用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>内部向量的预期方法是什么?

2 个答案:

答案 0 :(得分:3)

在此上下文中无法应用#pragma omp simd。根据OpenMP规范(2.6 Canonical Loop Form),“在simd构造中,允许的唯一随机访问迭代器类型是指针类型。”涉及的迭代器显然不是指针类型。有可能将它们更改为允许OpenMP simd循环,但这需要深入了解所涉及类型的实现和数据布局。

答案 1 :(得分:3)

如果您想更改每个条目并且矩阵是压缩形式,您可以使用.coeffs()成员函数:

smat.coeffs() = value;

迭代单个列会有点困难,但您可以通过查看smat.outerIndexPtr()[col]找到每列的开头(col+1的开头是col的结尾)。

相关问题