2012-02-20 4 views
4

У меня есть код, который я хочу оптимизировать, который должен работать в разных томах. После выполнения некоторых тестов с использованием разных методов планирования в цикле for, который у меня есть, я пришел к выводу, что наиболее подходящим является выполнение динамического планирования, когда у меня есть только один поток и управляемый иначе. Возможно ли это в openMP?Выберите OpenMP pragma в соответствии с условием

Чтобы быть более точным, я хочу, чтобы иметь возможность сделать что-то вроде следующего:

if(omp_get_max_threads()>1) 
#pragma omp parallel for .... scheduling(guided) 
else 
#pragma omp parallel for .... scheduling(dynamic) 
for(.....){ 
    ... 
} 

Если кто-то может помочь мне, я был бы признателен. Другим решением было бы написать два раза цикл for и использовать условие if. Но я хочу избежать этого, если это возможно.

+1

Единственный метод, который я могу думать о том, чтобы дублировать петлю в Условный оператор ... – Mysticial

+0

Вот что я имел в виду и в конце. Плохо, я немного устал. Я знаю, что это одно решение, но оно увеличит также сложность и размер кода. Вот почему это мое последнее средство. – gkaran89

+0

Я думаю, что @Mysticial имеет правильную идею. #pragma обычно управляет событиями, которые происходят во время компиляции, поэтому код, сгенерированный для цикла 'for', вероятно, будет отличаться между двумя - вы используете условие времени выполнения для выбора #pragma самостоятельно. –

ответ

8

Возможное решение состоит в том, чтобы скопировать цикл в оператор if и «извлечь» тело цикла в функцию, чтобы избежать нарушения принципа DRY. Тогда будет только одно место, где вы должны изменить этот код, если вам нужно изменить его в будущем:

void foo(....) 
{ 
    ... 
} 

if(omp_get_max_threads()>1) 
{ 
    #pragma omp parallel for .... scheduling(guided) 
    for (.....) 
     foo(....); 
} 
else 
{ 
    #pragma omp parallel for .... scheduling(dynamic) 
    for (.....) 
     foo(....); 
} 
+0

+1 для размещения только тела цикла в вызове функции. Добавьте это к вашему ответу, поскольку он похоронен под комментариями. – Mysticial

+0

@Mysticial: Выполнено. Должно быть достаточно ясно сейчас. Не стесняйтесь редактировать его, если вы думаете, что его нужно отредактировать;) – LihO

Смежные вопросы