Основы OpenMP в Solaris

2 Ноябрь 2010

Сейчас мне приходится активно заниматься параллельными вычислениями, поэтому завожу новую рубрику. Сегодня в ней первый пост, про OpenMP в Solaris.

OpenMP – это переносимый API для разработки параллельных программ на машинах с общей памятью. Хорош он тем, что сам организует параллельную работу программы, разработчик просто указывает соответствующие прагмы. На самом деле, все не так просто, но использовать OpenMP гораздо удобнее, чем POSIX потоки.

OpenMP поддерживается практически всеми популярными компиляторами C/C++ и Fortran, включая gcc и Oracle Solaris Studio. Подробности смотрите здесь. То есть, чтобы использовать OpenMP не надо ничего дополнительно устанавливать, нужно только указать компилятору необходимые параметры.

Прежде всего, нам понадобится программа, использующая OpenMP. Я взял пример с сайта Stanford Linear Accelerator Center, программа hello.c:

#include <stdio.h>
#include <omp.h>

int main(int argc, char *argv[]) {
  int iam = 0, np = 1;

  #pragma omp parallel default(shared) private(iam, np)
  {
    #if defined (_OPENMP)
      np = omp_get_num_threads();
      iam = omp_get_thread_num();
    #endif
    printf("Hello from thread %d out of %d\n", iam, np);
  }
}

Программа очень простая, запускает несколько потоков и каждый поток печатает «Привет из потока n из m», где n – это номер потока, а m – общее количество потоков.

К сожалению, gcc поддерживает OpenMP начиная с версии 4.2, в Solaris же входит версия 3.4. На http://www.sunfreeware.com последняя версия gcc 3.4.6, которая также не поддерживает OpenMP. Поэтому я использовал Oracle Solaris Studio (платформа SPARC):

$ cc -xopenmp=parallel -xO3  hello.c -o hello

Запускаем:

$ ./hello
Hello from thread 0 out of 8
Hello from thread 5 out of 8
Hello from thread 3 out of 8
Hello from thread 7 out of 8
Hello from thread 1 out of 8
Hello from thread 4 out of 8
Hello from thread 2 out of 8
Hello from thread 6 out of 8

В этом сервере 8 процессоров, поэтому и потоков 8. Несложно заметить, что потоки выполняют вывод не по возрастанию номеров, так как порядок работы параллельных потоков не гарантируется.

Количество потоков OpenMP определяет автоматически, по количеству (виртуальных) процессоров. Но также можно задать количество потоков вручную, используя переменную окружения OMP_NUM_THREADS, например:

$ export OMP_NUM_THREADS=4
$ ./hello
Hello from thread 0 out of 4
Hello from thread 1 out of 4
Hello from thread 3 out of 4
Hello from thread 2 out of 4

Записали в переменную OMP_NUM_THREADS значение 4, OpenMP создал только 4 потока, вместо 8 по числу процессоров.

Как видите, писать параллельные программы с OpenMP достаточно просто. В дальнейшем буду еще писать про использование OpenMP, а также про другие технологии параллельных вычислений под Solaris.

Нет похожих записей.

Рубрики: Параллельные вычисления

Метки: , Оставить комментарий

Лента комментариевКомментарии (2)

  1. почтовые услуги

    А есть, какая нибудь альтернатива?

  2. solarisblog.ru

    Альтернатив много :) . Родные потоки Solaris (совершенно не переносимо, но работает быстрее всего), потоки Posix (переносимо в Unix, но работает медленнее родных потоков), Java (работает везде, но еще медленнее). OpenMP примерно посередине между Posix и Java – работает на разных платформах, медленнее Posix, но автоматически решает большую часть проблем распараллеливания.

Оставить комментарий

Feed

http://solarisblog.ru / Основы OpenMP в Solaris