openMP: вызов параллельной функции из параллельной области - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь сделать мою последовательную программу параллельной с openMP. Вот код, где у меня большая параллельная область с несколькими внутренними разделами «#pragma omp for». В серийной версии у меня есть функция fftw_shift (), в которой тоже есть циклы for.

Вопрос заключается в том, как правильно переписать функцию fftw_shift (), чтобы уже существующие потоки во внешней параллельной области могли разделять циклы «внутри» без вложенных потоков.

Я не уверен, что моя реализация работает правильно. Есть способ встроить всю функцию в параллельную область, но я пытаюсь понять, как с этим справиться в описанной ситуации.

int fftw_shift(fftw_complex *pulse, fftw_complex *shift_buf, int 
array_size)
{
 int j = 0;              //counter
 if ((pulse != nullptr) || (shift_buf != nullptr)){
 if (omp_in_parallel()) {

 //shift the array
 #pragma omp for private(j) //shedule(dynamic)
 for (j = 0; j < array_size / 2; j++) {
  //left to right
  shift_buf[(array_size / 2) + j][REAL] = pulse[j][REAL]; //real
  shift_buf[(array_size / 2) + j][IMAG] = pulse[j][IMAG]; //imaginary

  //right to left
  shift_buf[j][REAL] = pulse[(array_size / 2) + j][REAL]; //real
  shift_buf[j][IMAG] = pulse[(array_size / 2) + j][IMAG]; //imaginary
 }
 //rewrite the array
 #pragma omp for private(j) //shedule(dynamic)
 for (j = 0; j < array_size; j++) {
  pulse[j][REAL] = shift_buf[j][REAL]; //real
  pulse[j][IMAG] = shift_buf[j][IMAG]; //imaginary
 }

 return 0;
 }
}

....
#pragma omp parallel firstprivate(x, phase) if(array_size >= 
OMP_THREASHOLD) 
{
 // First half-step
 #pragma omp for schedule(dynamic)
 for (x = 0; x < array_size; x++) {
  ..
 }

 // Forward FTW
 fftw_shift(pulse_x, shift_buf, array_size);
 #pragma omp master
 {
  fftw_execute(dft);
 }
 #pragma omp barrier
 fftw_shift(pulse_kx, shift_buf, array_size);
 ...
}

1 Ответ

1 голос
/ 16 июня 2019

Если вы вызываете fftw_shift из parallel региона - но не из конструкции разделения работы (т.е. не из parallel for), тогда вы можете просто использовать omp for так же, как если бы вы находились внутри параллельной области , Это называется осиротевшей директивой.

Однако ваши циклы просто копируют данные, поэтому не ожидайте идеального ускорения в зависимости от вашей системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...