поиск грубой силы openmp - PullRequest
0 голосов
/ 04 ноября 2019

Алгоритм перебора в сетке 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 секунд! У кого-нибудь есть предложения, как это исправить? Есть ли способ оптимизировать этот код?

...