【发布时间】:2018-05-22 19:12:19
【问题描述】:
假设我有三个整数向量:
- 大小为 800 万个元素的 mainVect
- 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 循环同时运行,例如
for ( i = 0; i < vect1.size()/4; i++)
{
}
for ( i = vect1.size()/4; i < vect1.size()/2; i++)
{
}
.... and so on
或任何其他方法...
附: Windows google cloud machine, n1-standard-4 (4 vCPUs, 15 GB memory) .. 运行上述代码时 CPU 利用率仅为 27%。
【问题讨论】:
-
如果您不编写使用多线程的代码,那么您拥有多少内核是无关紧要的。我不是这种语法方面的专家,但怀疑你写的内容告诉编译器如何并行化你的循环,而不是只告诉编译器如果你 并行化它们应该如何共享这些变量。
-
CPU 使用率只有 27% 暗示您的并行化不起作用...
-
你能排序
mainVect吗? -
对于矢量运算,您可以使用 gpu。
-
我认为任何数量的线性加速都无济于事 - 你有 12000 亿次 次迭代。优化使用四个核心将等待时间减少到相当于三千亿。 (每次迭代一纳秒 - 我认为这是乐观的 - 从三个多小时到不到一小时。)另一方面,首先计算
mainVect的元素,然后进行 150 万次表查找可能会缩短时间几秒钟。
标签: c++ multithreading parallel-processing