SlideShare a Scribd company logo
‫درس‬3-‫نوی‬ ‫برنامه‬
‫در‬ ‫موازی‬OpenMP
Fundamentals of Parallelism & Code Optimization
(C/C++,Fortran)
‫در‬ ‫کدها‬ ‫سازی‬ ‫بهینه‬ ‫و‬ ‫سازی‬ ‫موازی‬ ‫مبانی‬
‫زبانهای‬C/C++,Fortran
Amin Nezarat (Ph.D.)
Assistant Professor at Payame Noor University
aminnezarat@gmail.com www.astek.ir - www.hpclab.ir
‫عناوین‬
‫دوره‬
1.‫های‬ ‫پردازنده‬ ‫معماری‬ ‫با‬ ‫آشنایی‬
‫اینتل‬
2.Vectorization‫معماری‬ ‫در‬
‫اینتل‬ ‫کامپایلرهای‬
3.‫نویسی‬ ‫برنامه‬ ‫با‬ ‫کار‬ ‫و‬ ‫آشنایی‬
‫در‬OpenMP
4.‫با‬ ‫داده‬ ‫تبادل‬ ‫قواعد‬ ‫و‬ ‫اصول‬
‫حافظه‬(Memory Traffic)
‫و‬ ‫هسته‬ ‫رابطه‬
Process‫ها‬
‫سلایر‬ ‫کد‬ ،‫سلایر‬ ‫پردازنده‬
‫محاسباتی‬ ‫های‬ ‫پلتفرم‬
‫سلایر‬ ‫کد‬ ،‫موازی‬ ‫پردازنده‬
‫کد‬ ،‫موازی‬ ‫پردازنده‬
‫موازی‬
Thread‫مقابل‬ ‫در‬ ‫ها‬
Process‫ها‬
‫اول‬ ‫گزینه‬:‫بین‬ ‫داده‬ ‫تقسیم‬T/P
Examples: computational fluid dynamics (CFD), image processing.
Thread‫مقابل‬ ‫در‬ ‫ها‬
Process‫ها‬
‫دوم‬ ‫گزینه‬:‫بین‬ ‫داده‬ ‫گذاری‬ ‫اشتراک‬ ‫به‬T/P
Examples: particle transport simulation, machine learning (inference).
‫ایجاد‬Thread‫ها‬
‫های‬ ‫کتابخانه‬ ‫و‬ ‫ها‬ ‫چارچوب‬
‫ساخت‬Thread‫ها‬
FunctionalityFramework
Asynchronous functions; only C++C++11 Threads
Fork/join; C/C++/Fortran; LinuxPOSIX Threads
Async tasks, loops, reducers, load balance; C/C++Cilk Plus
Trees of tasks, complex patterns; only C++TBB
Tasks, loops, reduction, load balancing, affinity,
nesting, C/C++/Fortran (+SIMD, offload)
OpenMP
‫ساده‬ ‫مثال‬“Hello World”‫در‬OpenMP‫در‬
‫زبان‬C++
Directive‫صورت‬ ‫به‬ ‫مختلف‬ ‫زبانهای‬ ‫های‬
‫زیر‬‫است‬
- C/C++: #pragma omp
- Fortran free form: !$omp
‫برای‬‫های‬ ‫سویچ‬ ‫از‬ ‫کردن‬ ‫کامپایل‬
‫کنید‬ ‫استفاده‬ ‫زیر‬
- GNU: -fopenmp
- Intel: -qopenmp
- Cray: -h omp
- PGI: -mp[=nonuma,align,allcorembind]
#include <omp.h>
#include <cstdio>
int main(){
// This code is executed by 1 thread
const int nt=omp_get_max_threads();
printf("OpenMP with %d threadsn", nt);
#pragma omp parallel
{ // This code is executed in parallel
// by multiple threads
printf("Hello World from thread %dn",
omp_get_thread_num());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
‫برنامه‬ ‫کامپایل‬Hello World‫در‬
OpenMP
amin@astek% icpc -qopenmp hello_omp.cc
amin@astek% export OMP_NUM_THREADS=5
amin@astek% ./a.out
OpenMPwith 5 threads
Hello World from thread 0 Hello World from
thread 3 Hello World from thread 1 Hello World
from thread 2 Hello World from thread 4
OMP_NUM_THREADS controls number of OpenMP threads (default: logical CPU count)
‫ساده‬ ‫مثال‬“Hello World”‫در‬OpenMP‫زبان‬ ‫در‬
Fortran
‫ساختار‬ ‫از‬ ‫ای‬ ‫خالصه‬
OpenMP
‫در‬ ‫سازی‬ ‫موازی‬ ‫مختلف‬ ‫روشهای‬
OpenMP
1-‫از‬ ‫استفاده‬Directive‫های‬
‫کامپایلری‬
2-‫کامپایلری‬ ‫شرایط‬ ‫از‬ ‫استفاده‬
‫با‬‫ماکروها‬C/C++Fortran
#pragma omp parallel [clause]!$omp parallel [clause]Compiler Directive
#ifdef _OPENMP
OpenMP specific code
#else
Code without OpenMP
#endif
!$
*$
c$
Conditional Macro
‫گذاری‬ ‫اشتراک‬
‫متغیر‬
‫پیش‬ ‫ذخیره‬ ‫فضای‬
‫فرض‬
-‫صورت‬ ‫به‬ ‫متغیرها‬ ‫اغلب‬share‫شوند‬ ‫می‬ ‫تعریف‬
-‫متغیرهای‬global‫بین‬thread‫گذاشته‬ ‫اشتراک‬ ‫به‬ ‫ها‬
‫شوند‬ ‫می‬
•C:‫متغیرهای‬static‫فایل‬ ‫محدوده‬ ‫در‬share‫هستند‬
•Fortran:‫متغیرهای‬SAVE‫و‬MODULE‫محدوده‬ ‫در‬
‫بالکهای‬COMMON
•‫پویا‬ ‫صورت‬ ‫به‬ ‫متغیرها‬ ‫آنها‬ ‫دوی‬ ‫هر‬ ‫در‬
‫شوند‬ ‫می‬ ‫داده‬ ‫تخصیص‬
-‫فرض‬ ‫پیش‬ ‫صورت‬ ‫به‬ ‫متغیرها‬private‫هستند‬
‫پیش‬ ‫ذخیره‬ ‫فضای‬
‫فرض‬
int A[5]; /* File scope */
int main(void) {
int B[2];
#pragma omp parallel
do_things(B);
return 0;
}
extern int A [5];
void do_things(int *var){
double wrk [10];
static int status;
...
}
omp parallel:‫اشتراک‬ ‫قواعد‬
‫داده‬ ‫گذاری‬
private(list)
-‫متغیرهای‬private‫از‬ ‫یک‬ ‫هر‬ ‫در‬ ‫اختصاصی‬ ‫پشته‬ ‫یک‬ ‫در‬thread‫ها‬
‫شوند‬ ‫می‬ ‫ذخیره‬
-‫است‬ ‫نشده‬ ‫تعریف‬ ‫آنها‬ ‫اولیه‬ ‫مقدار‬
-‫تعریف‬ ‫کد‬ ‫موازی‬ ‫بخش‬ ‫از‬ ‫خروج‬ ‫از‬ ‫پس‬ ‫نیز‬ ‫آنها‬ ‫نهایی‬ ‫مقدار‬
‫است‬ ‫نشده‬
firstprivate(list)
-‫و‬ ‫گیرد‬ ‫می‬ ‫اولیه‬ ‫مقدار‬ ‫که‬ ‫تفاوت‬ ‫این‬ ‫با‬ ‫است‬ ‫قبلی‬ ‫همانند‬
‫است‬ ‫استفاده‬ ‫قابل‬ ‫موازی‬ ‫بخش‬ ‫در‬ ‫مقدار‬ ‫این‬
omp parallel:‫اشتراک‬ ‫قواعد‬
‫داده‬ ‫گذاری‬
lastprivate(list)
-‫همانند‬private‫و‬ ‫است‬thread‫انجام‬ ‫را‬ ‫موازی‬ ‫بخش‬ ‫تکرار‬ ‫آخرین‬ ‫که‬
‫دارد‬ ‫را‬ ‫اصلی‬ ‫متغیر‬ ‫به‬ ‫خود‬ ‫مقدار‬ ‫کردن‬ ‫کپی‬ ‫وظیفه‬ ‫دهد‬ ‫می‬
shared(list)
-‫همه‬thread‫آن‬ ‫از‬ ‫یا‬ ‫و‬ ‫بنویسند‬ ‫متغیر‬ ‫نوع‬ ‫این‬ ‫در‬ ‫توانند‬ ‫می‬ ‫ها‬
‫بخوانند‬
-‫هستند‬ ‫نوع‬ ‫این‬ ‫از‬ ‫فرض‬ ‫پیش‬ ‫صورت‬ ‫به‬ ‫متغیرها‬ ‫تمامی‬
dafault(private,shared,none)
-‫نوع‬ ‫کدام‬ ‫از‬ ‫فرض‬ ‫پیش‬ ‫صورت‬ ‫به‬ ‫متغیرها‬ ‫که‬ ‫کرد‬ ‫تعیین‬ ‫توان‬ ‫می‬
‫باشند‬
-‫در‬c/c++‫تعریف‬default(private)‫نیست‬ ‫مجاز‬
-default(none)‫کدنویسی‬ ‫زمان‬ ‫در‬ ‫نویس‬ ‫برنامه‬ ‫که‬ ‫است‬ ‫حالت‬ ‫بهترین‬
Method 1: using clauses in pragma omp parallel (C, C++, Fortran):
int A, B; // Variables declared at the beginning of a function
#pragma omp parallel private(A) shared(B)
{
// Each thread has its own copy of A, but B is shared
}
int B; // Variable declared outside of parallel scope - shared by default
#pragma omp parallel
{
int A; // Variable declared inside the parallel scope - always private
// Each thread has its own copy of A, but B is shared
}
Method 2: using scoping (only C and C++):
1
2
3
4
5
1
2
3
4
5
6
‫سازی‬ ‫موازی‬ ‫روشهای‬ ‫انواع‬
‫در‬OpenMP
‫در‬ ‫سازی‬ ‫موازی‬ ‫مدل‬omp‫بر‬ ‫مبتنی‬SIMD‫برای‬ ‫و‬ ‫است‬
‫بین‬ ‫داده‬ ‫تقسیم‬thread‫مختلفی‬ ‫روشهای‬ ‫از‬ ‫موازی‬ ‫های‬
‫کرد‬ ‫استفاده‬ ‫توان‬ ‫می‬:
‫حلقه‬ ‫ساختار‬
‫ساختار‬Workshare(‫در‬ ‫فقط‬Fortran)
‫ساختار‬Single/Master
‫ساختار‬Sections
‫موازی‬ ‫های‬ ‫حلقه‬
‫حلقه‬ ‫بر‬ ‫مبتنی‬ ‫سازی‬ ‫موازی‬:‫های‬ ‫حلقه‬
For‫در‬OpenMP
•‫چندین‬ ‫همزمان‬ ‫اجرای‬
Thread
•‫حلقه‬ ‫تکرارهای‬ ‫بند‬ ‫زمان‬
‫به‬ ‫را‬Thread‫ها‬
‫دهد‬ ‫می‬ ‫تخصیص‬
•‫هر‬Thread‫از‬ ‫بخش‬ ‫یک‬
‫اجرا‬ ‫را‬ ‫تکرارحلقه‬
‫کند‬ ‫می‬ ‫حلقه‬ ‫یک‬ ‫سازی‬ ‫موازی‬
‫حلقه‬ ‫بر‬ ‫مبتنی‬ ‫سازی‬ ‫موازی‬:‫های‬ ‫حلقه‬
For‫در‬OpenMP
‫کتابخانه‬OpenMP‫از‬ ‫ها‬ ‫نخ‬ ‫بین‬ ‫حلقه‬ ‫تکرارهای‬ ‫توزیع‬ ‫برای‬
#pragma omp parallel for‫زبان‬ ‫در‬c/c++‫و‬!$omp parallel do‫در‬
Fortran‫کند‬ ‫می‬ ‫استفاده‬
!$omp parallel shared(x,y,z) private(i)
!$omp do
do i = 1, n
z(i) = x(i) + y(i) end do
!$omp end do
!$omp end parallel
#pragma omp parallel for
for (int i = 0; i < n; i++) {
printf("Iteration %dis processed by thread %dn", i,
omp_get_thread_num());
// ... iterations will be distributed across available threads...
}
!$omp parallel shared(x,y,z) private(i)
!$omp do
do i = 1, n
z(i) = x(i) + y(i) end do
!$omp end do
!$omp end parallel
1
2
3
4
5
6
‫حلقه‬ ‫بر‬ ‫مبتنی‬ ‫سازی‬ ‫موازی‬:‫های‬ ‫حلقه‬
For‫در‬OpenMP
#pragma omp parallel
{
// Code placed here will be executed by all threads.
// Alternative way to specify private variables:
// declare them in the scope of pragma omp parallel
int private_number=0;
#pragma omp for
for (int i = 0; i < n; i++) {
// ... iterations will be distributed across available threads...
}
// ... code placed here will be executed by all threads
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
‫حلقه‬ ‫بندی‬ ‫زمان‬ ‫مختلف‬ ‫حالتهای‬
‫در‬OpenMP
‫برای‬‫تقسیم‬‫بندی‬‫داده‬‫ها‬‫بین‬thread‫های‬‫حلقه‬‫ای‬‫روشهای‬‫مختلفی‬
‫می‬‫توان‬‫استفاده‬‫کرد‬:
•schedule(static[,chunk])
‫به‬‫هر‬thread‫بالکی‬‫از‬‫داده‬(‫تکرارهای‬‫حلقه‬)‫به‬‫اندازه‬chunk
‫اختصاص‬‫داده‬‫می‬‫شود‬
•schedule(dynamic[,chunk])
‫صفی‬‫از‬‫داده‬‫ها‬‫تشکیل‬‫می‬‫شود‬‫که‬‫به‬‫هر‬thread‫به‬‫صورت‬‫پویا‬‫به‬
‫اندازه‬chunk‫داده‬‫تخصیص‬‫می‬‫دهد‬
•schedule(guided[,chunk])
‫تقسیم‬‫داده‬‫از‬‫ابتدا‬‫با‬‫سایز‬‫بزرگ‬‫بین‬thread‫ها‬‫انجام‬‫می‬‫شود‬
‫و‬‫به‬‫مرور‬‫به‬‫سمت‬‫سایز‬chunk‫کاهش‬‫می‬‫یابد‬
‫حلقه‬ ‫بندی‬ ‫زمان‬ ‫مختلف‬ ‫حالتهای‬
‫در‬OpenMP
‫مختلف‬ ‫حالتهای‬ ‫از‬ ‫مثالهایی‬
‫حلقه‬ ‫بندی‬ ‫زمان‬
!$omp parallel shared(x,y,z) private(i)
!$omp do schedule(dynamic,chunk)
do i = 1, n
z(i) = x(i) + y(i) end do
!$omp end do
!$omp end parallel
#pragma omp parallel shared(x,y,z) private(i)
{
#pragma omp for schedule(dynamic,chunk)
for (i = 0; i < n; i++)
z[i] = x[i] + y[i]
}
Fortran
C/C++
Workshare Directives
Workshare directive‫بالکهایی‬ ‫به‬ ‫را‬ ‫کد‬ ‫اجرایی‬ ‫های‬ ‫قسمت‬ ‫ها‬
‫اجرا‬ ‫بار‬ ‫یک‬ ‫فقط‬ ‫کد‬ ‫تکه‬ ‫هر‬ ‫که‬ ‫کنند‬ ‫می‬ ‫تقسیم‬ ‫مجزایی‬
‫شود‬ ‫می‬.
real :: a(n,n), b(n,n), c(n,n) d(n,n)
...
!$omp parallel shared(a,b,c,d)
!$omp workshare
c=a*b
d=a+b
!$omp end workshare nowait
!$omp end parallel
Data Races and
Mutexes
Race Conditions‫پیش‬ ‫قابل‬ ‫غیر‬ ‫رفتارهای‬ ‫و‬
‫برنامه‬ ‫بینی‬
int total = 0;
#pragma omp parallel for
for (int i = 0; i < n; i++) {
// Race condition
total = total + i;
}
‫زمانی‬‫رخ‬‫می‬‫دهد‬‫که‬2‫یا‬‫بیشتر‬‫از‬
Thread‫ها‬‫بخواهد‬‫به‬‫یک‬‫آدرس‬
‫یکسان‬‫از‬‫حافظه‬‫دسترسی‬‫یابند‬‫و‬
Mutex
Mutual Exclusion (Mutex)‫از‬ ‫کد‬ ‫سازی‬ ‫سریالی‬ ‫با‬Data Race
‫کند‬ ‫می‬ ‫جلوگیری‬
Mutex‫در‬OpenMP
#pragma omp parallel
{
// parallel code
#pragma omp critical
{
// protected code
// multiple lines
// many variables
}
}
#pragma omp parallel
{
// parallel code
#pragma omp atomic
// protected code
// one line
// specific operations
// on scalars
total += i;
}
Good parallel codes minimize the use of mutexes.
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
‫مسئله‬race condition‫روشهای‬ ‫و‬
‫آن‬ ‫حل‬
‫مسئله‬race condition‫چندین‬ ‫که‬ ‫دهد‬ ‫می‬ ‫رخ‬ ‫زمانی‬thread‫زمان‬ ‫یک‬ ‫در‬
‫اتفاق‬ ‫این‬ ‫از‬ ‫نمونه‬ ‫یک‬ ،‫باشند‬ ‫داشته‬ ‫را‬ ‫نوشتن‬ ‫و‬ ‫خواندن‬ ‫قصد‬
‫است‬ ‫مالحظه‬ ‫قابل‬ ‫زیر‬ ‫مثال‬ ‫در‬
asum = 0.0d0
!$omp parallel do shared(x,y,n,asum) private(i)
do i = 1, n
asum = asum + x(i)* y(i)
end do
!$omp end parallel do
•‫ترتیب‬ ‫به‬ ‫بستگی‬ ‫که‬ ‫است‬ ‫تصادفی‬ ‫جوابهای‬ ‫شامل‬ ‫کد‬ ‫این‬ ‫نتایج‬
‫دسترسی‬thread‫متغیر‬ ‫به‬ ‫ها‬asum‫دارد‬.
•‫روشهایی‬ ‫به‬ ‫نیاز‬ ‫حافظه‬ ‫به‬ ‫دسترسی‬ ‫مکانیزم‬ ‫بر‬ ‫کننترل‬ ‫برای‬
Reduction‫مقابله‬ ‫برای‬
‫به‬RC
‫کاربردهای‬ ‫از‬ ‫یکی‬ ‫آرایه‬ ‫یک‬ ‫مقادیر‬ ‫کردن‬ ‫جمع‬reduction‫است‬
Computed by
thread 0
Computed by
thread 1
Combined result
•‫در‬openMP‫توسط‬ ‫که‬ ‫محاسباتی‬ ‫نتایج‬ ‫کردن‬ ‫جمع‬thread‫مختلف‬ ‫های‬
‫توسط‬ ‫شود‬ ‫می‬ ‫انجام‬reduction‫انجام‬ ‫قابل‬‫است‬
Reduction‫مقابله‬ ‫برای‬
‫به‬RC
reduction(operator:list)
•‫از‬ ‫یک‬ ‫هر‬ ‫ازای‬ ‫به‬
thread‫جمع‬ ‫عملیات‬ ‫ها‬
‫می‬ ‫انجام‬ ‫جداگانه‬ ‫زدن‬
‫شود‬
•‫بخش‬ ‫پایان‬ ‫از‬ ‫بعد‬
‫مقادیر‬ ‫تمامی‬ ‫موازی‬
‫در‬ ‫و‬ ‫شده‬ ‫آوری‬ ‫جمع‬
Reduction‫مقابله‬ ‫برای‬
‫به‬RC
‫مشکل‬ ‫رفع‬ ‫برای‬ ‫کد‬ ‫نمونه‬RC‫فرترن‬ ‫در‬
!$omp parallel do shared(x,y,n) private(i) reduction(+:asum)
do i = 1, n
asum = asum + x(i)*y(i) end do
!$omp end parallel
Built-In Reduction
‫مشکل‬ ‫رفع‬ ‫برای‬ ‫کد‬ ‫نمونه‬RC‫در‬C/C++
int total = 0;
#pragma omp parallel for reduction(+: total)
for (int i = 0; i < n; i++) { total += i
Reduction‫اختصاصی‬ ‫فضای‬ ‫با‬
Thread
int total = 0;
#pragma omp parallel
{
int total_thr = 0;
#pragma omp for
for (int i=0; i<n; i++)
total_thr += i;
#pragma omp atomic
total += total_thr;
}
1
2
3
4
5
6
7
8
9
10
11
‫مثال‬:Stencil
Code
‫های‬ ‫عملگر‬
Stencil
•‫خطی‬ ‫معادالت‬
•‫دیفرانسیل‬
‫جزئی‬
Fluid dynamics, heat transfer, image processing (convolution matrix),
cellular automata.
‫لبه‬ ‫تشخیص‬
‫چند‬Thread‫ی‬
amin@astek% icpc -c -qopenmp -xMIC-AVX2 stencil.cc
1 #pragma omp parallel for
2 for (int i = 1; i < height-1; i++)
3 #pragma omp simd
4 for (int j = 1; j < width-1; j++) out[i*width + j] =
5 -in[(i-1)*width + j-1] - in[(i-1)*width + j] - in[(i-1)*width + j+1]
6 -in[(i)*width + j-1] + 8*in[(i)*width + j] - in[(i)*width + j+1]
7 -in[(i+1)*width + j-1] - in[(i+1)*width + j] - in[(i+1)*width + j+1];
‫عملکرد‬ ‫و‬ ‫کارایی‬
‫عددی‬ ‫انتگرال‬
Midpoint Rectangle Method
‫سلایر‬ ‫سازی‬ ‫پیاده‬
const double dx = a/(double)n;
double integral = 0.0;
for (int i = 0; i < n; i++) {
const double xip12 = dx*((double)i + 0.5);
const double dI = BlackBoxFunction(xip12)*dx;
integral += dI;
}
1
2
3
4
5
6
7
8
9
Race Condition‫محافظت‬
‫نشده‬
const double dx = a/(double)n;
double integral = 0.0;
#pragma omp parallel for
for (int i = 0; i < n; i++) {
const double xip12 = dx*((double)i + 0.5);
const double dI = BlackBoxFunction(xip12)*dx;
integral += dI;
}
1
2
3
4
5
6
7
8
9
‫از‬ ‫استفاده‬Mutex
const double dx = a/(double)n;
double integral = 0.0;
#pragma omp parallel for
for (int i = 0; i < n; i++) {
const double xip12 = dx*((double)i + 0.5);
const double dI = BlackBoxFunction(xip12)*dx;
#pragma omp atomic
integral += dI;
}
1
2
3
4
5
6
7
8
9
Built-in Reduction
const double dx = a/(double)n;
double integral = 0.0;
#pragma omp parallel for reduction(+: integral)
for (int i = 0; i < n; i++) {
const double xip12 = dx*((double)i + 0.5);
const double dI = BlackBoxFunction(xip12)*dx;
integral += dI;
}
1
2
3
4
5
6
7
8
9
Reduction‫اختصاصی‬ ‫فضای‬ ‫با‬
Thread
const double dx = a/(double)n;
double integral = 0.0;
#pragma omp parallel
{
double integral_th = 0.0;
#pragma omp for
for (int i = 0; i < n; i++) {
const double xip12 = dx*((double)i + 0.5);
const double dI = BlackBoxFunction(xip12)*dx; integral_th += dI;
}
#pragma omp atomic
integral += integral_th;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Built-in Reduction
Single/Master
‫اجرا‬ ‫زمان‬ ‫کنترلهای‬
‫در‬‫برخی‬‫موارد‬‫بخشی‬‫از‬‫کد‬‫باید‬‫توسط‬master‫اجرا‬‫شود‬‫و‬
‫بخش‬‫دیگر‬‫توسط‬‫یک‬single thread
•I/O،‫مقداردهی‬،‫اولیه‬‫به‬‫روز‬‫رسانی‬‫مقادیر‬‫غیرمحلی‬
‫مثالهایی‬‫از‬‫این‬‫دست‬‫هستند‬.
•OpenMP‫روشهایی‬‫برای‬‫این‬‫مدل‬‫از‬‫اجرا‬‫ارائه‬‫کرده‬‫است‬
‫کنترلی‬ ‫ساختار‬barrier
master
•‫توسط‬ ‫فقط‬ ‫باید‬ ‫که‬ ‫کند‬ ‫می‬ ‫مشخص‬ ‫را‬ ‫کد‬ ‫از‬ ‫ای‬ ‫ناحیه‬
master‫شود‬ ‫اجرا‬
•‫که‬ ‫باشید‬ ‫داشته‬ ‫دقت‬barrier‫این‬ ‫انتهای‬ ‫در‬ ‫ضمنی‬
‫ندارد‬ ‫قرار‬ ‫کد‬ ‫از‬ ‫بخش‬
single
•‫یک‬ ‫توسط‬ ‫باید‬ ‫که‬ ‫کند‬ ‫می‬ ‫مشخص‬ ‫را‬ ‫کد‬ ‫از‬ ‫ای‬ ‫ناحیه‬
thread‫شود‬ ‫اجرا‬ ‫و‬ ‫دلخواه‬
‫کنترلی‬ ‫ساختار‬
master/single
barrier
•‫یک‬ ‫که‬ ‫زمانی‬thread‫یک‬ ‫به‬barrier‫که‬ ‫زمانی‬ ‫تا‬ ‫رسد‬ ‫می‬
‫سایر‬thread‫منتظر‬ ‫برسند‬ ‫نقطه‬ ‫آن‬ ‫به‬ ‫وی‬ ‫تیمی‬ ‫هم‬ ‫های‬
‫ماند‬ ‫می‬.
•‫همه‬thread‫یک‬ ‫به‬ ‫باید‬ ‫تیم‬ ‫یک‬ ‫های‬barrier‫یا‬ ‫برسند‬
‫نرسند‬ ‫هیچیک‬
•‫دستورات‬ ‫این‬ ‫پایان‬ ‫در‬barrier‫دارد‬ ‫وجود‬ ‫ضمنی‬:do,
parallel, sections, single, workshare
‫کنترلی‬ ‫ساختارهای‬ ‫سایر‬
critical[(name)]
•‫از‬ ‫یکی‬ ‫توسط‬ ‫فقط‬ ‫بار‬ ‫هر‬ ‫که‬ ‫کد‬ ‫از‬ ‫بخشی‬thread‫می‬ ‫ها‬
‫شود‬ ‫اجرا‬ ‫تواند‬
•‫توان‬ ‫می‬ ‫بحرانی‬ ‫بخش‬ ‫یک‬ ‫برای‬name‫کرد‬ ‫انتخاب‬ ‫دلخواه‬
flush[(var1,…)]
•‫همه‬ ‫حافظه‬thread‫کند‬ ‫می‬ ‫همگام‬ ‫را‬ ‫ها‬
•‫شود‬ ‫می‬ ‫نیاز‬ ‫خاصی‬ ‫موارد‬ ‫در‬ ‫فقط‬
•‫شود‬ ‫می‬ ‫انجام‬ ‫زیر‬ ‫مواقع‬ ‫در‬ ‫ضمنی‬ ‫صورت‬ ‫به‬ ‫عمل‬ ‫این‬:
o‫همه‬ ‫در‬barrier‫ها‬
o‫ورود‬/‫به‬ ‫خروج‬/‫بحرانی‬ ‫مناطق‬ ‫از‬‫کد‬
‫مثال‬:reduction using critical
section
‫فرترن‬
!$OMP PARALLEL SHARED(x,y,n,asum) PRIVATE(i, psum)
psum = 0.0d
!$OMP DO
do i = 1, n
psum = psum + x(i)*y(i) end do
!$OMP END DO
!$OMP CRITICAL(dosum)
asum = asum + psum
!$OMP END CRITICAL(dosum)
!$OMP END PARALLEL DO
‫مثال‬:initialization and
output
C/C++
#pragma omp parallel
while (err > tolerance) {
#pragma omp master
{
err = 0.0;
}
#pragma omp barrier
// Compute err
…
#pragma omp single
printf(“Error is now: %5.2fn”, err);
}
Directive‫های‬
OpenMP
OpenMP Directive
#pragma omp parallel – create threads
#pragma omp for – process loop with threads
#pragma omp task/taskyield – asynchronous tasks
#pragma omp critical/atomic – mutexes
#pragma omp barrier/taskwait – synchronization points
#pragma omp sections/single – blocks of code for individual threads
#pragma omp flush – enforce memory consistency
#pragma omp ordered – partial loop serialization
OMP_* – environment variables, omp_*() – functions
Click construct names for links to the OpenMP reference from the LLNL
List of environment variables (OpenMP 4.5)
OMP_SCHEDULE
OMP_NUM_THREADS
OMP_DYNAMIC
OMP_PROC_BIND
OMP_PLACES
OMP_NESTED
OMP_STACKSIZE
OMP_MAX_ACTIVE_LEVELS
OMP_THREAD_LIMIT
OMP_CANCELLATION
OMP_DISPLAY_ENV
OMP_DEFAULT_DEVICE
OMP_WAIT_POLICY
OMP_MAX_TASK_PRIORITY
Runtime functions
•‫یا‬ ‫تنظیمات‬ ‫مقادیر‬ ‫خواندن‬ ‫برای‬ ‫اجرای‬ ‫زمان‬ ‫توابع‬
‫شوند‬ ‫می‬ ‫استفاده‬ ‫اجرا‬ ‫زمان‬ ‫متغییرهای‬ ‫به‬ ‫مقداردهی‬
–C/C++ header file omp.h
–omp_lib Fortran module (omp_lib.h header in some
implementations)
•‫کاری‬ ‫بار‬ ‫توزیع‬ ‫برای‬ ‫مهم‬ ‫تابع‬ ‫دو‬
–omp_get_num_threads()
–omp_get_thread_num()
‫توابع‬ ‫با‬ ‫حلقه‬ ‫یک‬ ‫سازی‬ ‫موازی‬
‫ای‬ ‫کتابخانه‬
#ifdef _OPENMP
#include “omp.h”
#else
#define omp_get_thread_num() 0
#define omp_get_num_threads() 1
#endif
…
#pragma omp parallel private(i,nthrds,thr_id)
{
nthrds = omp_get_num_threads();
thrd_id = omp_get_thrd_num();
for (i=thrd_id; i<n; i+=nthrds) {
…
}
}
03 open mp_fundamentals_of_parallelism_and_code_optimization-www.astek.ir

More Related Content

PPTX
05 mpi fundamentals_of_parallelism_and_code_optimization-www.astek.ir
PDF
Quantom
PDF
Jozve c#2 mohamady_zahedy
PPTX
04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...
PDF
lunch box plugin
PDF
Jozve c#3 mohamady
PPTX
02 vectorization fundamentals_of_parallelism_and_code_optimization-www.astek.ir
PDF
ماشین پشته ای
05 mpi fundamentals_of_parallelism_and_code_optimization-www.astek.ir
Quantom
Jozve c#2 mohamady_zahedy
04 memory traffic_fundamentals_of_parallelism_and_code_optimization-www.astek...
lunch box plugin
Jozve c#3 mohamady
02 vectorization fundamentals_of_parallelism_and_code_optimization-www.astek.ir
ماشین پشته ای

Similar to 03 open mp_fundamentals_of_parallelism_and_code_optimization-www.astek.ir (20)

PPTX
06 hpc library_fundamentals_of_parallelism_and_code_optimization-www.astek.ir
PPTX
سی پلاس پلاس به عنوان زبان دومی برای یادگیری شی گرایی
PPTX
مقدمه ای بر F#
PDF
Advance programming c++
PDF
MIPS and QtSpim
PDF
Parallel computing ch3
PDF
khazeni_taghizade
PDF
Array in data structures and algorithm design
PDF
ورودی خروجی Hadoop
PDF
گزارشی از برنامه‌نویسی موازی در پی‌اچ‌پی
PDF
Parallel processing of large graphs
PPTX
CPP_Chapter 02_C Code- Main Sections.pptx
06 hpc library_fundamentals_of_parallelism_and_code_optimization-www.astek.ir
سی پلاس پلاس به عنوان زبان دومی برای یادگیری شی گرایی
مقدمه ای بر F#
Advance programming c++
MIPS and QtSpim
Parallel computing ch3
khazeni_taghizade
Array in data structures and algorithm design
ورودی خروجی Hadoop
گزارشی از برنامه‌نویسی موازی در پی‌اچ‌پی
Parallel processing of large graphs
CPP_Chapter 02_C Code- Main Sections.pptx
Ad

More from aminnezarat (12)

PPTX
Health-medicine-and-Block-chain1402-1-12.pptx
PPTX
ارائه ابزار.pptx
PDF
00 - BigData-Chapter_01-PDC.pdf
PDF
Smart Data Strategy EN (1).pdf
PPT
slides8 SharedMemory.ppt
PPT
BASIC_MPI.ppt
PPT
Chap2 GGKK.ppt
PPTX
01 introduction fundamentals_of_parallelism_and_code_optimization-www.astek.ir
PDF
Machine learning and big-data-in-physics 13970711-Dr. Amin Nezarat
PDF
Big data HPC Convergence-Dr. Amin-Nezarat-(aminnezarat@gmail.com)-2019
PDF
Camera ready-nash equilibrium-ngct2015-format
PDF
Data set cloudrank-d-hpca_tutorial
Health-medicine-and-Block-chain1402-1-12.pptx
ارائه ابزار.pptx
00 - BigData-Chapter_01-PDC.pdf
Smart Data Strategy EN (1).pdf
slides8 SharedMemory.ppt
BASIC_MPI.ppt
Chap2 GGKK.ppt
01 introduction fundamentals_of_parallelism_and_code_optimization-www.astek.ir
Machine learning and big-data-in-physics 13970711-Dr. Amin Nezarat
Big data HPC Convergence-Dr. Amin-Nezarat-(aminnezarat@gmail.com)-2019
Camera ready-nash equilibrium-ngct2015-format
Data set cloudrank-d-hpca_tutorial
Ad

03 open mp_fundamentals_of_parallelism_and_code_optimization-www.astek.ir

  • 1. ‫درس‬3-‫نوی‬ ‫برنامه‬ ‫در‬ ‫موازی‬OpenMP Fundamentals of Parallelism & Code Optimization (C/C++,Fortran) ‫در‬ ‫کدها‬ ‫سازی‬ ‫بهینه‬ ‫و‬ ‫سازی‬ ‫موازی‬ ‫مبانی‬ ‫زبانهای‬C/C++,Fortran Amin Nezarat (Ph.D.) Assistant Professor at Payame Noor University aminnezarat@gmail.com www.astek.ir - www.hpclab.ir
  • 2. ‫عناوین‬ ‫دوره‬ 1.‫های‬ ‫پردازنده‬ ‫معماری‬ ‫با‬ ‫آشنایی‬ ‫اینتل‬ 2.Vectorization‫معماری‬ ‫در‬ ‫اینتل‬ ‫کامپایلرهای‬ 3.‫نویسی‬ ‫برنامه‬ ‫با‬ ‫کار‬ ‫و‬ ‫آشنایی‬ ‫در‬OpenMP 4.‫با‬ ‫داده‬ ‫تبادل‬ ‫قواعد‬ ‫و‬ ‫اصول‬ ‫حافظه‬(Memory Traffic)
  • 8. Thread‫مقابل‬ ‫در‬ ‫ها‬ Process‫ها‬ ‫اول‬ ‫گزینه‬:‫بین‬ ‫داده‬ ‫تقسیم‬T/P Examples: computational fluid dynamics (CFD), image processing.
  • 9. Thread‫مقابل‬ ‫در‬ ‫ها‬ Process‫ها‬ ‫دوم‬ ‫گزینه‬:‫بین‬ ‫داده‬ ‫گذاری‬ ‫اشتراک‬ ‫به‬T/P Examples: particle transport simulation, machine learning (inference).
  • 11. ‫های‬ ‫کتابخانه‬ ‫و‬ ‫ها‬ ‫چارچوب‬ ‫ساخت‬Thread‫ها‬ FunctionalityFramework Asynchronous functions; only C++C++11 Threads Fork/join; C/C++/Fortran; LinuxPOSIX Threads Async tasks, loops, reducers, load balance; C/C++Cilk Plus Trees of tasks, complex patterns; only C++TBB Tasks, loops, reduction, load balancing, affinity, nesting, C/C++/Fortran (+SIMD, offload) OpenMP
  • 12. ‫ساده‬ ‫مثال‬“Hello World”‫در‬OpenMP‫در‬ ‫زبان‬C++ Directive‫صورت‬ ‫به‬ ‫مختلف‬ ‫زبانهای‬ ‫های‬ ‫زیر‬‫است‬ - C/C++: #pragma omp - Fortran free form: !$omp ‫برای‬‫های‬ ‫سویچ‬ ‫از‬ ‫کردن‬ ‫کامپایل‬ ‫کنید‬ ‫استفاده‬ ‫زیر‬ - GNU: -fopenmp - Intel: -qopenmp - Cray: -h omp - PGI: -mp[=nonuma,align,allcorembind] #include <omp.h> #include <cstdio> int main(){ // This code is executed by 1 thread const int nt=omp_get_max_threads(); printf("OpenMP with %d threadsn", nt); #pragma omp parallel { // This code is executed in parallel // by multiple threads printf("Hello World from thread %dn", omp_get_thread_num()); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  • 13. ‫برنامه‬ ‫کامپایل‬Hello World‫در‬ OpenMP amin@astek% icpc -qopenmp hello_omp.cc amin@astek% export OMP_NUM_THREADS=5 amin@astek% ./a.out OpenMPwith 5 threads Hello World from thread 0 Hello World from thread 3 Hello World from thread 1 Hello World from thread 2 Hello World from thread 4 OMP_NUM_THREADS controls number of OpenMP threads (default: logical CPU count)
  • 16. ‫در‬ ‫سازی‬ ‫موازی‬ ‫مختلف‬ ‫روشهای‬ OpenMP 1-‫از‬ ‫استفاده‬Directive‫های‬ ‫کامپایلری‬ 2-‫کامپایلری‬ ‫شرایط‬ ‫از‬ ‫استفاده‬ ‫با‬‫ماکروها‬C/C++Fortran #pragma omp parallel [clause]!$omp parallel [clause]Compiler Directive #ifdef _OPENMP OpenMP specific code #else Code without OpenMP #endif !$ *$ c$ Conditional Macro
  • 18. ‫پیش‬ ‫ذخیره‬ ‫فضای‬ ‫فرض‬ -‫صورت‬ ‫به‬ ‫متغیرها‬ ‫اغلب‬share‫شوند‬ ‫می‬ ‫تعریف‬ -‫متغیرهای‬global‫بین‬thread‫گذاشته‬ ‫اشتراک‬ ‫به‬ ‫ها‬ ‫شوند‬ ‫می‬ •C:‫متغیرهای‬static‫فایل‬ ‫محدوده‬ ‫در‬share‫هستند‬ •Fortran:‫متغیرهای‬SAVE‫و‬MODULE‫محدوده‬ ‫در‬ ‫بالکهای‬COMMON •‫پویا‬ ‫صورت‬ ‫به‬ ‫متغیرها‬ ‫آنها‬ ‫دوی‬ ‫هر‬ ‫در‬ ‫شوند‬ ‫می‬ ‫داده‬ ‫تخصیص‬ -‫فرض‬ ‫پیش‬ ‫صورت‬ ‫به‬ ‫متغیرها‬private‫هستند‬
  • 19. ‫پیش‬ ‫ذخیره‬ ‫فضای‬ ‫فرض‬ int A[5]; /* File scope */ int main(void) { int B[2]; #pragma omp parallel do_things(B); return 0; } extern int A [5]; void do_things(int *var){ double wrk [10]; static int status; ... }
  • 20. omp parallel:‫اشتراک‬ ‫قواعد‬ ‫داده‬ ‫گذاری‬ private(list) -‫متغیرهای‬private‫از‬ ‫یک‬ ‫هر‬ ‫در‬ ‫اختصاصی‬ ‫پشته‬ ‫یک‬ ‫در‬thread‫ها‬ ‫شوند‬ ‫می‬ ‫ذخیره‬ -‫است‬ ‫نشده‬ ‫تعریف‬ ‫آنها‬ ‫اولیه‬ ‫مقدار‬ -‫تعریف‬ ‫کد‬ ‫موازی‬ ‫بخش‬ ‫از‬ ‫خروج‬ ‫از‬ ‫پس‬ ‫نیز‬ ‫آنها‬ ‫نهایی‬ ‫مقدار‬ ‫است‬ ‫نشده‬ firstprivate(list) -‫و‬ ‫گیرد‬ ‫می‬ ‫اولیه‬ ‫مقدار‬ ‫که‬ ‫تفاوت‬ ‫این‬ ‫با‬ ‫است‬ ‫قبلی‬ ‫همانند‬ ‫است‬ ‫استفاده‬ ‫قابل‬ ‫موازی‬ ‫بخش‬ ‫در‬ ‫مقدار‬ ‫این‬
  • 21. omp parallel:‫اشتراک‬ ‫قواعد‬ ‫داده‬ ‫گذاری‬ lastprivate(list) -‫همانند‬private‫و‬ ‫است‬thread‫انجام‬ ‫را‬ ‫موازی‬ ‫بخش‬ ‫تکرار‬ ‫آخرین‬ ‫که‬ ‫دارد‬ ‫را‬ ‫اصلی‬ ‫متغیر‬ ‫به‬ ‫خود‬ ‫مقدار‬ ‫کردن‬ ‫کپی‬ ‫وظیفه‬ ‫دهد‬ ‫می‬ shared(list) -‫همه‬thread‫آن‬ ‫از‬ ‫یا‬ ‫و‬ ‫بنویسند‬ ‫متغیر‬ ‫نوع‬ ‫این‬ ‫در‬ ‫توانند‬ ‫می‬ ‫ها‬ ‫بخوانند‬ -‫هستند‬ ‫نوع‬ ‫این‬ ‫از‬ ‫فرض‬ ‫پیش‬ ‫صورت‬ ‫به‬ ‫متغیرها‬ ‫تمامی‬ dafault(private,shared,none) -‫نوع‬ ‫کدام‬ ‫از‬ ‫فرض‬ ‫پیش‬ ‫صورت‬ ‫به‬ ‫متغیرها‬ ‫که‬ ‫کرد‬ ‫تعیین‬ ‫توان‬ ‫می‬ ‫باشند‬ -‫در‬c/c++‫تعریف‬default(private)‫نیست‬ ‫مجاز‬ -default(none)‫کدنویسی‬ ‫زمان‬ ‫در‬ ‫نویس‬ ‫برنامه‬ ‫که‬ ‫است‬ ‫حالت‬ ‫بهترین‬
  • 22. Method 1: using clauses in pragma omp parallel (C, C++, Fortran): int A, B; // Variables declared at the beginning of a function #pragma omp parallel private(A) shared(B) { // Each thread has its own copy of A, but B is shared } int B; // Variable declared outside of parallel scope - shared by default #pragma omp parallel { int A; // Variable declared inside the parallel scope - always private // Each thread has its own copy of A, but B is shared } Method 2: using scoping (only C and C++): 1 2 3 4 5 1 2 3 4 5 6
  • 23. ‫سازی‬ ‫موازی‬ ‫روشهای‬ ‫انواع‬ ‫در‬OpenMP ‫در‬ ‫سازی‬ ‫موازی‬ ‫مدل‬omp‫بر‬ ‫مبتنی‬SIMD‫برای‬ ‫و‬ ‫است‬ ‫بین‬ ‫داده‬ ‫تقسیم‬thread‫مختلفی‬ ‫روشهای‬ ‫از‬ ‫موازی‬ ‫های‬ ‫کرد‬ ‫استفاده‬ ‫توان‬ ‫می‬: ‫حلقه‬ ‫ساختار‬ ‫ساختار‬Workshare(‫در‬ ‫فقط‬Fortran) ‫ساختار‬Single/Master ‫ساختار‬Sections
  • 25. ‫حلقه‬ ‫بر‬ ‫مبتنی‬ ‫سازی‬ ‫موازی‬:‫های‬ ‫حلقه‬ For‫در‬OpenMP •‫چندین‬ ‫همزمان‬ ‫اجرای‬ Thread •‫حلقه‬ ‫تکرارهای‬ ‫بند‬ ‫زمان‬ ‫به‬ ‫را‬Thread‫ها‬ ‫دهد‬ ‫می‬ ‫تخصیص‬ •‫هر‬Thread‫از‬ ‫بخش‬ ‫یک‬ ‫اجرا‬ ‫را‬ ‫تکرارحلقه‬ ‫کند‬ ‫می‬ ‫حلقه‬ ‫یک‬ ‫سازی‬ ‫موازی‬
  • 26. ‫حلقه‬ ‫بر‬ ‫مبتنی‬ ‫سازی‬ ‫موازی‬:‫های‬ ‫حلقه‬ For‫در‬OpenMP ‫کتابخانه‬OpenMP‫از‬ ‫ها‬ ‫نخ‬ ‫بین‬ ‫حلقه‬ ‫تکرارهای‬ ‫توزیع‬ ‫برای‬ #pragma omp parallel for‫زبان‬ ‫در‬c/c++‫و‬!$omp parallel do‫در‬ Fortran‫کند‬ ‫می‬ ‫استفاده‬ !$omp parallel shared(x,y,z) private(i) !$omp do do i = 1, n z(i) = x(i) + y(i) end do !$omp end do !$omp end parallel #pragma omp parallel for for (int i = 0; i < n; i++) { printf("Iteration %dis processed by thread %dn", i, omp_get_thread_num()); // ... iterations will be distributed across available threads... } !$omp parallel shared(x,y,z) private(i) !$omp do do i = 1, n z(i) = x(i) + y(i) end do !$omp end do !$omp end parallel 1 2 3 4 5 6
  • 27. ‫حلقه‬ ‫بر‬ ‫مبتنی‬ ‫سازی‬ ‫موازی‬:‫های‬ ‫حلقه‬ For‫در‬OpenMP #pragma omp parallel { // Code placed here will be executed by all threads. // Alternative way to specify private variables: // declare them in the scope of pragma omp parallel int private_number=0; #pragma omp for for (int i = 0; i < n; i++) { // ... iterations will be distributed across available threads... } // ... code placed here will be executed by all threads } 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  • 28. ‫حلقه‬ ‫بندی‬ ‫زمان‬ ‫مختلف‬ ‫حالتهای‬ ‫در‬OpenMP ‫برای‬‫تقسیم‬‫بندی‬‫داده‬‫ها‬‫بین‬thread‫های‬‫حلقه‬‫ای‬‫روشهای‬‫مختلفی‬ ‫می‬‫توان‬‫استفاده‬‫کرد‬: •schedule(static[,chunk]) ‫به‬‫هر‬thread‫بالکی‬‫از‬‫داده‬(‫تکرارهای‬‫حلقه‬)‫به‬‫اندازه‬chunk ‫اختصاص‬‫داده‬‫می‬‫شود‬ •schedule(dynamic[,chunk]) ‫صفی‬‫از‬‫داده‬‫ها‬‫تشکیل‬‫می‬‫شود‬‫که‬‫به‬‫هر‬thread‫به‬‫صورت‬‫پویا‬‫به‬ ‫اندازه‬chunk‫داده‬‫تخصیص‬‫می‬‫دهد‬ •schedule(guided[,chunk]) ‫تقسیم‬‫داده‬‫از‬‫ابتدا‬‫با‬‫سایز‬‫بزرگ‬‫بین‬thread‫ها‬‫انجام‬‫می‬‫شود‬ ‫و‬‫به‬‫مرور‬‫به‬‫سمت‬‫سایز‬chunk‫کاهش‬‫می‬‫یابد‬
  • 29. ‫حلقه‬ ‫بندی‬ ‫زمان‬ ‫مختلف‬ ‫حالتهای‬ ‫در‬OpenMP
  • 30. ‫مختلف‬ ‫حالتهای‬ ‫از‬ ‫مثالهایی‬ ‫حلقه‬ ‫بندی‬ ‫زمان‬ !$omp parallel shared(x,y,z) private(i) !$omp do schedule(dynamic,chunk) do i = 1, n z(i) = x(i) + y(i) end do !$omp end do !$omp end parallel #pragma omp parallel shared(x,y,z) private(i) { #pragma omp for schedule(dynamic,chunk) for (i = 0; i < n; i++) z[i] = x[i] + y[i] } Fortran C/C++
  • 32. Workshare directive‫بالکهایی‬ ‫به‬ ‫را‬ ‫کد‬ ‫اجرایی‬ ‫های‬ ‫قسمت‬ ‫ها‬ ‫اجرا‬ ‫بار‬ ‫یک‬ ‫فقط‬ ‫کد‬ ‫تکه‬ ‫هر‬ ‫که‬ ‫کنند‬ ‫می‬ ‫تقسیم‬ ‫مجزایی‬ ‫شود‬ ‫می‬. real :: a(n,n), b(n,n), c(n,n) d(n,n) ... !$omp parallel shared(a,b,c,d) !$omp workshare c=a*b d=a+b !$omp end workshare nowait !$omp end parallel
  • 34. Race Conditions‫پیش‬ ‫قابل‬ ‫غیر‬ ‫رفتارهای‬ ‫و‬ ‫برنامه‬ ‫بینی‬ int total = 0; #pragma omp parallel for for (int i = 0; i < n; i++) { // Race condition total = total + i; } ‫زمانی‬‫رخ‬‫می‬‫دهد‬‫که‬2‫یا‬‫بیشتر‬‫از‬ Thread‫ها‬‫بخواهد‬‫به‬‫یک‬‫آدرس‬ ‫یکسان‬‫از‬‫حافظه‬‫دسترسی‬‫یابند‬‫و‬
  • 35. Mutex Mutual Exclusion (Mutex)‫از‬ ‫کد‬ ‫سازی‬ ‫سریالی‬ ‫با‬Data Race ‫کند‬ ‫می‬ ‫جلوگیری‬
  • 36. Mutex‫در‬OpenMP #pragma omp parallel { // parallel code #pragma omp critical { // protected code // multiple lines // many variables } } #pragma omp parallel { // parallel code #pragma omp atomic // protected code // one line // specific operations // on scalars total += i; } Good parallel codes minimize the use of mutexes. 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
  • 37. ‫مسئله‬race condition‫روشهای‬ ‫و‬ ‫آن‬ ‫حل‬ ‫مسئله‬race condition‫چندین‬ ‫که‬ ‫دهد‬ ‫می‬ ‫رخ‬ ‫زمانی‬thread‫زمان‬ ‫یک‬ ‫در‬ ‫اتفاق‬ ‫این‬ ‫از‬ ‫نمونه‬ ‫یک‬ ،‫باشند‬ ‫داشته‬ ‫را‬ ‫نوشتن‬ ‫و‬ ‫خواندن‬ ‫قصد‬ ‫است‬ ‫مالحظه‬ ‫قابل‬ ‫زیر‬ ‫مثال‬ ‫در‬ asum = 0.0d0 !$omp parallel do shared(x,y,n,asum) private(i) do i = 1, n asum = asum + x(i)* y(i) end do !$omp end parallel do •‫ترتیب‬ ‫به‬ ‫بستگی‬ ‫که‬ ‫است‬ ‫تصادفی‬ ‫جوابهای‬ ‫شامل‬ ‫کد‬ ‫این‬ ‫نتایج‬ ‫دسترسی‬thread‫متغیر‬ ‫به‬ ‫ها‬asum‫دارد‬. •‫روشهایی‬ ‫به‬ ‫نیاز‬ ‫حافظه‬ ‫به‬ ‫دسترسی‬ ‫مکانیزم‬ ‫بر‬ ‫کننترل‬ ‫برای‬
  • 38. Reduction‫مقابله‬ ‫برای‬ ‫به‬RC ‫کاربردهای‬ ‫از‬ ‫یکی‬ ‫آرایه‬ ‫یک‬ ‫مقادیر‬ ‫کردن‬ ‫جمع‬reduction‫است‬ Computed by thread 0 Computed by thread 1 Combined result •‫در‬openMP‫توسط‬ ‫که‬ ‫محاسباتی‬ ‫نتایج‬ ‫کردن‬ ‫جمع‬thread‫مختلف‬ ‫های‬ ‫توسط‬ ‫شود‬ ‫می‬ ‫انجام‬reduction‫انجام‬ ‫قابل‬‫است‬
  • 39. Reduction‫مقابله‬ ‫برای‬ ‫به‬RC reduction(operator:list) •‫از‬ ‫یک‬ ‫هر‬ ‫ازای‬ ‫به‬ thread‫جمع‬ ‫عملیات‬ ‫ها‬ ‫می‬ ‫انجام‬ ‫جداگانه‬ ‫زدن‬ ‫شود‬ •‫بخش‬ ‫پایان‬ ‫از‬ ‫بعد‬ ‫مقادیر‬ ‫تمامی‬ ‫موازی‬ ‫در‬ ‫و‬ ‫شده‬ ‫آوری‬ ‫جمع‬
  • 40. Reduction‫مقابله‬ ‫برای‬ ‫به‬RC ‫مشکل‬ ‫رفع‬ ‫برای‬ ‫کد‬ ‫نمونه‬RC‫فرترن‬ ‫در‬ !$omp parallel do shared(x,y,n) private(i) reduction(+:asum) do i = 1, n asum = asum + x(i)*y(i) end do !$omp end parallel
  • 41. Built-In Reduction ‫مشکل‬ ‫رفع‬ ‫برای‬ ‫کد‬ ‫نمونه‬RC‫در‬C/C++ int total = 0; #pragma omp parallel for reduction(+: total) for (int i = 0; i < n; i++) { total += i
  • 42. Reduction‫اختصاصی‬ ‫فضای‬ ‫با‬ Thread int total = 0; #pragma omp parallel { int total_thr = 0; #pragma omp for for (int i=0; i<n; i++) total_thr += i; #pragma omp atomic total += total_thr; } 1 2 3 4 5 6 7 8 9 10 11
  • 44. ‫های‬ ‫عملگر‬ Stencil •‫خطی‬ ‫معادالت‬ •‫دیفرانسیل‬ ‫جزئی‬ Fluid dynamics, heat transfer, image processing (convolution matrix), cellular automata.
  • 46. ‫چند‬Thread‫ی‬ amin@astek% icpc -c -qopenmp -xMIC-AVX2 stencil.cc 1 #pragma omp parallel for 2 for (int i = 1; i < height-1; i++) 3 #pragma omp simd 4 for (int j = 1; j < width-1; j++) out[i*width + j] = 5 -in[(i-1)*width + j-1] - in[(i-1)*width + j] - in[(i-1)*width + j+1] 6 -in[(i)*width + j-1] + 8*in[(i)*width + j] - in[(i)*width + j+1] 7 -in[(i+1)*width + j-1] - in[(i+1)*width + j] - in[(i+1)*width + j+1];
  • 50. ‫سلایر‬ ‫سازی‬ ‫پیاده‬ const double dx = a/(double)n; double integral = 0.0; for (int i = 0; i < n; i++) { const double xip12 = dx*((double)i + 0.5); const double dI = BlackBoxFunction(xip12)*dx; integral += dI; } 1 2 3 4 5 6 7 8 9
  • 51. Race Condition‫محافظت‬ ‫نشده‬ const double dx = a/(double)n; double integral = 0.0; #pragma omp parallel for for (int i = 0; i < n; i++) { const double xip12 = dx*((double)i + 0.5); const double dI = BlackBoxFunction(xip12)*dx; integral += dI; } 1 2 3 4 5 6 7 8 9
  • 52. ‫از‬ ‫استفاده‬Mutex const double dx = a/(double)n; double integral = 0.0; #pragma omp parallel for for (int i = 0; i < n; i++) { const double xip12 = dx*((double)i + 0.5); const double dI = BlackBoxFunction(xip12)*dx; #pragma omp atomic integral += dI; } 1 2 3 4 5 6 7 8 9
  • 53. Built-in Reduction const double dx = a/(double)n; double integral = 0.0; #pragma omp parallel for reduction(+: integral) for (int i = 0; i < n; i++) { const double xip12 = dx*((double)i + 0.5); const double dI = BlackBoxFunction(xip12)*dx; integral += dI; } 1 2 3 4 5 6 7 8 9
  • 54. Reduction‫اختصاصی‬ ‫فضای‬ ‫با‬ Thread const double dx = a/(double)n; double integral = 0.0; #pragma omp parallel { double integral_th = 0.0; #pragma omp for for (int i = 0; i < n; i++) { const double xip12 = dx*((double)i + 0.5); const double dI = BlackBoxFunction(xip12)*dx; integral_th += dI; } #pragma omp atomic integral += integral_th; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  • 57. ‫اجرا‬ ‫زمان‬ ‫کنترلهای‬ ‫در‬‫برخی‬‫موارد‬‫بخشی‬‫از‬‫کد‬‫باید‬‫توسط‬master‫اجرا‬‫شود‬‫و‬ ‫بخش‬‫دیگر‬‫توسط‬‫یک‬single thread •I/O،‫مقداردهی‬،‫اولیه‬‫به‬‫روز‬‫رسانی‬‫مقادیر‬‫غیرمحلی‬ ‫مثالهایی‬‫از‬‫این‬‫دست‬‫هستند‬. •OpenMP‫روشهایی‬‫برای‬‫این‬‫مدل‬‫از‬‫اجرا‬‫ارائه‬‫کرده‬‫است‬
  • 58. ‫کنترلی‬ ‫ساختار‬barrier master •‫توسط‬ ‫فقط‬ ‫باید‬ ‫که‬ ‫کند‬ ‫می‬ ‫مشخص‬ ‫را‬ ‫کد‬ ‫از‬ ‫ای‬ ‫ناحیه‬ master‫شود‬ ‫اجرا‬ •‫که‬ ‫باشید‬ ‫داشته‬ ‫دقت‬barrier‫این‬ ‫انتهای‬ ‫در‬ ‫ضمنی‬ ‫ندارد‬ ‫قرار‬ ‫کد‬ ‫از‬ ‫بخش‬ single •‫یک‬ ‫توسط‬ ‫باید‬ ‫که‬ ‫کند‬ ‫می‬ ‫مشخص‬ ‫را‬ ‫کد‬ ‫از‬ ‫ای‬ ‫ناحیه‬ thread‫شود‬ ‫اجرا‬ ‫و‬ ‫دلخواه‬
  • 59. ‫کنترلی‬ ‫ساختار‬ master/single barrier •‫یک‬ ‫که‬ ‫زمانی‬thread‫یک‬ ‫به‬barrier‫که‬ ‫زمانی‬ ‫تا‬ ‫رسد‬ ‫می‬ ‫سایر‬thread‫منتظر‬ ‫برسند‬ ‫نقطه‬ ‫آن‬ ‫به‬ ‫وی‬ ‫تیمی‬ ‫هم‬ ‫های‬ ‫ماند‬ ‫می‬. •‫همه‬thread‫یک‬ ‫به‬ ‫باید‬ ‫تیم‬ ‫یک‬ ‫های‬barrier‫یا‬ ‫برسند‬ ‫نرسند‬ ‫هیچیک‬ •‫دستورات‬ ‫این‬ ‫پایان‬ ‫در‬barrier‫دارد‬ ‫وجود‬ ‫ضمنی‬:do, parallel, sections, single, workshare
  • 60. ‫کنترلی‬ ‫ساختارهای‬ ‫سایر‬ critical[(name)] •‫از‬ ‫یکی‬ ‫توسط‬ ‫فقط‬ ‫بار‬ ‫هر‬ ‫که‬ ‫کد‬ ‫از‬ ‫بخشی‬thread‫می‬ ‫ها‬ ‫شود‬ ‫اجرا‬ ‫تواند‬ •‫توان‬ ‫می‬ ‫بحرانی‬ ‫بخش‬ ‫یک‬ ‫برای‬name‫کرد‬ ‫انتخاب‬ ‫دلخواه‬ flush[(var1,…)] •‫همه‬ ‫حافظه‬thread‫کند‬ ‫می‬ ‫همگام‬ ‫را‬ ‫ها‬ •‫شود‬ ‫می‬ ‫نیاز‬ ‫خاصی‬ ‫موارد‬ ‫در‬ ‫فقط‬ •‫شود‬ ‫می‬ ‫انجام‬ ‫زیر‬ ‫مواقع‬ ‫در‬ ‫ضمنی‬ ‫صورت‬ ‫به‬ ‫عمل‬ ‫این‬: o‫همه‬ ‫در‬barrier‫ها‬ o‫ورود‬/‫به‬ ‫خروج‬/‫بحرانی‬ ‫مناطق‬ ‫از‬‫کد‬
  • 61. ‫مثال‬:reduction using critical section ‫فرترن‬ !$OMP PARALLEL SHARED(x,y,n,asum) PRIVATE(i, psum) psum = 0.0d !$OMP DO do i = 1, n psum = psum + x(i)*y(i) end do !$OMP END DO !$OMP CRITICAL(dosum) asum = asum + psum !$OMP END CRITICAL(dosum) !$OMP END PARALLEL DO
  • 62. ‫مثال‬:initialization and output C/C++ #pragma omp parallel while (err > tolerance) { #pragma omp master { err = 0.0; } #pragma omp barrier // Compute err … #pragma omp single printf(“Error is now: %5.2fn”, err); }
  • 64. OpenMP Directive #pragma omp parallel – create threads #pragma omp for – process loop with threads #pragma omp task/taskyield – asynchronous tasks #pragma omp critical/atomic – mutexes #pragma omp barrier/taskwait – synchronization points #pragma omp sections/single – blocks of code for individual threads #pragma omp flush – enforce memory consistency #pragma omp ordered – partial loop serialization OMP_* – environment variables, omp_*() – functions Click construct names for links to the OpenMP reference from the LLNL
  • 65. List of environment variables (OpenMP 4.5) OMP_SCHEDULE OMP_NUM_THREADS OMP_DYNAMIC OMP_PROC_BIND OMP_PLACES OMP_NESTED OMP_STACKSIZE OMP_MAX_ACTIVE_LEVELS OMP_THREAD_LIMIT OMP_CANCELLATION OMP_DISPLAY_ENV OMP_DEFAULT_DEVICE OMP_WAIT_POLICY OMP_MAX_TASK_PRIORITY
  • 66. Runtime functions •‫یا‬ ‫تنظیمات‬ ‫مقادیر‬ ‫خواندن‬ ‫برای‬ ‫اجرای‬ ‫زمان‬ ‫توابع‬ ‫شوند‬ ‫می‬ ‫استفاده‬ ‫اجرا‬ ‫زمان‬ ‫متغییرهای‬ ‫به‬ ‫مقداردهی‬ –C/C++ header file omp.h –omp_lib Fortran module (omp_lib.h header in some implementations) •‫کاری‬ ‫بار‬ ‫توزیع‬ ‫برای‬ ‫مهم‬ ‫تابع‬ ‫دو‬ –omp_get_num_threads() –omp_get_thread_num()
  • 67. ‫توابع‬ ‫با‬ ‫حلقه‬ ‫یک‬ ‫سازی‬ ‫موازی‬ ‫ای‬ ‫کتابخانه‬ #ifdef _OPENMP #include “omp.h” #else #define omp_get_thread_num() 0 #define omp_get_num_threads() 1 #endif … #pragma omp parallel private(i,nthrds,thr_id) { nthrds = omp_get_num_threads(); thrd_id = omp_get_thrd_num(); for (i=thrd_id; i<n; i+=nthrds) { … } }