我如何使用“ op parallel”或其他方式并行循环

How do I parallelise a for loop, using `omp parallel` or otherwise?

本文关键字:其他 方式 并行 循环 parallel 何使用 op      更新时间:2023-10-16

假设我有三个整数向量:

  • 800万个元素的主角
  • VECT1的150万个元素
  • VECT2的尺寸为150万个元素

我想运行以下代码:

int i,j;
for ( i = 0; i < vect1.size(); i++)
{
    for ( j = 0; j < mainVect.size(); j++)
    {
        if (vect1[i] == mainVect[j])
        {
            vect2[i]++;             
        }
    }
}

花了很长时间没有完成……我如何加快运行速度,我有多处理器。尝试一下,我在上一个代码之前添加了以下句子(我读到它并行运行)

#pragma omp parallel for private(i, j) shared( mainVect, vect1, vect2)

但仍然很慢...

如果我将for循环分为4个部分;例如,我如何使这些循环同时运行,例如

for ( i = 0; i < vect1.size()/4; i++)
{
}
for ( i = vect1.size()/4; i < vect1.size()/2; i++)
{
}
.... and so on

或任何其他方法...

P.S。:Windows Google Cloud Machine,N1-Standard-4(4 VCPU,15 GB内存)。运行上述代码时仅使用27%。

800万个int不会占用太多空间。您可以使用unordered_map或其他一些有效的关联容器。

unordered_map<int, int> umap;
for (int v : mainVect) {
    umap[v]++;
}
for (int i = 0; i < vect1.size(); ++i) {
    if (umap.count(vect1[i])) {
        vect2[i] += umap[vect1[i]];
    }
}

这个一个线性需要时间才能填充vect2,这很快。

使用线程是一种可能的解决方案。

但是主要的问题是:您要解决什么问题?

如果我正确理解它,您正在计算VECT1中元素的MainVect中的发生数量。由于您不需要知道在哪里,因此可以重新排列(副本)MainVect。

我的方法是:

  1. 分类MainVect
  2. 将mainvect转换为由"键"和出现数量组成的表
  3. 对VECT1进行排序并创建一个间接向量。在此间接向量上进行迭代给出了上升序列中的"键" s
  4. 现在您可以"合并"

这种方法的复杂性是o(n log n)

相关文章: