【发布时间】:2018-05-01 02:45:42
【问题描述】:
我有一个相当大的 N*N 整数矩阵 Matrix2D(假设内存足够),
1,在每个 row/column 中,如果元素的值不同于它是右/下邻居。
2,我想找到一个可并行化的最优算法,最好是通过 OMP。
所以,最后我会有一些数据结构,例如,
std::vector<std::vector<int>> RowWiseDiscontinuity(N);// N= #of rows
std::vector<std::vector<int>> ColWiseDiscontinuity(N);// N= #of cols
inner std::vector<int> 记录行/列索引。
我把我的串行版本放在这里,但发现很难被 OMP 并行化......有人可以提供一些想法如何使用 omp 实现对这个 2D 矩阵的遍历?
代码 sn-p,
std::vector<std::vector<int>> RowWiseDiscontinuity(N);// N= #of rows
std::vector<std::vector<int>> ColWiseDiscontinuity(N);// N= #of cols
std::vector<int> TempX1;
std::vector<int> TempX2;
for (int y=0; y<N; ++y)
{
TempX1.clear();
for (int x =0; x<N; ++x)
{
int value = Matrix2D(x,y);
TempX1.push_back(value);
}
auto iter1 = TempX1.begin();
auto iter2 = TempX2.begin();
if (y>0)
for (int x =0; x<N; ++x)
{
if (*iter1 !=*(iter1+1))
{
RowWiseDiscontinuity[y].push_back(x); //Critical for OMP
}
++iter1;
++iter2;
if (*iter1 != *iter2)
{
ColWiseDiscontinuity[x].push_back(y); //Critical for OMP
}
}
TempX2.swap(TempX1); // proceed to next row, remember previous
}
【问题讨论】:
-
您是否考虑过将 (x,y) 或 (y,x) 对存储在线程局部向量中,并在内循环完成后将它们添加到 Row/ColWiseDiscontinuity 中?这样,您只需使用少量的额外存储空间,并且可以按顺序插入 Row/ColWiseDiscontinuity,而不会对性能产生太大影响(我假设不连续性只会很少发生)
-
您是否尝试过使用步幅值将
2D vector-matrix扁平化为1D vector,以标记一行有多少列? -
可以删除
TempX1、TempX2,直接使用Matrix2D的数据。然后 omp 希望可以并行化外循环。但是,如果Matrix2D不适合缓存,那么您可能会受到内存带宽的限制,因此您可能不会获得显着的加速。 -
在担心它的性能或并行化它之前让你的算法工作可能是明智的。在测试
*iter1 != *(iter1 + 1)中,iter1 + 1可以是结束迭代器,因此测试给出了未定义的行为。在最新的测试中*iter1 != *iter2(直接在递增之后)iter1和iter2都可以是结束迭代器。
标签: c++ algorithm matrix data-structures openmp