c++ - 使用 SIMD 对稀疏矩阵中的内部迭代器进行特征迭代

标签 c++ openmp eigen simd

将 simd 应用于稀疏矩阵的 Eigen 内部迭代器:

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 循环内部 vector ;但我不知道该怎么做)。

接下来,我检查并发现 Eigen只有三个电话 omp在整个代码中。这是否意味着 Eigen 仅依赖编译器标志来激活 simd?

最后,我尝试将循环更改为规范形式(根据下面的评论),并得到一个不同的错误:

for(auto it = typename SMat::InnerIterator(smat,i); it; ++it)

// error: '#pragma omp simd' used with class iteration variable 'it'

Eigen::SparseMatrix<double> 中触发或迭代内部 vector 的预期方式是什么?用 simd?

最佳答案

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

关于c++ - 使用 SIMD 对稀疏矩阵中的内部迭代器进行特征迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50708330/

相关文章:

c++ - 从 std::vector 创建 Eigen::Ref

c++ - 编译运行 OpenMPI 程序

c - Codeblocks 上的 Openmp

C 与 OpenMP : Matrix times vector

c++ - 将 Eigen::MatrixXd 转换为 arma::mat 并在新对象上制作拷贝

c++ - 如何使用 C++ 将特征稀疏矩阵转换为数组?

C++ 服务器-客户端 FTP 模拟

C++语言oops

c++ - 删除四面体网格中内部元素的算法

C++ OpenMP 对象计数器使用对象的 std::vector 计数不正确