我如何使用“ op parallel”或其他方式并行循环
How do I parallelise a for loop, using `omp parallel` or otherwise?
假设我有三个整数向量:
- 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。
我的方法是:
- 分类MainVect
- 将mainvect转换为由"键"和出现数量组成的表
- 对VECT1进行排序并创建一个间接向量。在此间接向量上进行迭代给出了上升序列中的"键" s
- 现在您可以"合并"
这种方法的复杂性是o(n log n)
相关文章:
- 我如何在一个 if 语句中声明所有数字我尝试通过其他方式声明所有数字,如果一个接一个,但似乎代码有逻辑错误
- 我如何使用“ op parallel”或其他方式并行循环
- 无法以正确的方式执行其他程序
- 类定义中定义的成员函数的编译方式是否与C++中其他位置定义的成员函数不同
- 实时在语言之间流水线传输或以其他方式传输数据
- 如何根据其ARITY(或编译时已知的其他信息)以不同的方式调用函数对象
- 如何通过Visual Studio COM包装(或其他方式)在C#中使用C++属性联合
- visual在源代码中是否有预定义的#define或其他方式来了解它是为C++/CX Windows运行时编译的
- C++ 如何通过可选的typedef,使用SFINAE或其他方式选择类
- 在C++中,函数在main()中更改变量的任何其他方式
- C++如何用模板指定或其他方式实现
- 用于循环的C++没有以其他方式输出
- 如何防止以 A 类以外的任何其他方式创建 B 类的对象
- 从Java调用WinMain:可能吗?任何其他方式
- 通过办公自动化或其他方式检查MS Office许可证状态
- 当使用spirit以其他方式解析结构时,会导致输出混乱
- VBOs或者其他方式
- 通过元编程或其他方式自动注册dll模块中的静态对象工厂
- 如何通过QSignalMapper或其他方式从QMenu传递QString到Qt插槽
- c++ /(MFC dummy)和纯Win MessageBox() -如何删除消息队列或以其他方式删除现有的鼠标点击/