Алгоритм перебора в сетке 388 x 400, где координата (x, y) содержит вектор из 7 чисел (это поиск куба 388 x 400 x 7). Код занимает 5 различных точек сетки (10 для циклов), и если 4 (или более) числа находятся в каждом векторе, выводит их на печать.
for(int x1=6; x1<100; x1++) { `
for(int y1=6; y1<100; y1++) {
for(int x2=x1+1; x2<100; x2++) {
for(int y2=y1+1; y2<100; y2++) {
for(int x3=x2+1; x3<100; x3++) {
for(int y3=y2+1; y3<100; y3++) {
x41=x3+1;
y41=y3+1;
x51=x41+1;
y51=y41+1;
StartTimer();
printf("\nx1= %d %d %d %d %d %d %d %d ",x1,y1,x2,y2,x3,y3,x41,y41);
#pragma omp target data map(to: w1[0:1059002],x1,y1,x2,y2,x3,y3,x41,y41,x51,y51) map(tofrom: p[0:50])
#pragma omp target teams distribute parallel for collapse(4) schedule(static,1)
for(int x4=x41; x4<388-1; x4++) {
for(int y4=y41; y4<400-1; y4++) {
for(int x5=x51; x5<388; x5++) {
for(int y5=y51; y5<400; y5++) {
if ( x1<x2 && y1<y2 && x2<x3 && y2<y3 && x3<x4 && y3<y4 && x4<x5 && y4<y5 )
{
int lo[50];
for(int i=0; i<50; i++)
{ lo[i]=0; //printf(" %d",lo[i]);
}
for(int i=1; i<8 ; i++){
lo[ w1[(x1-6)*395*7+(y1-6)*7+i] ] = lo[ w1[(x1-6)*395*7+(y1-6)*7+i] ] +1;
lo[ w1[(x2-6)*395*7+(y2-6)*7+i] ] = lo[ w1[(x2-6)*395*7+(y2-6)*7+i] ] +1;
lo[ w1[(x3-6)*395*7+(y3-6)*7+i] ] = lo[ w1[(x3-6)*395*7+(y3-6)*7+i] ] +1;
lo[ w1[(x4-6)*395*7+(y4-6)*7+i] ] = lo[ w1[(x4-6)*395*7+(y4-6)*7+i] ] +1;
lo[ w1[(x5-6)*395*7+(y5-6)*7+i] ] = lo[ w1[(x5-6)*395*7+(y5-6)*7+i] ] +1;
}
int l[50];
int cnt1;
cnt1=0;
for(int j=1; j<50; j++)
{
if ( lo[j] == 5 )
{
cnt1=cnt1+1;
l[cnt1]=j;
}
}
if ( cnt1 >3){
for(int k=1; k<cnt1+1; k++)
{
if ( p [ l[k] ] == 0 ) { p [ l[k] ]=1; };
}
}
} // end if x1,y1
} //y2
} //x2
} //y1
} //x1
double runtime = GetTimer();
printf(" total: %f s ", runtime / 1000.f);
for(int k=0; k<50; k++)
{
if ( p[k] > 0) printf(" %d",k);
}
}
}
}
}
}
Я получаю эти координаты результатов x1, y1, x2, y2, x3, y3, x4, y4 6 6 7 7 8 8 9 9 всего: 61,731705 с 6 6 7 7 8 9 9 10 всего: 38,487563 с 6 6 7 7 8 10 9 11 всего: 10,524680 с 6 6 7 78 11 9 12 всего: 702.508306 с 6 6 7 7 8 12 9 13 всего: 679.396676 с 6 6 7 7 8 13 9 14 всего: 655.000846 с 6 6 7 7 8 14 9 15 всего: 658,374791 с
время прыгает с 10 до 702 секунд! У кого-нибудь есть предложения, как это исправить? Есть ли способ оптимизировать этот код?