Я должен добавить OpenMP к коду клиента.У него есть пара макросов, которые работают примерно так:
int i, imax;
#ifdef MAC1
double x1, y1
#endif
#ifdef MAC2
double x2, y2
#endif
//first loop:
for (i=0; i<imax; i++ ) {
#ifdef MAC1
//process x1, y1
#endif
#ifdef MAC2
//process x2, y2
#endif
//do a ton of other stuff
}
// Lots more code. No way it will all work in one omp region.
//second loop:
for (i=0; i<imax; i++ ) {
#ifdef MAC1
//process x1, y1
#endif
#ifdef MAC2
//process x2, y2
#endif
//do a ton of other stuff
}
Вполне возможно, что MAC1
и MAC2
могут быть оба определены, или либо, либо ни того, ни другого.
Итак, теперь я хочу запустить циклы под OpenMP.Обычно это не сработает:
#pragma omp parallel private(x1, y1, \
x2, y2, \
and a \
ton of \
other stuff)
{
...
}
... потому что, если MAC1
и / или MAC2
не определены, компилятор жалуется, что x1, y1
и / или x2, y2
не определены.
Я думал о нескольких способах обойти это, которые либо не будут работать, либо не соответствуют стандартам:
1) Я не могу просто вставить определения этих переменных в ompпараллельная область, потому что, как я уже сказал, мне придется использовать их во второй области позже, и я не могу переопределить их там.
2) Я думаю, я мог бы вытащить эти переменные за пределы их макроблоков и определитьим ли они нужны или нет.Это было бы самое простое решение, но это похоже на «взлом».И я подозреваю, что в принципе бывают ситуации, когда это все равно не сработает.
3) Думаю, я мог бы написать несколько прагм omp, по одной для каждой комбинации макросов, заключенных в четыре разных #ifdefs
, нотогда мне нужны четыре разные дополнительные прагмы, и код будет очень быстро запутываться.
4) Я пытался сделать что-то вроде
#pragma omp parallel private(the other stuff) \
#ifdef MAC1
private(x1, y1) \
#endif
#ifdef MAC2
private(x2, y2) \
#endif
{ ... }
Это все равно было бы не очень приятно смотретьв, но это было бы намного лучше, чем четыре разные дополнительные прагмы.Тем не менее, я попробовал несколько вариантов синтаксиса этого, но компилятор понятия не имел, что я пытался сделать.
Кто-нибудь знает чистый способ сделать то, что я пытаюсь сделать здесь?