Функция без параллелизации цикла? - PullRequest
0 голосов
/ 27 ноября 2018

, учитывая приведенный ниже код, можем ли мы считать его параллельным, даже если циклов нет?

#include <omp.h>

int main(void) {
  #pragma omp parallel
  {
    int a = 1;
    a = 0;
  }
  return 0;
}

1 Ответ

0 голосов
/ 27 ноября 2018

Прямой ответ:

Да, здесь, раздел вашего кода,

int a = 1;
a = 0;

Работает параллельно, P раз, где P - числоядер на вашем компьютере.

Например, на четырехъядерном компьютере следующий код (с соответствующим импортом),

int main(void) {
    #pragma omp parallel
    {
        printf("Thread number %d", omp_get_thread_num());
    }
    return 0;
}

выведет:

Thread number 0
Thread number 1
Thread number 2
Thread number 3

Обратите внимание, что при параллельной работе не гарантируется порядок вывода, поэтому вывод также может быть примерно таким:

Thread number 1
Thread number 2
Thread number 0
Thread number 3

Кроме того, если вы хотите указать количество используемых потоковв параллельной области вместо #pragma omp parallel вы можете написать #pragma omp parallel num_threads(4).


Дальнейшее объяснение:

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

#pragma omp parallel сообщает компилятору, что следующий блок кода может выполняться параллельно.Это гарантирует, что весь код в параллельной области завершит выполнение перед продолжением следующего кода.

В следующем (игрушечном) примере программисту гарантируется, что после параллельной области в массиве будут установлены все записив ноль.

int *arr = malloc(sizeof(int) * 128); 
const int P = omp_get_max_threads();

#pragma omp parallel num_threads(P)
{
    int local_start = omp_get_thread_num();
    int local_end = local_start + (100 / P);
    for (int i = local_start; i < local_end; ++i) {
        arr[i] = 0;
    }

}
// any code from here onward is guaranteed that arr contains all zeros!

Игнорируя различия в расписании, эту задачу можно было бы эквивалентно выполнить с помощью параллельного цикла for следующим образом:

int *arr = malloc(sizeof(int) * 128); 
const int P = omp_get_max_threads();

#pragma omp parallel num_threads(P) for
for (int i = 0; i < 128; ++i) {
    arr[i] = 0;
}
// any code from here onward is guaranteed that arr contains all zeros!

По существу, #pragma omp parallel позволяет описывать области кода, которыеможет выполняться параллельно - это может быть гораздо более гибким, чем параллельный цикл for.Напротив, #pragma omp parallel for обычно следует использовать для распараллеливания циклов с независимыми итерациями.

Я могу более подробно рассказать о различиях в производительности, если хотите.

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