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

标签 c++ multithreading parallel-processing

假设我有三个整数 vector :

  • 大小为 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

或任何其他方法...

附言: Windows google 云机器,n1-standard-4(4 个 vCPU,15 GB 内存).. 运行上述代码时 CPU 利用率仅为 27%。

最佳答案

800 万个整数不会占用太多空间。您可以使用 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

关于c++ - 如何使用 `omp parallel` 或其他方式并行化 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47716065/

相关文章:

c# - 在多线程中更新 UI 的最佳方法是什么

c++ - 将启用 MPICH2 的代码转换为 OpenCL 代码

C++图像数组类型

c++ - 转换为 void* 并返回 Original_Data_Type*

c++ - 仅使用位操作是否可以有效地完成图像 mask ?

python - 主线程退出后如何让守护线程保持事件状态?

c++ - 如何将 c++ 变量的值传递给 hadoop HDFS 的 bash 系统命令?

java - 在 Java 中停止阻塞套接字

list - 处理 scala.collections.parallel 中令人惊讶的 ParList 缺失问题

c - 由于连接突发,套接字连接被拒绝