Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Распараллеливание программ. Учебник
.pdf
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) {
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
