2013-03-19 25 views
10

Bir koşula bağlı olarak schedule(static) veya schedule(dynamic, 10) kullanarak yürütülebilen bir for döngüsüm var. Şu anda, Kodum (Kendini tekrar etme) yeterince ve aşağıdaki tekrarını sahiptir önceki işlevselliği içerecek şekilde KURU değildir: bu konuları okuduktan sonraopenMP koşullu pragma "if else"

boolean isDynamic; //can be true or false 
if(isDynamic){ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(dynamic, 10) 
    for(...){ 
     //for code inside 
    } 
}else{ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(static) 
    for(...){ 
     //SAME for code inside, in fact, this is the EXACT same for as before 
    } 
} 

, ben OpenMP bir #if(expression) pragma olduğunu fark:

Ama genel bir çözüm eksik gibi görünüyor. En iyi çözüm, for döngüsünün gövdesini bir fonksiyona dönüştürmektir ve daha sonra aranan işleve sahip olmaktır, ancak bu çözüm benim için yeterince iyi değildir.

Açıkçası, OpenMP'nin #if(expression) else türünde bir pragma var mı?

#if(isDynamic)pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(dynamic, 10) 
else 
pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(static) 

Ya ayrı fonksiyonu içine döngü vücut için yerimi ve bu şekilde aramak zorunda değilim: şey gibi?

cevap

4

Bu ilginç bir sorudur. Temel olarak, çalışma zamanında schedule politikasını değiştirmek istiyorsunuz. Bildiğim kadarıyla, mevcut OpenMP için böyle bir yönerge yoktur.

Yaptığınız aynı sorunu yaşadım. Çözümüm, döngü bedenini, bahsettiğin gibi bir işlev olarak ortaya koydu. Aksi takdirde, çirkin bir makro kullanmanız gerekir. Ancak, OMP_SCHEDULE ortam değişkenini okuyan schedule(runtime)'u da kullanmayı denedim. Bu nedenle, çalışma ortamındaki bu değişkeni değiştirdim ama işe yaramadı. Çünkü OpenMP çalışma zamanı bu ortamı yalnızca bir kez okur. Uygulamaya özel bir sorun olabilir. Dolayısıyla, diğer uygulama bu ortam değişkenini anında okuyabilir. Bu yaklaşımı deneyebilirsiniz.

+0

Bu öneri hakkında konuştuğunuzu varsayalım (http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196). Tbh, derlemenin bile OMP_FOR'un bile tanımlanmadığını sanmıyorum. OMP_SCHEDULE kadarıyla ilgili hiçbir fikrim yoktu. Etrafa bakıp neyi bulabileceğimi görmeye çalışacağım, thx! –