Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Распараллеливание программ. Учебник

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
111


         

 


 
schedule(kind [, chunk_size])
 
Тип Описание
static Пространство итераций цикла разделяется на фрагменты размером
chunk_size и эти фрагменты статически присваиваются нитям, используя карусельный алгоритм (round-robin) в порядке номеров нитей. Если chunk_ size не указан, пространство итераций делится на приблизительно равные фрагменты и нити присваивается один фрагмент.
dynamic Пространство итераций цикла разделяется на фрагменты размером
chunk_size, и эти фрагменты присваиваются нитям по запросу. Выполнив один фрагмент, нить может запросить другой, и так пока остаются еще не выполненные фрагменты. Все фрагменты содержат по chunk\_size итера­ций, кроме может быть последнего. Если chunk\_size не указан, он полага­ется равным 1.
guided Здесь тоже фрагменты присваиваются нитям по запросу. Однако размер
фрагмента определяется как число еще не распределенных итераций де­ленное на число нитей в команде, уменьшенное на единицу. Необязатель­ный параметр chunk_size задает минимально возможное число итераций во фрагменте (кроме, может быть, последнего фрагмента). Если chunk_size не указан, он полагается равным 1.
runtime Решение о планировании откладывается до времени выполнения. Во
время выполнения решение принимается с учетом умолчание системы и значения переменной окружения OMP_SCHEDULE.
112

       

nowait



ordered

                      
 

 
#pragma omp threadprivate(list)

 
default(private | shared | none)

default(shared | none)
   
113
      


  
shared(list)

             
private(list)


  
firstprivate(list)

  
lastprivate(list)
            
114

              
   
reduction(operator:list)

Оператор Начальное значение
+ 0
* 1
- 0
& ~0
| 0
^ 0
&& 1
|| 0

                   
115
 
        
copyin(list)
 

   
copyprivate(list)
   

            


                                 
116
Функции времени выполнения OpenMP

void omp_set_num_threads(int num_threads);


int omp_get_num_threads(void);}

int omp_get_max_threads(void);


int omp_get_thread_num(void);

int omp_get_num_procs(void);

int omp_in_parallel(void);
  
void omp_set_dynamic(int dynamic_threads);
 
int omp_get_dynamic(void);
 
void omp_set_nested(int nested);
      
int omp_get_nested(void);
     

      
117
 
void omp_init_lock(omp_lock_t *lock); void omp_init_nest_lock(omp_nest_lock_t *lock);}


void omp_destroy_lock(omp_lock_t *lock); void omp_destroy_nest_lock(omp_nest_lock_t *lock);
     

void omp_set_lock(omp_lock_t *lock); void omp_set_nest_lock(omp_nest_lock_t *lock);

void omp_unset_lock(omp_lock_t *lock); void omp_unset_nest_lock(omp_nest_lock_t *lock);

int omp_test_lock(omp_lock_t *lock); int omp_test_nest_lock(omp_nest_lock_t *lock);


double omp_get_wtime(void);

double omp_get_wtick(void);


Комбинированные конструкции
               
 
118
Простые примеры использования OpenMP


for(i=0;I<N;i++) { a[i] = a[i] + b[i];}
  
#pragma omp parallel
{
int id, i, Nthrds, istart, iend; id = omp_get_thread_num(); Nthrds = omp_get_num_threads();
istart = id * N / Nthrds;
iend = (id+1) * N / Nthrds; for(i=istart;I<iend;i++) { a[i] = a[i] + b[i];}
}
       
#pragma omp parallel for schedule(static)
for(i=0;I<N;i++) { a[i] = a[i] + b[i];}
π
π 
C Программа Pi выполняет в цикле вычисления площадей C элементарных треугольников и их суммирование
real tt1(2), tt2(2) integer*4 intrvls, cut double precision sumall, width, f, x
C
f(x) = 4d0 / (1d0 + x * x)
C
read(*, *) intrvls t2 = etime(tt1)
C Вычисление ширины элементарного прямоугольника
width = 1.d0 / intrvls sumall = 0.d0
C
do 100 cut = 1, intrvls sumall = sumall + width * f((cut - 0.500) * width)
100 continue
C
119
t1 = etime(tt2) write(6,*) 'Time = ', t1 - t2, ', sum = ', sumall write(6,*) 'Error = ', sumall - 3.14159265358979323d0 stop end


g77 -O2 p1.f -o p1-gnu.exe ifort /O2 /Qopenmp p1.f
                   
C Программа Pi выполняет в цикле вычисления площадей C элементарных треугольников и их суммирование
real tt1(2), tt2(2) integer*4 intrvls, cut double precision sumall, width, f, x
C
f(x) = 4d0 / (1d0 + x * x)
C
read(*, *) intrvls t2 = etime(tt1)
C Вычисление ширины элементарного прямоугольника
width = 1.d0 / intrvls
sumall = 0.d0 C$OMP PARALLEL DO PRIVATE(cut) & C$OMP SHARED(width,sumall,intrvl)
do 100 cut = 1, intrvls
C$OMP ATOMIC
sumall = sumall + width * f((cut - 0.500) * width) 100 continue
t1 = etime(tt2)
write(6,*) 'Time = ', t1 - t2, ', sum = ', sumall
write(6,*) 'Error = ', sumall - 3.1415926535897932d0
stop
end
             
120
  
C Программа Pi выполняет в цикле вычисления площадей C элементарных треугольников и их суммирование
real tt1(2), tt2(2) integer*4 intrvls, cut double precision sumall, width, f, x
C
f(x) = 4d0 / (1d0 + x * x)
C
read(*, *) intrvls t2 = etime(tt1)
C Вычисление ширины элементарного прямоугольника
width = 1.d0 / intrvls
sumall = 0.d0 C$OMP PARALLEL DO PRIVATE(cut) SHARED(width,intrvl) & C$OMP REDUCTION(+:sumall)
do 100 cut = 1, intrvls
sumall = sumall + width * f((cut - 0.500) * width) 100 continue
t1 = etime(tt2)
write(6,*) 'Time = ', t1 - t2, ', sum = ', sumall
write(6,*) 'Error = ', sumall - 3.14159265358979323d0
stop
end
       

     
for(i = start; i <= end; i += 2) { limit = (int) sqrt((float)i) + 1; prime = 1; /* assume number is prime */
j = 3;
while (prime && (j <= limit)) { if (i%j == 0) prime = 0;
j += 2; }
if (prime) {
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]