2014-12-02 2 views
0

Итак, у меня есть следующий код ниже для параллелизма, и мне было интересно, можно ли назначить отдельные потоки для запуска if и else с использованием OpenMP, тем самым ускоряя процесс.parallelise if else statement using OpenMP

for(i=1; i<=NI; i++) { 
    for(j=1; j<=NJ; j++) { 
     x = rand()/((float)RAND_MAX + 1); 

     if(x < 0.5) { 
      old[i][j] = 0; 
     } else { 
      old[i][j] = 1; 
     } 
    } 
} 
+0

удалите предложения if-else и используйте 'old [i] [j] = 1-x <0.5;' или 'old [i] [j] = x> = 0.5' ;. –

ответ

3

Зачем вам это нужно? Код не работает как ветви if, он запускает первый, либо else. Вместо этого используйте omp parallel for, чтобы распараллелить цикл.

#pragma omp parallel for private(i,j,x) shared(old) 
for(i=1; i<=NI; i++) { 
    for(j=1; j<=NJ; j++) { 
     x = rand()/((float)RAND_MAX + 1); 

     if(x < 0.5) { 
      old[i][j] = 0; 
     } else { 
      old[i][j] = 1; 
     } 
    } 
} 

Можно также объявить x и управляющие переменные цикла i и j внутри цикла и избежать пункт в C99 private(). По умолчанию все равно i, но мне нравится быть явным.

+0

Это также возможно сделать без условной ветви с помощью 'old [i] [j] = 1-x <0.5;' –

+0

@Zboson просто вещь стиля. Нет причин, по которым я бы исправил стиль программирования OP в своем ответе. Сгенерированная сборка идентична. –

+0

Сборка идентична? Это интересно (+1). Я не выбрал компилятор. –