Bagikan melalui


3. Fungsi pustaka run-time

Bagian ini menjelaskan fungsi pustaka run-time OpenMP C dan C++. Header <omp.h> mendeklarasikan dua jenis, beberapa fungsi yang dapat digunakan untuk mengontrol dan mengkueri lingkungan eksekusi paralel, dan mengunci fungsi yang dapat digunakan untuk menyinkronkan akses ke data.

Jenisnya omp_lock_t adalah jenis objek yang mampu mewakili bahwa kunci tersedia, atau bahwa utas memiliki kunci. Kunci ini disebut sebagai kunci sederhana.

Jenisnya omp_nest_lock_t adalah jenis objek yang mampu mewakili apakah kunci tersedia, atau identitas utas yang memiliki kunci dan jumlah berlapis (dijelaskan di bawah). Kunci ini disebut sebagai kunci bersarang.

Fungsi pustaka adalah fungsi eksternal dengan tautan "C".

Deskripsi dalam bab ini dibagi menjadi topik-topik berikut:

3.1 Fungsi lingkungan eksekusi

Fungsi yang dijelaskan di bagian ini memengaruhi dan memantau utas, prosesor, dan lingkungan paralel:

3.1.1 fungsi omp_set_num_threads

Fungsi ini omp_set_num_threads mengatur jumlah default utas yang akan digunakan untuk wilayah paralel nanti yang tidak menentukan num_threads klausa. Formatnya sebagai berikut:

#include <omp.h>
void omp_set_num_threads(int num_threads);

Nilai parameter num_threads harus berupa bilangan bulat positif. Efeknya tergantung pada apakah penyesuaian dinamis jumlah utas diaktifkan. Untuk serangkaian aturan komprehensif tentang interaksi antara omp_set_num_threads fungsi dan penyesuaian dinamis utas, lihat bagian 2.3.

Fungsi ini memiliki efek yang dijelaskan di atas ketika dipanggil dari sebagian program di mana omp_in_parallel fungsi mengembalikan nol. Jika dipanggil dari bagian program tempat omp_in_parallel fungsi mengembalikan nilai bukan nol, perilaku fungsi ini tidak terdefinisi.

Panggilan ini lebih diutamakan daripada OMP_NUM_THREADS variabel lingkungan. Nilai default untuk jumlah utas, yang dapat dibuat dengan memanggil omp_set_num_threads atau dengan mengatur OMP_NUM_THREADS variabel lingkungan, dapat secara eksplisit ditimpa pada satu parallel arahan num_threads dengan menentukan klausul.

Untuk informasi selengkapnya, lihat omp_set_dynamic.

Referensi silang

  • fungsi omp_set_dynamic
  • fungsi omp_get_dynamic
  • variabel lingkungan OMP_NUM_THREADS
  • klausa num_threads

3.1.2 fungsi omp_get_num_threads

Fungsi mengembalikan omp_get_num_threads jumlah utas yang saat ini berada dalam tim yang menjalankan wilayah paralel dari tempatnya dipanggil. Formatnya sebagai berikut:

#include <omp.h>
int omp_get_num_threads(void);

Klausa num_threads , omp_set_num_threads fungsi, dan OMP_NUM_THREADS variabel lingkungan mengontrol jumlah utas dalam tim.

Jika jumlah utas belum ditetapkan secara eksplisit oleh pengguna, defaultnya ditentukan implementasi. Fungsi ini mengikat ke direktif penutup terdekat parallel . Jika dipanggil dari bagian serial program, atau dari wilayah paralel berlapis yang diserialisasikan, fungsi ini mengembalikan 1.

Untuk informasi selengkapnya, lihat omp_set_dynamic.

Referensi silang

3.1.3 fungsi omp_get_max_threads

Fungsi mengembalikan omp_get_max_threads bilangan bulat yang dijamin setidaknya sebesar jumlah utas yang akan digunakan untuk membentuk tim jika wilayah paralel tanpa num_threads klausul akan dilihat pada saat itu dalam kode. Formatnya sebagai berikut:

#include <omp.h>
int omp_get_max_threads(void);

Berikut ini mengekspresikan batas bawah pada nilai omp_get_max_threads:

threads-used-for-next-team<= omp_get_max_threads

Perhatikan bahwa jika wilayah paralel lain menggunakan klausul num_threads untuk meminta jumlah utas tertentu, jaminan pada batas bawah hasil omp_get_max_threads tidak lagi ditahan.

Nilai omp_get_max_threads pengembalian fungsi dapat digunakan untuk mengalokasikan penyimpanan yang cukup secara dinamis untuk semua utas dalam tim yang dibentuk di wilayah paralel berikutnya.

