OpenMP如何遍历二维向量

How to traverse two-dimensional vector by OpenMP

我是 OpenMP 新手,遇到无法修复的错误。

假设我有一个二维向量:

vector<vector<int>> a{{...}, {...}, ...};

我想遍历为

#pragma omp parallel for collapse(2)
for (int i = 0; i < a.size(); i++){
    for (int j = 0; j < a[i].size(); j++){
        work(a[i][j]);
    }
}

但是出现错误:条件表达式引用了迭代变量‘i’。

那么如何正确遍历二维向量呢?

问题在于第二个循环的结束条件取决于第一个循环的索引变量 (a[i].size())。只有 OpenMP 5.0(或更高版本)支持所谓的非矩形折叠循环,因此如果您使用更早的 OpenMP 版本,则不能在此处使用 collapse(2) 子句。只需删除 collapse(2) 子句即可。

请注意,如果 a[i].size() 对所有 i 都相同,那么您可以轻松删除此依赖项。