大阵列并行omp

时间:2016-10-06 13:42:54

标签: c arrays algorithm search openmp

我正在尝试优化我的数组搜索以使用omp生成最快的算法。现在它需要太长时间(4核上大约5-10分钟,Linux线程8线程)

我有一个大的二维数组 组合 ,它存储一个组合及其id(与数组索引无关)。

在这个数组中,我需要找到具有相同值但具有不同id的组合。

数组或组合 combinationSize 的大小可以在600 000到3 000 000之间变化。但是,ID介于0和500之间。

所以我尝试了以下内容。它的工作有点不错,尺寸低于90k(约5s),但更大的阵列需要永远。

#pragma omp parallel for schedule(dynamic)
for(unsigned int i=0; i<combinationsSize; i++)
{
    for(unsigned int j=i+1; j<combinationsSize; j++)
    {   
        // if different ids
        if(combinations[i][1] != combinations[j][1])
        {
            // if the same combination
            if(combinations[i][0] == combinations[j][0])
            {
               // omp critical add to another array
            }
        } 
     } 
  }

我也可以选择将组合存储在3D数组中 它以id的顺序存储,但第二个术语可以有任何大小,具体取决于它有多少组合。 然而,这导致了长时间的计算(我猜是由于缓存)这里是代码:

    for(int id1=0; id1<maxIDs; id1++)
    { 
        #pragma omp parallel for schedule(dynamic,1)
        for(unsigned int i=0; i<idSizes[id1]; i++)
        {  
            for(int id2=id1+1; id2<maxIDs; id2++)
            {   
                for(unsigned int j=0; j<idSizes[id2]; j++)
                {
                    if(combinations[id1][i][0] == combinations[id2][j][0])
                    {
                        //omp critical add to another array
                    }
                }
             }
        }
  }

idSizes =是一个数组,用于存储3D数组中每个ID组合的大小

maxIDs = 500

我尝试了许多不同的方法(逻辑以及尝试和错误)并行,调度动态等没有结果。

重新说一句:我的目标是在数组中优化这种搜索,以便它可以在几秒钟内完成任务,如果可能的话。它存储在2D和3D数组中,因为其他信息随之存在,但它在这个问题的范围内并不重要。

编辑,抱歉应该提到这一点:关于关键问题,我有一个omp关键{将这些ID和组合添加到数组}我需要它。

0 个答案:

没有答案