假设我有三个整数向量:


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 cloud计算机,n1-standard-4(4个vCPU,15 GB内存)..运行以上代码时,CPU利用率仅为27%。

最佳答案

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

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

如果我对它的理解正确,那么您正在计算vect1中某个元素在mainVect中出现的次数。由于您不需要知道位置,因此可以重新排列mainVect(的副本)。

我的方法是:


排序mainVect
将mainVect转换为包含“键”和出现次数的表
排序vect1并创建一个间接向量。迭代此间接向量会按升序给出“键”
现在您可以“合并”


此方法的复杂度为O(n log n)

08-16 00:37