2015-12-24 24 views
6

Ben gibi döngü için çok ᴄᴘᴜ yoğun (50 milyon aramalar ve 100'den fazla bilions döngü faz) sahiptir: break ifadesi olarakDöngü için bir opemp nasıl çıkarılır?

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); 
    } 
} 

#pragma omp parallel for odered için izin verilmez ben hiç i set düşündüm çok büyük bir değer. mükemmel OpenMP olmadan çalışır

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); 
    } 
} 

. Ama ancak

#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); 
    } 
} 
i değeri değiştirmek gibi görünüyor gelmez

eklemek, bu yüzden sonsuz bir döngüye döndüğünde.

+1

Paralel versiyonda, 'i' değişmesi, muhtemelen döngülerin her yinelemesinin ayrı bir iş parçacığı tarafından ele alınmasından dolayı beklenmedik sonuçlara sahip olacaktır. Bir iş parçacığındaki değerin değiştirilmesi büyük olasılıkla diğerlerini etkilemez. –

+0

@MadPhysicist: Konuların hiçbirinde etkisi yoktur. Ama ben bir alternatif aramak istiyorum. If ifadesinin içeriği, ifade ifadesiyle taşınamaz. – user2284570

+0

Tam olarak. Döngüden düzgün bir şekilde ayrılmak isterseniz, ana meseleyi bir şekilde işaretleyebilmeniz gerekir. Pragma ile, i = 0x7FFFFFFB; 'dış döngüyü etkilemeyen yerel bir değişiklik olur. –

cevap

0

Bu yardımcı olur mu?

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); 
     } 
    } 
} 
İlgili konular