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.
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. –
@MadPhysicist: Konuların hiçbirinde etkisi yoktur. Ama ben bir alternatif aramak istiyorum. If ifadesinin içeriği, ifade ifadesiyle taşınamaz. – user2284570
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. –