Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Dokumen ini menentukan kumpulan direktif kompilator, fungsi pustaka, dan variabel lingkungan yang dapat Anda gunakan untuk menentukan paralelisme memori bersama dalam program C dan C++. Fungsionalitas yang dijelaskan dalam dokumen ini secara kolektif dikenal sebagai Antarmuka Program Aplikasi (API) OpenMP C/C++. Tujuan dari spesifikasi ini adalah untuk menyediakan model untuk pemrograman paralel yang memungkinkan program menjadi portabel di seluruh arsitektur memori bersama dari vendor yang berbeda. Pengkompilasi dari banyak vendor mendukung API OpenMP C/C++. Informasi selengkapnya tentang OpenMP, termasuk Antarmuka Program Aplikasi OpenMP Fortran, dapat ditemukan di situs web berikut:
Direktif, fungsi pustaka, dan variabel lingkungan yang ditentukan dalam dokumen ini memungkinkan Anda membuat dan mengelola program paralel sambil memungkinkan portabilitas. Arahan memperluas model pemrograman berurutan C dan C++ dengan konstruksi satu program beberapa data (SPMD), konstruksi berbagi kerja, dan konstruksi sinkronisasi. Mereka juga mendukung berbagi dan privatisasi data. Pengkompilasi yang mendukung OpenMP C dan C++ API menyertakan opsi baris perintah ke pengkompilasi yang mengaktifkan dan memungkinkan interpretasi semua arahan kompilator OpenMP.
1.1 Cakupan
Spesifikasi ini hanya mencakup paralelisasi yang diarahkan pengguna, di mana Anda secara eksplisit menentukan tindakan apa yang dilakukan sistem kompilator dan run-time untuk menjalankan program secara paralel. Implementasi OpenMP C dan C++ tidak diperlukan untuk memeriksa dependensi, konflik, kebuntuan, kondisi balapan, atau masalah lain yang mengakibatkan eksekusi program yang salah. Anda bertanggung jawab untuk memastikan bahwa aplikasi menggunakan konstruksi OpenMP C dan C++ API dijalankan dengan benar. Paralelisasi dan arahan otomatis yang dihasilkan kompilator ke pengkompilasi untuk membantu paralelisasi tersebut tidak tercakup dalam dokumen ini.
1.2 Definisi istilah
Istilah berikut digunakan dalam dokumen ini:
penghalang
Titik sinkronisasi yang harus dijangkau semua utas dalam tim. Setiap utas menunggu sampai semua utas dalam tim tiba di titik ini. Ada hambatan eksplisit yang diidentifikasi oleh arahan dan hambatan implisit yang dibuat oleh implementasi.
membangun
Konstruksi adalah pernyataan. Ini terdiri dari arahan, diikuti oleh blok terstruktur. Beberapa arahan bukan bagian dari konstruksi. (Lihat arahan openmp dalam lampiran C).
Direktif
C atau C++
#pragmadiikuti olehomppengidentifikasi, teks lain, dan baris baru. Direktif menentukan perilaku program.tingkat dinamis
Semua pernyataan dalam tingkat leksikal, ditambah pernyataan apa pun di dalam fungsi yang dijalankan sebagai akibat dari eksekusi pernyataan dalam jangkauan leksikal. Tingkat dinamis juga disebut sebagai wilayah.
tingkat leksikal
Pernyataan secara leksikal disimpan dalam blok terstruktur.
utas master
Utas yang membuat tim saat wilayah paralel dimasukkan.
wilayah paralel
Pernyataan yang mengikat konstruksi paralel OpenMP dan dapat dijalankan oleh banyak utas.
privat
Variabel privat memberi nama blok penyimpanan yang unik untuk utas yang membuat referensi. Ada beberapa cara untuk menentukan bahwa variabel bersifat privat: definisi dalam wilayah paralel, direktif,
threadprivateklausa , ,privatefirstprivate, ataulastprivate, atau penggunaan variabel sebagaireductionvariabel kontrol perulangan dalamforperulangan segera mengikutiforarahan ataufor.parallel forwilayah
Tingkat dinamis.
wilayah serial
Pernyataan yang dijalankan hanya oleh utas master di luar tingkat dinamis dari wilayah paralel mana pun.
serialisasi
Untuk menjalankan konstruksi paralel dengan:
tim utas yang hanya terdiri dari satu utas (yang merupakan utas master untuk konstruksi paralel itu),
urutan serial eksekusi untuk pernyataan dalam blok terstruktur (urutan yang sama seolah-olah blok bukan bagian dari konstruksi paralel), dan
tidak ada efek pada nilai yang dikembalikan oleh
omp_in_parallel()(selain efek dari konstruksi paralel berlapis).
dibagikan
Variabel bersama menamai satu blok penyimpanan. Semua utas dalam tim yang mengakses variabel ini juga mengakses satu blok penyimpanan ini.
blok terstruktur
Blok terstruktur adalah pernyataan (tunggal atau senyawa) yang memiliki satu entri dan satu keluar. Jika ada lompatan ke atau keluar dari pernyataan, pernyataan itu adalah blok terstruktur. (Aturan ini mencakup panggilan ke
longjmp(3C) atau penggunaanthrow, meskipun panggilan keexitdiizinkan.) Jika eksekusinya selalu dimulai pada pembukaan{dan selalu berakhir pada penutupan}, pernyataan senyawa adalah blok terstruktur. Pernyataan ekspresi, pernyataan pemilihan, pernyataan iterasi, atautryblok adalah blok terstruktur jika pernyataan majemuk yang sesuai diperoleh dengan mengapitnya{dan}akan menjadi blok terstruktur. Pernyataan lompat, pernyataan berlabel, atau pernyataan deklarasi bukanlah blok terstruktur.dan kueri
Satu atau beberapa utas bekerja sama dalam eksekusi konstruksi.
alur
Entitas eksekusi memiliki alur kontrol serial, sekumpulan variabel privat, dan akses ke variabel bersama.
variabel
Pengidentifikasi, secara opsional memenuhi syarat menurut nama namespace, yang menamai objek.
1.3 Model Eksekusi
OpenMP menggunakan model fork-join dari eksekusi paralel. Meskipun model fork-join ini dapat berguna untuk memecahkan berbagai masalah, model ini disesuaikan untuk aplikasi berbasis array besar. OpenMP dimaksudkan untuk mendukung program yang dijalankan dengan benar baik sebagai program paralel (banyak utas eksekusi dan pustaka dukungan OpenMP lengkap). Ini juga untuk program yang dijalankan dengan benar sebagai program berurutan (arahan diabaikan dan pustaka stubs OpenMP sederhana). Namun, dimungkinkan dan diizinkan untuk mengembangkan program yang tidak berperilaku dengan benar ketika dijalankan secara berurutan. Selain itu, tingkat paralelisme yang berbeda dapat mengakibatkan hasil numerik yang berbeda karena perubahan dalam asosiasi operasi numerik. Misalnya, pengurangan penambahan serial mungkin memiliki pola asosiasi penambahan yang berbeda dari pengurangan paralel. Asosiasi yang berbeda ini dapat mengubah hasil penambahan floating-point.
Program yang ditulis dengan OPENMP C/C++ API memulai eksekusi sebagai satu utas eksekusi yang disebut utas master. Utas master dijalankan di wilayah serial hingga konstruksi paralel pertama ditemui. Dalam OPENMP C/C++ API, direktif parallel merupakan konstruksi paralel. Ketika konstruksi paralel ditemui, utas master membuat tim utas, dan master menjadi master tim. Setiap utas dalam tim menjalankan pernyataan dalam tingkat dinamis wilayah paralel, kecuali untuk konstruksi berbagi kerja. Semua utas dalam tim harus menemukan konstruksi berbagi kerja dalam urutan yang sama, dan satu atau beberapa utas menjalankan pernyataan dalam blok terstruktur terkait. Hambatan yang tersirat di akhir konstruksi berbagi kerja tanpa nowait klausul dijalankan oleh semua utas dalam tim.
Jika utas memodifikasi objek bersama, itu tidak hanya memengaruhi lingkungan eksekusinya sendiri, tetapi juga utas lain dalam program. Modifikasi dijamin selesai, dari sudut pandang utas lain, pada titik urutan berikutnya (seperti yang didefinisikan dalam bahasa dasar) hanya jika objek dinyatakan volatil. Jika tidak, modifikasi dijamin selesai setelah terlebih dahulu memodifikasi utas. Utas lainnya kemudian (atau secara bersamaan) melihat flush arahan yang menentukan objek (baik secara implisit maupun eksplisit).
flush Ketika arahan yang tersirat oleh arahan OpenMP lainnya tidak menjamin urutan efek samping yang benar, programmer bertanggung jawab untuk memberikan arahan eksplisit flush tambahan.
Setelah menyelesaikan konstruksi paralel, utas dalam tim disinkronkan pada penghalang implisit, dan hanya utas master yang melanjutkan eksekusi. Sejumlah konstruksi paralel dapat ditentukan dalam satu program. Akibatnya, program dapat fork dan bergabung berkali-kali selama eksekusi.
OPENMP C/C++ API memungkinkan programmer menggunakan direktif dalam fungsi yang dipanggil dari dalam konstruksi paralel. Arahan yang tidak muncul dalam tingkat leksikal konstruksi paralel tetapi dapat terletak pada tingkat dinamis yang disebut arahan yatim piatu . Dengan arahan yatim piatu, programmer dapat menjalankan sebagian besar program mereka secara paralel, dengan hanya perubahan minimal pada program berurutan. Dengan fungsionalitas ini, Anda dapat membuat kode konstruksi paralel di tingkat atas pohon panggilan program dan menggunakan arahan untuk mengontrol eksekusi di salah satu fungsi yang disebut.
Panggilan yang tidak disinkronkan ke fungsi output C dan C++ yang menulis ke file yang sama dapat mengakibatkan output di mana data yang ditulis oleh utas yang berbeda muncul dalam urutan nondeterministik. Demikian pula, panggilan yang tidak disinkronkan ke fungsi input yang membaca dari file yang sama dapat membaca data dalam urutan nondeterministik. Penggunaan I/O yang tidak disinkronkan, sehingga setiap utas mengakses file yang berbeda, menghasilkan hasil yang sama dengan eksekusi serial fungsi I/O.
1.4 Kepatuhan
Implementasi OPENMP C/C++ API sesuai dengan OpenMP jika mengenali dan mempertahankan semantik semua elemen spesifikasi ini, seperti yang ditata dalam Bab 1, 2, 3, 4, dan Lampiran C. Lampiran A, B, D, E, dan F hanya untuk tujuan informasi dan bukan bagian dari spesifikasi. Implementasi yang hanya menyertakan subset API tidak sesuai dengan OpenMP.
OpenMP C dan C++ API adalah ekstensi untuk bahasa dasar yang didukung oleh implementasi. Jika bahasa dasar tidak mendukung konstruksi bahasa atau ekstensi yang muncul dalam dokumen ini, implementasi OpenMP tidak diperlukan untuk mendukungnya.
Semua fungsi pustaka C dan C++ standar dan fungsi bawaan (yaitu, fungsi di mana pengkompilasi memiliki pengetahuan khusus) harus aman untuk utas. Penggunaan fungsi aman utas yang tidak disinkronkan oleh utas yang berbeda di dalam wilayah paralel tidak menghasilkan perilaku yang tidak terdefinisi. Namun, perilakunya mungkin tidak sama seperti di wilayah serial. (Fungsi pembuatan angka acak adalah contoh.)
API OpenMP C/C++ menentukan bahwa perilaku tertentu ditentukan implementasi. Implementasi OpenMP yang sesuai diperlukan untuk menentukan dan mendokumenkan perilakunya dalam kasus ini. Untuk daftar perilaku yang ditentukan implementasi, lihat lampiran E.
1.5 Referensi normatif
ISO/IEC 9899:1999, Teknologi Informasi - Bahasa Pemrograman - C. Spesifikasi OpenMP API ini mengacu pada ISO/IEC 9899:1999 sebagai C99.
ISO/IEC 9899:1990, Teknologi Informasi - Bahasa Pemrograman - C. Spesifikasi OpenMP API ini mengacu pada ISO/IEC 9899:1990 sebagai C90.
ISO/IEC 14882:1998, Teknologi Informasi - Bahasa Pemrograman - C++. Spesifikasi OpenMP API ini mengacu pada ISO/IEC 14882:1998 sebagai C++.
Jika spesifikasi OpenMP API ini mengacu pada C, referensi dibuat ke bahasa dasar yang didukung oleh implementasi.