OpenMP динамическая декомпозиция цикла в чанках - PullRequest
2 голосов
/ 09 апреля 2011

Я использую OpenMP для параллельного прохождения большого цикла. Допустим, у массива, над которым я работаю, всего N записей. Я хотел бы, чтобы один поток сделал первые записи N / 2, а другой поток - последние N / 2.

Я должен избегать того, чтобы потоки работали над записями, которые находятся рядом друг с другом. Размер N всегда намного больше, чем количество потоков, поэтому мне не нужно беспокоиться о блокировках, если я смогу заставить OpenMP распределять работу так, как я описал выше.

Если размер N известен во время компиляции, я могу использовать #pragma omp parallel for schedule(static,N/2). К сожалению это не так. Итак, как определить размер чанка динамически?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2011

Нет проблем, если N известно во время выполнения;Я не уверен, почему вы думаете, что это должно быть известно во время компиляции.Конструкции цикла OMP действительно были бы очень ограничены, если бы все было известно во время компиляции.

2 голосов
/ 09 апреля 2011

Если вы не хотите использовать встроенные параметры планирования openmp, как показывает @ Джонатан Дурси , тогда вы можете самостоятельно реализовать необходимые параметры:

#include <stdio.h>
#include <omp.h>
/* $ gcc -O3 -fopenmp -Wall *.c && ./a.out  */

static void doloop(int n) {
  int thread_num, num_threads, start, end, i;
#pragma omp parallel private(i,thread_num,num_threads,start,end)
  {
    thread_num = omp_get_thread_num();
    num_threads = omp_get_num_threads();
    start = thread_num * n / num_threads;
    end = (thread_num + 1) * n / num_threads;

    for (i = start; i != end; ++i) {
      printf("%d %d\n", thread_num, i);
    }
  }
}

int main() {
  omp_set_num_threads(2);
  doloop(10);
  return 0;
}

Вывод

0 0
0 1
0 2
0 3
0 4
1 5
1 6
1 7
1 8
1 9
0 голосов
/ 09 апреля 2011

У меня была похожая проблема в dotNET, и я закончил писать умный объект очереди, который возвращал бы дюжину объектов за раз, как только они были доступны.Как только у меня будет пакет, я выберу поток, который сможет обрабатывать их все за один раз.

Работая над этой проблемой, я помнил, что W-очереди лучше, чем M-очереди.Лучше иметь одну длинную очередь с несколькими работниками, чем линию для каждого работника.

...