Referensi silang

3.1.4 fungsi omp_get_thread_num

Fungsi mengembalikan omp_get_thread_num nomor utas, dalam timnya, dari utas yang menjalankan fungsi. Nomor utas terletak antara 0 dan omp_get_num_threads()-1, inklusif. Utas master tim adalah utas 0.

Formatnya sebagai berikut:

#include <omp.h>
int omp_get_thread_num(void);

Jika dipanggil dari wilayah serial, omp_get_thread_num mengembalikan 0. Jika dipanggil dari dalam wilayah paralel berlapis yang diserialisasikan, fungsi ini mengembalikan 0.

Referensi silang

  • fungsi omp_get_num_threads

3.1.5 fungsi omp_get_num_procs

Fungsi mengembalikan omp_get_num_procs jumlah prosesor yang tersedia untuk program pada saat fungsi dipanggil. Formatnya sebagai berikut:

#include <omp.h>
int omp_get_num_procs(void);

3.1.6 fungsi omp_in_parallel

Fungsi mengembalikan omp_in_parallel nilai bukan nol jika dipanggil dalam jangkauan dinamis dari wilayah paralel yang dijalankan secara paralel; jika tidak, fungsi akan mengembalikan 0. Formatnya sebagai berikut:

#include <omp.h>
int omp_in_parallel(void);

Fungsi ini mengembalikan nilai bukan nol saat dipanggil dari dalam wilayah yang dijalankan secara paralel, termasuk wilayah berlapis yang diserialisasikan.

3.1.7 fungsi omp_set_dynamic

Fungsi ini omp_set_dynamic memungkinkan atau menonaktifkan penyesuaian dinamis jumlah utas yang tersedia untuk eksekusi wilayah paralel. Formatnya sebagai berikut:

#include <omp.h>
void omp_set_dynamic(int dynamic_threads);

Jika dynamic_threads mengevaluasi ke nilai bukan nol, jumlah utas yang digunakan untuk mengeksekusi wilayah paralel yang akan datang dapat disesuaikan secara otomatis oleh lingkungan run-time untuk menggunakan sumber daya sistem dengan sebaik-baiknya. Sebagai konsekuensinya, jumlah utas yang ditentukan oleh pengguna adalah jumlah utas maksimum. Jumlah utas dalam tim yang menjalankan wilayah paralel tetap diperbaiki selama durasi wilayah paralel tersebut omp_get_num_threads dan dilaporkan oleh fungsi.

Jika dynamic_threads mengevaluasi ke 0, penyesuaian dinamis dinonaktifkan.

Fungsi ini memiliki efek yang dijelaskan di atas ketika dipanggil dari sebagian program di mana omp_in_parallel fungsi mengembalikan nol. Jika dipanggil dari bagian program tempat omp_in_parallel fungsi mengembalikan nilai bukan nol, perilaku fungsi ini tidak terdefinisi.

Panggilan untuk omp_set_dynamic lebih diutamakan daripada OMP_DYNAMIC variabel lingkungan.

Default untuk penyesuaian dinamis utas ditentukan implementasi. Akibatnya, kode pengguna yang bergantung pada sejumlah utas tertentu untuk eksekusi yang benar harus secara eksplisit menonaktifkan utas dinamis. Implementasi tidak diperlukan untuk memberikan kemampuan untuk menyesuaikan jumlah utas secara dinamis, tetapi diperlukan untuk menyediakan antarmuka untuk mendukung portabilitas di semua platform.

Khusus Microsoft

Dukungan saat ini dan omp_get_dynamic omp_set_dynamic adalah sebagai berikut:

Parameter input untuk omp_set_dynamic tidak memengaruhi kebijakan utas dan tidak mengubah jumlah utas. omp_get_num_threads selalu mengembalikan angka yang ditentukan pengguna, jika diatur, atau nomor utas default. Dalam implementasi Microsoft saat ini, omp_set_dynamic(0) nonaktifkan utas dinamis sehingga kumpulan utas yang ada dapat digunakan kembali untuk wilayah paralel berikut. omp_set_dynamic(1) mengaktifkan utas dinamis dengan membuang sekumpulan utas yang ada dan membuat set baru untuk wilayah paralel yang akan datang. Jumlah utas dalam set baru sama dengan set lama, dan didasarkan pada nilai pengembalian .omp_get_num_threads Oleh karena itu, untuk performa terbaik, gunakan omp_set_dynamic(0) untuk menggunakan kembali utas yang ada.

Referensi silang

3.1.8 fungsi omp_get_dynamic

Fungsi omp_get_dynamic mengembalikan nilai bukan nol jika penyesuaian dinamis utas diaktifkan, dan mengembalikan 0 sebaliknya. Formatnya sebagai berikut:

