Лабораторная работа № 4

Программирование многоядерных архитектур

Цель работы. Использование интерфейса OpenMP для программирования простых многопоточных приложений.

 

Методические указания.

Интерфейс OpenMP

       OpenMP – интерфейс прикладного программирования (API) для масштабируемых SMP-систем (симметричные мультипроцессорные системы) в модели общей памяти.

Исполняемый процесс в памяти может состоять из множественных нитей, которые имеют общее адресное пространство, но разные потоки команд и раздельные стэки. В простейшем случае, процесс состоит из одной нити, выполняющую функцию main. Нити иногда называют также потоками, легковесными процессами, LWP (light-weight processes). OpenMP основан на существовании множественных потоков в общедоступной памяти [3]. Схема процесса представлена на рисунке.

Рисунок 8.

Все программы OpenMP начинаются как единственный процесс с главным потоком. Главный поток выполняется последовательно, пока не сталкиваются с первой областью параллельной конструкции. Создание нескольких потоков (FORK) и объединение (JOIN) проиллюстрировано на рисунке.

Рисунок 9.

 

Примеры программ с использованием OpenMP

Определение и печать номера потока

#include <omp.h>

#include <stdio.h>

void main () 

{

  int nthreads, tid;

  /* Fork a team of threads giving them their own copies of variables */

  #pragma omp parallel private(tid)

  {

 

        /* Obtain and print thread id */

        tid = omp_get_thread_num();

        printf("Hello World from thread = %d\n", tid);

        /* Only master thread does this */

        if (tid == 0)

        {

               nthreads = omp_get_num_threads();

               printf("Number of threads = %d\n", nthreads);

        }

  } /* All threads join master thread and terminate */

}

Распределение работы

#include <stdio.h>

#include <omp.h>

#define CHUNKSIZE 100

#define N 1000

void main () 

{

  int i, chunk;

  float a[N], b[N], c[N];

 

  /* Some initializations */

  for (i=0; i < N; i++)

        a[i] = b[i] = i * 1.0;

  chunk = CHUNKSIZE;

 

  #pragma omp parallel shared(a,b,c,chunk) private(i)

  {

        #pragma omp for schedule(dynamic,chunk) nowait

        for (i=0; i < N; i++)

               c[i] = a[i] + b[i];

  } /* end of parallel section */

}

 

Использование секций

#include <stdio.h>

#include <omp.h>

#define N 1000

 

void main ()

{

  int i;

  float a[N], b[N], c[N], d[N];

 

  /* Some initializations */

  for (i=0; i < N; i++)

  {

        a[i] = i * 1.5;

        b[i] = i + 22.35;

  }

 

  #pragma omp parallel shared(a,b,c,d) private(i)

  {

 

        #pragma omp sections nowait

        {

 

               #pragma omp section

               for (i=0; i < N; i++)

                      c[i] = a[i] + b[i];

 

               #pragma omp section

               for (i=0; i < N; i++)

                      d[i] = a[i] * b[i];

 

        } /* end of sections */

  } /* end of parallel section */

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: