Selasa, 16 Maret 2010

OpenMP (Open Multi-Processing)


CLIENT SERVER

1. Pengertian OpenMP


OpenMP (Open Multi-Processing) adalah sebuah antarmuka pemrograman aplikasi (API) yang mendukung multi processing shared memory pemrograman di C, C++ dan Fortran pada berbagai arsitektur, termasuk Unix dan Microsoft Windows platform. OpenMP Terdiri dari satu set perintah kompiler,perpustakaan rutinitas, dan variabel lingkungan yang mempengaruhi run-time. Banyak Aplikasi dibangun dengan model hibrida pemrograman paralel dapat dijalankan pada komputer cluster dengan menggunakan OpenMP dan Message Passing Interface (MPI), atau lebih transparan dengan menggunakan ekstensi OpenMP non-shared memory systems.


Sejarah OpenMP dimulai dari diterbitkannya API pertama untuk Fotran 1.0 pada Oktober 1997 oleh OpenMP Architecture Review Board (ARB). Oktober tahun berikutnya OpenMP Architecture Review Board (ARB) merilis standart C / C++. Pada tahun 2000 mengeluarkan versi 2.0 untuk fotran dan poda tahun 2002 dirilis versi 2.0 untuk C / C++. Pada tahun 2005 dirilis versi 2.5 yang merupakan pengabungan fotran, C, dan C++/ pada mei 2008 versi 3.0 yang terdapat didalmnya konsept tasks dan task construct.

OpenMP mengimplementasi multithreading. Bagian kode yang akan dijalankan secara parallel ditandai sesuai dengan Preprocessor directif sehingga akan membuat thread-thread sebelum dijalnkan. Setiap thread memiliki id yang di buat mengunakan fungsi ( omp_get_thread_num() pada C/C++ dan OMP_GET_THREAD_NUM() pada Fortran). Secara default, setiap thread mengeksekusi kode secara parallel dan independent. "Work-sharing constructs" dapat dapat digunakan untuk membagi tugas antar thread sehingga setiap thread menjalankan sesuai bagian alokasi kodenya. Fungsi OpenMP berada pada file header yang berlabel “omp.h” di C / C++


2. Bagian OpenMp

Unsur inti OpenMP adalah pembuatan konstruksi thread, distribusi beban kerja (pembagian kerja), pengelolaan data-environment, thread sinkronisasi, bagian user-level runtime dan variabel environment.

Sebuah direktif kompiler C / C + + ini disebut Pragma (pragmatis informasi). Compiler mengarahkan specifikasi untuk OpenMP dalam C / C + + yang ditulis dalam kode sebagai berikut:



# Pragma omp


OpenMP spesifik pragmas yang tercantum di bawah ini:


Pembuatan Thread

Pembuatan Thrend oleh omp paralel. Hal ini digunakan membagi task secara paralel.Proses utama akan dinyatakan sebagai master Thread dengan thread ID 0.

Contoh: Display "Hallo word" menggunakan beberapa thread.

  int main (int argc, char * argv [])

(
# Pragma omp paralel
printf ( "Halo, dunia. \ n");
return 0;
)

Work-sharing Constructs

digunakan untuk menentukan kerja secara independent untuk menetapkan satu atau semua thread.

§ omp for atau omp do: digunakan untuk memisahkan loop iterasi antara thread, sering disebut loop constructs.

§ sections: menugaskan secara berturut-turut independent blok code kepada thread lain

§ single: menetapkan sebuah blok kode yang dijalankan oleh hanya satu thread.

§ master: mirip dengan singgle, tetapi blok kode akan dieksekusi hanya oleh thread master.

Contoh: inisialisasi nilai array yang besar secara paralel, menggunakan setiap thread untuk melakukan sebagian dari pekerjaan

 
int main (int argc, char * argv []) (

const int N = 100000;
int i, a [N];

# Pragma omp paralel untuk
for (i = 0; i i + +)
a [i] = 2 * i;

return 0;
)


OpenMP clauses

OpenMP adalah model pemrograman memori bersama, sebagian besar variabel dalam kode OpenMP terlihat oleh semua thread secara default. Tetapi kadang-kadang variabel private diperlukan untuk menghindari race conditions dan ada kebutuhan untuk melewatkan nilai-nilai antara part dan region paralel berurutan (blok kode dijalankan secara paralel), sehingga lingkungan data pengelolaan dikenal sebagai sharing attribute clauses dengan menambahkan Clouses OpenMP direktif.

Berbagai jenis klausa-klausa:

Data sharing attribute clauses

  • shared: data di dalam wilayah paralel digunakan bersama-sama, yang berarti terlihat dan dapat diakses oleh semua thread secara bersamaan. Secara default, semua variabel dalam wilayah work sharing region adalah shared kecuali loop iteration counter.
  • private: data di dalam wilayah paralel adalah untuk pribadi masing-masing thread, yang berarti masing-masing thread akan memiliki salinan lokal dan menggunakannya sebagai variabel sementara. Variabel private tidak diinisialisasi dan nilai tidak dipertahankan untuk digunakan di luar wilayah paralel. Secara default, iterasi loop counter pada loop OpenMP adlah private.
  • default: memungkinkan para programmer untuk menyatakan bahwa data default scope sehingga parallel region akan saling shared, atau none untuk C / C + +, atau shared, firstprivate, private, atau none untuk Fortran. Pilihan none memaksa programmer untuk mendeklarasikan setiap variabel di wilayah paralel menggunakan data sharing attribute clauses.
  • firstprivate: seperti private kecuali untuk melakukan inisialisasi nilai aslinya.
  • lastprivate: seperti private kecuali nilai asli diperbarui setelah dibuat.
  • reduction: cara yang aman menggabungkan kerja dari semua thread setelah dibuat.

Sinkronisasi klausa

  • critical section: blok kode yang tertutup akan dilaksanakan oleh satu thread pada satu waktu, dan tidak secara simultan dilaksanakan oleh beberapa thread. Hal ini sering digunakan untuk melindungi data dari berbagi race conditions.
  • atomic: mirip dengan critical section, tetapi memberitahu compiler untuk menggunakan instruksi perangkat keras khusus untuk performa yang lebih baik. Compiler dapat memilih untuk mengabaikan pengguna dan menggunakan critical section saja.
  • ordered: blok yang terstruktur dilaksanakan dalam urutan iterasi akan dieksekusi dalam loop berurutan
  • barrier: setiap thread menunggu sampai semua thread lainnya dari sebuah tim telah mencapai titik ini. Sebuah work-sharing construct memiliki implicit barrier synchronization di akhir.
  • nowait: menetapkan bahwa thread menyelesaikan pekerjaan yang ditugaskan dapat dilanjutkan tanpa menunggu semua thread dalam tim untuk menyelesaikan. Dengan tidak adanya clausa ini, thread menghadapi masalah sinkronisasi pada akhir work sharing construct.

Scheduling clauses

  • schedule(type, chunk): Ini berguna jika work sharing construct melakukan do-loop atau for-loop. interasi dalam work sharing construct.ditugaskan untuk thread sesuai dengan metode scheduling yang ditetapkan oleh ketentuan ini. Tiga jenis penjadwalan adalah:
  1. statis: Di sini, semua thread mealokasikan interasi sebelum mereka menjalankan iterasi loop. iterasi dibagi di antara thread yang sama secara default. Namun, integer untuk menentukan parameter " chunk " akan mengalokasikan " chunk " sesuai jumlah pengulangan susunan thread tertentu.

2. dinamis: Di sini, beberapa iterasi dialokasikan untuk sejumlah kecil thread. Setelah selesai thread tertentu maka dialokasikan iterasinya, ini berguna untuk mendapatkan satu dari iterasi yang tersisa. Parameter "chunk" mendefinisikan jumlah pengulangan susunan yang dialokasikan kepada thread pada suatu waktu.

3. guided: Sebuah potongan susunan iterasi dialokasikan untuk setiap thread secara dinamis. Ukuran sepotong berkurang secara eksponensial dengan alokasi untuk masing-masing berturut-turut ukuran minimum yang ditentukan dalam parameter "bongkahan"

JIKA kontrol

§ if: Hal ini akan menyebabkan thread melakuakan tugas hanya jika kondisi terpenuhi. Kalau tidak menjalankan blok kode seterusnya..

Inisialisasi

  • firstprivate: data private untuk masing-masing thread, tapi diinisialisasi dengan menggunakan nilai dari variabel dengan menggunakan nama yang sama dari master thread.
  • lastprivate: data private untuk setiap thread. Nilai dari data pribadi ini akan disalin ke variabel global dengan menggunakan nama yang sama di luar region paralel jika iterasi saat ini adalah yang terakhir dalam iteration loop. Sebuah variabel dapat firstprivate dan lastprivate.
  • threadprivate: Data adalah data global, tetapi pribadi paralel di masing-masing daerah selama runtime. Perbedaan antara threadprivate dan private adalah ruang lingkup global yang terkait dengan threadprivate dan nilai yang disimpan paralel di suatu region daerah.

Data copying

  • copying: mirip dengan variabel firstprivate untuk private, threadprivate variabel yang belum diinisialisasi, kecuali menggunakan copying untuk melewatkan nilai dari variabel global yang sesuai. Tidak melakuakn copyout diperlukan karena nilai suatu variabel threadprivate dipelihara selama pelaksanaan seluruh program.
  • copyprivate: digunakan dengan sendiri untuk mendukung penyalinan data nilai dari object private di satu thread (thread tunggal) untuk object yang sesuai pada thread lain dalam tim.

