2015-12-24 9 views
6

Ho una molto intenso ᴄᴘᴜ (50 milioni di chiamate e oltre 100 Marijuana fase loop) ciclo quali:Come rompere un ciclo di opemp?

for(int i=0;i<*string;i++){ 
    if(!check_some_stuff(string+i)) { 
     do_some_stuff(i,string-2); 
     if(!string) 
      break; 
     do_yet_other_stuff(string); 
    } 
} 

Come istruzioni break non sono ammessi per #pragma omp parallel for odered pensavo di poter impostare i ad un valore molto grande.

for(int i=0;i<*string;i++){ 
    if(!check_some_stuff(string+i)) { 
     do_some_stuff(i,string-2); 
     if(!string) 
      i=0x7FFFFFFB; 
     do_yet_other_stuff(string); 
    } 
} 

che funziona perfettamente senza openmp. Ma tuttavia quando aggiungo

#pragma omp parallel for ordered shared(string) 
for(int i=0;i<*string;i++){ 
    if(!check_some_stuff(string+i)) { 
     do_some_stuff(i,string-2); 
     #pragma omp critical 
     if(!string) 
      i=0x7FFFFFFB; // it seems the assignment has no effect on the value of i. 
     do_yet_other_stuff(*string); 
    } 
} 

il valore di i non sembra cambiare, quindi si trasforma in un ciclo infinito.

+1

Nella versione parallela, la modifica di 'i' avrà risultati imprevedibili poiché presumibilmente ogni iterazione dei loop viene gestita da un thread separato. La modifica del valore in un thread molto probabilmente non influirà sugli altri. –

+0

@MadPhysicist: non ha alcun effetto su nessuno dei thread. Ma io sono piuttosto alla ricerca di un'alternativa. Il contenuto dell'istruzione if non può essere spostato che se l'istruzione. – user2284570

+0

Esattamente. Se vuoi uscire correttamente dal ciclo, devi essere in grado di segnalare il thread principale in qualche modo. Con 'pragma',' i = 0x7FFFFFFB; 'diventa una modifica locale che non influenza il ciclo esterno. –

risposta

0

Questo aiuto?

int abort = 0; 
#pragma omp parallel for ordered shared(string, abort) 
for(int i=0;i<*string;i++) 
{ 
    #pragma omp flush(abort) 
    if(!abort) 
    { 
     if(!check_some_stuff(string+i)) 
     { 
      #pragma omp flush(abort) 
      if(!abort) do_some_stuff(i,string-2); 
      if(!string) abort = 1; 
      #pragma omp flush(abort) 
      if(!abort) do_yet_other_stuff(*string); 
     } 
    } 
}