如何使用 `omp parallel` 或其他方式并行化 for 循环?

用户在这个世界

假设我有三个整数向量:

  • 大小为 800 万个元素的 mainVect
  • 大小为 150 万个元素的 vect1
  • 大小为 150 万个元素的 vect2

我想运行以下代码:

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 循环同时运行,例如

for ( i = 0; i < vect1.size()/4; i++)
{

}

for ( i = vect1.size()/4; i < vect1.size()/2; i++)
{

}
.... and so on

或者其他方法...

PS: Windows google cloud machine, n1-standard-4 (4 vCPUs, 15 GB memory) ..运行上述代码时CPU利用率只有27%。

罗纳德

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

但主要问题是:你想解决什么问题?

如果我理解正确的话,您就是在计算 vect1 中某个元素在 mainVect 中出现的次数。由于您不需要知道在哪里,您可以重新排列 mainVect(的副本)。

我的方法是:

  1. 排序 mainVect
  2. 将 mainVect 转换为由“key”和出现次数组成的表
  3. 对 vect1 进行排序并创建一个间接向量。迭代这个间接向量给出了升序的“键”
  4. 现在你可以“合并”

这种方法的复杂度是 O(n log n)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章