#include <omp.h>
int omp_get_dynamic(void);

Jika implementasi tidak menerapkan penyesuaian dinamis jumlah utas, fungsi ini selalu mengembalikan 0. Untuk informasi selengkapnya, lihat omp_set_dynamic.

Referensi silang

3.1.9 fungsi omp_set_nested

Fungsi ini omp_set_nested memungkinkan atau menonaktifkan paralelisme berlapis. Formatnya sebagai berikut:

#include <omp.h>
void omp_set_nested(int nested);

Jika berlapis mengevaluasi ke 0, paralelisme berlapis dinonaktifkan, yang merupakan wilayah paralel default, dan berlapis diserialisasikan dan dijalankan oleh utas saat ini. Jika tidak, paralelisme berlapis diaktifkan, dan wilayah paralel yang ditumpuk dapat menyebarkan utas tambahan untuk membentuk tim berlapis.

Fungsi ini memiliki efek yang dijelaskan di atas ketika dipanggil dari sebagian program di mana omp_in_parallel fungsi mengembalikan nol. Jika dipanggil dari bagian program tempat omp_in_parallel fungsi mengembalikan nilai bukan nol, perilaku fungsi ini tidak terdefinisi.

Panggilan ini lebih diutamakan daripada OMP_NESTED variabel lingkungan.

Ketika paralelisme berlapis diaktifkan, jumlah utas yang digunakan untuk menjalankan wilayah paralel berlapis ditentukan implementasi. Akibatnya, implementasi yang mematuhi OpenMP diizinkan untuk menserialisasikan wilayah paralel berlapis bahkan ketika paralelisme berlapis diaktifkan.

Referensi silang

3.1.10 fungsi omp_get_nested

Fungsi omp_get_nested mengembalikan nilai bukan nol jika paralelisme berlapis diaktifkan dan 0 jika dinonaktifkan. Untuk informasi selengkapnya tentang paralelisme berlapis, lihat omp_set_nested. Formatnya sebagai berikut:

#include <omp.h>
int omp_get_nested(void);

Jika implementasi tidak menerapkan paralelisme berlapis, fungsi ini selalu mengembalikan 0.

3.2 Fungsi kunci

Fungsi yang dijelaskan di bagian ini memanipulasi kunci yang digunakan untuk sinkronisasi.

Untuk fungsi berikut, variabel kunci harus memiliki jenis omp_lock_t. Variabel ini hanya boleh diakses melalui fungsi-fungsi ini. Semua fungsi kunci memerlukan argumen yang memiliki penunjuk untuk omp_lock_t mengetik.

Untuk fungsi berikut, variabel kunci harus memiliki jenis omp_nest_lock_t. Variabel ini hanya boleh diakses melalui fungsi-fungsi ini. Semua fungsi kunci yang dapat disarangkan memerlukan argumen yang memiliki penunjuk untuk omp_nest_lock_t mengetik.

Fungsi kunci OpenMP mengakses variabel kunci singgah sehingga mereka selalu membaca dan memperbarui nilai terbaru dari variabel kunci. Oleh karena itu, program OpenMP tidak perlu menyertakan arahan eksplisit flush untuk memastikan bahwa nilai variabel kunci konsisten di antara utas yang berbeda. (Mungkin ada kebutuhan akan arahan untuk flush membuat nilai variabel lain konsisten.)

3.2.1 fungsi omp_init_lock dan omp_init_nest_lock

Fungsi-fungsi ini menyediakan satu-satunya cara untuk menginisialisasi kunci. Setiap fungsi menginisialisasi kunci yang terkait dengan kunci parameter untuk digunakan dalam panggilan mendatang. Formatnya sebagai berikut:

#include <omp.h>
void omp_init_lock(omp_lock_t *lock);
void omp_init_nest_lock(omp_nest_lock_t *lock);

Status awal tidak terkunci (yaitu, tidak ada utas yang memiliki kunci). Untuk kunci berlapis, jumlah berlapis awal adalah nol. Tidak patuh untuk memanggil salah satu rutinitas ini dengan variabel kunci yang telah diinisialisasi.

3.2.2 fungsi omp_destroy_lock dan omp_destroy_nest_lock

Fungsi-fungsi ini memastikan bahwa kunci variabel yang ditujukan untuk mengunci tidak diinisialisasi. Formatnya sebagai berikut:

#include <omp.h>
void omp_destroy_lock(omp_lock_t *lock);
void omp_destroy_nest_lock(omp_nest_lock_t *lock);

Tidak patuh untuk memanggil salah satu rutinitas ini dengan variabel kunci yang tidak diinisialisasi atau tidak terkunci.

