Ярлыки pragma omp в c

У меня есть несколько глобальных переменных, которые мне нужно использовать в параллельном разделе моей программы. Итак, я написал это:

#define N 2000
int x[N], matrix[N][N]

int main(int argc, char **argv)   
...
#pragma omp parallel
{
  #pragma omp privatethread(x,matrix)
  #pragma omp for
  for(int k=0; k<100;++k)
    /*some function to modify values of x and matrix differently 
     from run to run*/
  ...
}
...

Часть с #pragma эквивалентна:

...
#pragma omp privatethread(x,matrix) parallel for
...

Есть ли разница между объявлением #pragma omp parallel, затем #pragma omp privatethread и объявлением сначала #pragma omp privatethread, а затем #pragma omp parallel для? Должен ли я ставить {после части приватного чтения?

#pragma omp privatethread(x,matrix)
{ //<-- here
#pragma omp for

Наконец, это хороший способ работать с большими векторами в c или лучше использовать malloc внутри моей pragma omp и удалить часть privatethread? (пожалуйста, дайте мне знать, если я лучше задам этот заключительный вопрос в новом посте)


person Francesco Di Lauro    schedule 29.09.2016    source источник


Ответы (1)


1. Приведенный ниже код дает вам ошибку. Даже если вы удалите for.

...
#pragma omp privatethread(x,matrix) parallel for
...

Объявление должно соответствовать этому синтаксису

#pragma omp threadprivate (list)

2. нет разницы между,

#pragma omp parallel
{
   #pragma omp privatethread(list)
   //CODE
}

а также

#pragma omp privatethread(list) 
#pragma omp parallel
{
  //CODE
} 

Как видите, вам не нужно ставить {скобки после #pragma omp privatethread. Этот оператор не запускает какой-либо код параллельно, он просто делает глобальную переменную области локальной и постоянной для потока. .

person Naveen v patil    schedule 24.02.2017