Reduction

  • reduction (operator | intrinsic: list): variabel memiliki salinan lokal di setiap thread, tetapi nilai-nilai dari salinan lokal akan diringkas (dikurangi) ke dalam variabel global. Hal ini sangat berguna jika operasi tertentu (ditentukan dalam "operator" clausa khusus ini) pada datatype yang berjalan dengan interaktif sehingga nilai pada iterasi tertentu tergantung pada nilai pada iterasi sebelumnya. Pada dasarnya, langkah-langkah yang mengarah ke kenaikan operasional adalah paralisme, tetapi thraed mengumpulkan dan menunggu sebelum memperbarui datatype, lalu akan menambahkan datatype dalam rangka untuk menghindari race condition. Ini akan diperlukan dalam parallel fungdi Integrasi Numerik dan Persamaan Diferensial, sebagai contoh umum.

Lain-lain

  • flush: Nilai variabel ini dipulihkan dari register ke memori untuk menggunakan nilai ini di luar sebuah bagian paralel
  • master: Executed hanya oleh master thread (thread yang bercabang selama pelaksanaan OpenMP direktif). Tidak implisit barrier; anggota tim lainnya (thread) tidak diperlukan untuk mencapainya.

User-level runtime routines

Digunakan untuk memodifikasi / memeriksa jumlah thread, mendeteksi jika konteks eksekusi berada dalam wilayah paralel, berapa banyak prosesor pada sistem yang sekarang, set / unset kunci, fungsi waktu, dll

Lingkungan variabel

Sebuah metode untuk mengubah fitur eksekusi aplikasi OpenMP. Digunakan untuk mengontrol loop iterasi penjadwalan, nomor standar thread, dll. Misalnya OMP_NUM_THREADS digunakan untuk menentukan jumlah thread untuk suatu aplikasi

3. Sample Program

Hello World

ni adalah program dasar, bahwa latihan paralel, private dan barrier directive, serta fungsi omp_get_thread_num dan omp_get_num_threads .

This is a basic program, that exercises the parallel, private and barrier directives, as well as the functions omp_get_thread_num andomp_get_num_threads (not to be confused).

C

  # include 

# include

int main (int argc, char * argv []) (
int th_id, nthreads;
# omp paralel Pragma swasta (th_id)
(
th_id = omp_get_thread_num ();
printf ( "Hello World dari thread% d \ n", th_id);
# Pragma omp penghalang
if (th_id == 0) (
nthreads = omp_get_num_threads ();
printf ( "Ada% d threads \ n", nthreads);
)
)
return 0;
)

C + +

 # include 

# include
int main (int argc, char * argv []) (
int th_id, nthreads;
# omp paralel Pragma swasta (th_id)
(
th_id = omp_get_thread_num ();
std:: cout << "Hello World dari thread" < "\ n";
# Pragma omp penghalang
if (th_id == 0) (
nthreads = omp_get_num_threads ();
std:: cout << "Terdapat" < "benang \ n";
)
)
return 0;
)

Fortran 77

       PROGRAM HELLO

INTEGER ID, NTHRDS
INTEGER OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS
C $ OMP PARALEL SWASTA (ID)
ID = OMP_GET_THREAD_NUM ()
PRINT *, 'HALO DUNIA DARI BENANG', ID
C $ OMP HAMBATAN
IF (ID. EQ. 0) MAKA
NTHRDS = OMP_GET_NUM_THREADS ()
PRINT *, 'ADA', NTHRDS, 'THREADS'
END
C $ OMP END PARALEL
END

Gratis formulir Fortran 90

  Program hello90

menggunakan omp_lib
integer:: id, nthreads
! $ omp paralel swasta (id)
id = omp_get_thread_num ()
write (*, *) 'Halo Dunia dari thread', id
! $ omp penghalang
if (id == 0) maka
nthreads = omp_get_num_threads ()
write (*, *) 'Ada', nthreads, 'benang'
end if
! $ omp akhir paralel
Program akhir

1 komentar:

  1. selamat siang mas Ahmad Qusyairi, maaf mengganggu..

    saya tertarik bgt dgn artikel ini..

    saya sedang belajar tentang OpenMP dan mencoba2 membuat suatu program pemercepatan menggunakan paralelisasi openmp.

    program yang saya buat tersebut dapat lebih cepat jika dijalankan secara paralelisasi,
    akan tetapi masalah nya, speedup yang saya dapat itu melebihi jumlah prosesor, speedup yang saya dapat adalah 4,7 x, sdkn prosesor yang saya gunakan adalah core i7..

    apakah ini berkaitan dgn Hyper-threading..?
    terus, mengapa speedup yg yg saya dapat itu ketika jumlah threadnya = 4, dan lebih atau kurang dari 4, speedup yg saya dapat hanya berkisar 3 koma an..

    jd, seandainya mas bisa memberi solusi sedikit tntg masalah yg sya alami ini..

    terima kasih sebelumnya

    BalasHapus