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.
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. –
@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
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. –