将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是隐式的(所以我知道这是可能的,并且在本征模板化肠的某处,内部向量上有一个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 Canonical Loop Form),“在simd构造中,唯一允许的随机访问迭代器类型是指针类型。”涉及的迭代器显然不是指针类型。可以将其更改为允许OpenMP simd循环的方式,但这需要深入了解所涉及类型的实现和数据布局。

07-24 09:45
查看更多