3.2.3 fungsi omp_set_lock dan omp_set_nest_lock

Masing-masing fungsi ini memblokir utas yang menjalankan fungsi hingga kunci yang ditentukan tersedia lalu mengatur kunci. Kunci sederhana tersedia jika tidak terkunci. Kunci berlapis tersedia jika tidak terkunci atau jika sudah dimiliki oleh utas yang menjalankan fungsi. Formatnya sebagai berikut:

#include <omp.h>
void omp_set_lock(omp_lock_t *lock);
void omp_set_nest_lock(omp_nest_lock_t *lock);

Untuk kunci sederhana, argumen ke omp_set_lock fungsi harus menunjuk ke variabel kunci yang diinisialisasi. Kepemilikan kunci diberikan ke utas yang menjalankan fungsi.

Untuk kunci berlapis, argumen ke omp_set_nest_lock fungsi harus menunjuk ke variabel kunci yang diinisialisasi. Jumlah berlapis bertambah, dan utas diberikan, atau disimpan, kepemilikan kunci.

3.2.4 fungsi omp_unset_lock dan omp_unset_nest_lock

Fungsi-fungsi ini menyediakan sarana untuk melepaskan kepemilikan kunci. Formatnya sebagai berikut:

#include <omp.h>
void omp_unset_lock(omp_lock_t *lock);
void omp_unset_nest_lock(omp_nest_lock_t *lock);

Argumen untuk masing-masing fungsi ini harus menunjuk ke variabel kunci yang diinisialisasi yang dimiliki oleh utas yang menjalankan fungsi. Perilaku tidak ditentukan jika utas tidak memiliki kunci tersebut.

Untuk kunci sederhana, omp_unset_lock fungsi melepaskan utas yang menjalankan fungsi dari kepemilikan kunci.

Untuk kunci berlapis, omp_unset_nest_lock fungsi mengurangi jumlah bersarang, dan melepaskan utas yang menjalankan fungsi dari kepemilikan kunci jika jumlah yang dihasilkan adalah nol.

3.2.5 fungsi omp_test_lock dan omp_test_nest_lock

Fungsi-fungsi ini mencoba mengatur kunci tetapi tidak memblokir eksekusi utas. Formatnya sebagai berikut:

#include <omp.h>
int omp_test_lock(omp_lock_t *lock);
int omp_test_nest_lock(omp_nest_lock_t *lock);

Argumen harus menunjuk ke variabel kunci yang diinisialisasi. Fungsi-fungsi ini mencoba mengatur kunci dengan cara yang sama seperti omp_set_lock dan omp_set_nest_lock, kecuali bahwa fungsi tersebut tidak memblokir eksekusi utas.

Untuk kunci sederhana, omp_test_lock fungsi mengembalikan nilai bukan nol jika kunci berhasil diatur; jika tidak, fungsi mengembalikan nol.

Untuk kunci berlapis, omp_test_nest_lock fungsi mengembalikan jumlah berlapis baru jika kunci berhasil diatur; jika tidak, fungsi mengembalikan nol.

3.3 Rutinitas pengaturan waktu

Fungsi yang dijelaskan di bagian ini mendukung timer jam dinding portabel:

  • Fungsi omp_get_wtime mengembalikan waktu jam dinding yang berlalu.
  • Fungsi omp_get_wtick mengembalikan detik di antara tanda centang jam berturut-turut.

3.3.1 fungsi omp_get_wtime

Fungsi mengembalikan omp_get_wtime nilai titik mengambang presisi ganda yang sama dengan waktu jam dinding yang berlalu dalam hitungan detik sejak beberapa "waktu di masa lalu". "Waktu di masa lalu" aktual bersifat arbitrer, tetapi dijamin tidak berubah selama eksekusi program aplikasi. Formatnya sebagai berikut:

#include <omp.h>
double omp_get_wtime(void);

Diantisipasi bahwa fungsi akan digunakan untuk mengukur waktu yang berlalu seperti yang ditunjukkan dalam contoh berikut:

double start;
double end;
start = omp_get_wtime();
... work to be timed ...
end = omp_get_wtime();
printf_s("Work took %f sec. time.\n", end-start);

Waktu yang dikembalikan adalah "waktu per utas" yang berarti mereka tidak diharuskan konsisten secara global di semua utas yang berpartisipasi dalam aplikasi.

3.3.2 fungsi omp_get_wtick

Fungsi mengembalikan omp_get_wtick nilai titik mengambang presisi ganda yang sama dengan jumlah detik antara tanda centang jam berturut-turut. Formatnya sebagai berikut:

#include <omp.h>
double omp_get_wtick(void);