我正在尝试优化我的数组搜索以使用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和组合添加到数组}我需要它。