Bagikan melalui


Fungsi OpenMP

Menyediakan tautan ke fungsi yang digunakan dalam OPENMP API.

Implementasi Visual C++ dari standar OpenMP mencakup fungsi dan jenis data berikut.

Untuk eksekusi lingkungan:

Fungsi Deskripsi
omp_set_num_threads Menetapkan jumlah thread di wilayah paralel mendatang, kecuali ditimpa oleh klausa num_threads.
omp_get_num_threads Mengembalikan jumlah utas di wilayah paralel.
omp_get_max_threads Mengembalikan bilangan bulat yang sama dengan atau lebih besar dari jumlah utas yang akan tersedia jika wilayah paralel tanpa num_threads ditentukan pada saat itu dalam kode.
omp_get_thread_num Mengembalikan nomor utas dari utas yang sedang dieksekusi dalam tim utasnya.
omp_get_num_procs Mengembalikan jumlah prosesor yang tersedia saat fungsi dipanggil.
omp_in_parallel Mengembalikan nonzero jika dipanggil dari dalam wilayah paralel.
omp_set_dynamic Menunjukkan bahwa jumlah utas yang tersedia di wilayah paralel mendatang dapat disesuaikan dengan waktu proses.
omp_get_dynamic Mengembalikan nilai yang menunjukkan apakah jumlah utas yang tersedia di wilayah paralel mendatang dapat disesuaikan dengan waktu proses.
omp_set_nested Mengaktifkan paralelisme berlapis.
omp_get_nested Mengembalikan nilai yang menunjukkan apakah paralelisme berlapis diaktifkan.

Untuk kunci:

Fungsi Deskripsi
omp_init_lock Menginisialisasi kunci sederhana.
omp_init_nest_lock Menginisialisasi kunci.
omp_destroy_lock Membatalkan inisialisasi kunci.
omp_destroy_nest_lock Mengakhiri inisialisasi kunci bersarang.
omp_set_lock Memblokir eksekusi utas hingga kunci tersedia.
omp_set_nest_lock Memblokir eksekusi utas hingga kunci tersedia.
omp_unset_lock Melepaskan kunci.
omp_unset_nest_lock Melepaskan kunci bersarang.
omp_test_lock Mencoba mengunci tetapi tidak memblokir jalannya utas.
omp_test_nest_lock Mencoba mengatur kunci berlapis tetapi tidak memblokir eksekusi utas.
Jenis data Deskripsi
omp_lock_t Jenis yang menyimpan status kunci, apakah kunci tersedia dan jika suatu utas memiliki kunci.
omp_nest_lock_t Jenis yang menyimpan salah satu dari informasi berikut tentang kunci: apakah kunci tersedia atau tidak, identitas utas yang memiliki kunci, dan jumlah penumpukan.

Untuk pengaturan waktu:

Fungsi Deskripsi
omp_get_wtime Mengembalikan nilai dalam detik dari waktu yang telah berlalu sejak suatu titik tertentu.
omp_get_wtick Mengembalikan jumlah detik di antara tanda centang jam prosesor.

omp_destroy_lock (fungsi untuk menghancurkan kunci dalam OpenMP)

Membatalkan inisialisasi kunci.

void omp_destroy_lock(
   omp_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_lock_t yang diinisialisasi dengan omp_init_lock.

Keterangan

Untuk informasi lebih rinci, lihat 3.2.2 fungsi omp_destroy_lock dan omp_destroy_nest_lock.

Contoh

Lihat omp_init_lock untuk contoh penggunaan omp_destroy_lock.

omp_destroy_nest_lock

Mengakhiri inisialisasi kunci bersarang.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_nest_lock_t yang diinisialisasi dengan omp_init_nest_lock.

Keterangan

Untuk informasi selengkapnya, lihat 3.2.2 fungsi omp_destroy_lock dan omp_destroy_nest_lock.

Contoh

Lihat omp_init_nest_lock untuk contoh penggunaan omp_destroy_nest_lock.

omp_get_dynamic

Mengembalikan nilai yang menunjukkan apakah jumlah utas yang tersedia di wilayah paralel mendatang dapat disesuaikan dengan waktu proses.

int omp_get_dynamic();

Nilai kembalian

Nilai yang tidak nol berarti utas sistem akan disesuaikan secara dinamis.

Keterangan

Penyesuaian dinamis utas ditentukan dengan omp_set_dynamic dan OMP_DYNAMIC.

Untuk informasi selengkapnya, lihat fungsi 3.1.7 omp_set_dynamic.

Contoh

Lihat omp_set_dynamic untuk contoh penggunaan omp_get_dynamic.

omp_get_max_threads

Mengembalikan bilangan bulat yang sama dengan atau lebih besar dari jumlah utas yang akan tersedia jika wilayah paralel tanpa num_threads ditentukan pada saat itu dalam kode.

int omp_get_max_threads( )

Keterangan

Untuk informasi selengkapnya, lihat fungsi 3.1.3 omp_get_max_threads.

Contoh

// omp_get_max_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    omp_set_num_threads(8);
    printf_s("%d\n", omp_get_max_threads( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_max_threads( ));
        }

    printf_s("%d\n", omp_get_max_threads( ));

    #pragma omp parallel num_threads(3)
        #pragma omp master
        {
            printf_s("%d\n", omp_get_max_threads( ));
        }

    printf_s("%d\n", omp_get_max_threads( ));
}
8
8
8
8
8

omp_get_nested

Mengembalikan nilai yang menunjukkan apakah paralelisme berlapis diaktifkan.

int omp_get_nested( );

Nilai kembalian

Nilai bukan nol berarti paralelisme berlapis diaktifkan.

Keterangan

Paralelisme berlapis ditentukan dengan omp_set_nested dan OMP_NESTED.

Untuk informasi selengkapnya, lihat 3.1.10 fungsi omp_get_nested.

Contoh

Lihat omp_set_nested untuk contoh penggunaan omp_get_nested.

omp_get_num_procs

Mengembalikan jumlah prosesor yang tersedia saat fungsi dipanggil.

int omp_get_num_procs();

Keterangan

Untuk informasi selengkapnya, lihat fungsi omp_get_num_procs 3.1.5.

Contoh

// omp_get_num_procs.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    printf_s("%d\n", omp_get_num_procs( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_num_procs( ));
        }
}
// Expect the following output when the example is run on a two-processor machine:
2
2

omp_get_num_threads

Mengembalikan jumlah utas di wilayah paralel.

int omp_get_num_threads( );

Keterangan

Untuk informasi selengkapnya, lihat fungsi 3.1.2 omp_get_num_threads.

Contoh

// omp_get_num_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main()
{
    omp_set_num_threads(4);
    printf_s("%d\n", omp_get_num_threads( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_num_threads( ));
        }

    printf_s("%d\n", omp_get_num_threads( ));

    #pragma omp parallel num_threads(3)
        #pragma omp master
        {
            printf_s("%d\n", omp_get_num_threads( ));
        }

    printf_s("%d\n", omp_get_num_threads( ));
}
1
4
1
3
1

omp_get_thread_num

Mengembalikan nomor utas dari utas yang sedang dieksekusi dalam tim utasnya.

int omp_get_thread_num( );

Keterangan

Untuk informasi selengkapnya, lihat fungsi 3.1.4 omp_get_thread_num.

Contoh

Lihat paralel untuk contoh penggunaan omp_get_thread_num.

omp_get_wtick

Mengembalikan jumlah detik di antara tanda centang jam prosesor.

double omp_get_wtick( );

Keterangan

Untuk informasi selengkapnya, lihat 3.3.2 fungsi omp_get_wtick.

Contoh

Lihat omp_get_wtime untuk contoh penggunaan omp_get_wtick.

omp_get_wtime

Mengembalikan nilai dalam detik dari waktu yang telah berlalu sejak suatu titik tertentu.

double omp_get_wtime( );

Nilai kembalian

Mengembalikan nilai dalam detik dari waktu yang telah berlalu sejak suatu titik acuan yang arbitrer namun konsisten.

Keterangan

Titik itu akan tetap konsisten selama eksekusi program, memungkinkan perbandingan yang akan datang.

Untuk informasi selengkapnya, lihat fungsi omp_get_wtime 3.3.1.

Contoh

// omp_get_wtime.cpp
// compile with: /openmp
#include "omp.h"
#include <stdio.h>
#include <windows.h>

int main() {
    double start = omp_get_wtime( );
    Sleep(1000);
    double end = omp_get_wtime( );
    double wtick = omp_get_wtick( );

    printf_s("start = %.16g\nend = %.16g\ndiff = %.16g\n",
             start, end, end - start);

    printf_s("wtick = %.16g\n1/wtick = %.16g\n",
             wtick, 1.0 / wtick);
}
start = 594255.3671159324
end = 594256.3664474116
diff = 0.9993314791936427
wtick = 2.793651148400146e-007
1/wtick = 3579545

omp_in_parallel

Mengembalikan nonzero jika dipanggil dari dalam wilayah paralel.

int omp_in_parallel( );

Keterangan

Untuk informasi selengkapnya, lihat 3.1.6 fungsi omp_in_parallel.

Contoh

// omp_in_parallel.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    omp_set_num_threads(4);
    printf_s("%d\n", omp_in_parallel( ));

    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_in_parallel( ));
        }
}
0
1

omp_init_lock

Menginisialisasi kunci sederhana.

void omp_init_lock(
   omp_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_lock_t.

Keterangan

Untuk informasi selengkapnya, lihat bagian 3.2.1 fungsi omp_init_lock dan omp_init_nest_lock.

Contoh

// omp_init_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_lock_t my_lock;

int main() {
   omp_init_lock(&my_lock);

   #pragma omp parallel num_threads(4)
   {
      int tid = omp_get_thread_num( );
      int i, j;

      for (i = 0; i < 5; ++i) {
         omp_set_lock(&my_lock);
         printf_s("Thread %d - starting locked region\n", tid);
         printf_s("Thread %d - ending locked region\n", tid);
         omp_unset_lock(&my_lock);
      }
   }

   omp_destroy_lock(&my_lock);
}
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region

omp_init_nest_lock

Menginisialisasi kunci.

void omp_init_nest_lock(
   omp_nest_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_nest_lock_t.

Keterangan

Jumlah bersarang awal adalah nol.

Untuk informasi selengkapnya, lihat bagian 3.2.1 fungsi omp_init_lock dan omp_init_nest_lock.

Contoh

// omp_init_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_nest_lock_t my_lock;

void Test() {
   int tid = omp_get_thread_num( );
   omp_set_nest_lock(&my_lock);
   printf_s("Thread %d - starting nested locked region\n", tid);
   printf_s("Thread %d - ending nested locked region\n", tid);
   omp_unset_nest_lock(&my_lock);
}

int main() {
   omp_init_nest_lock(&my_lock);

   #pragma omp parallel num_threads(4)
   {
      int i, j;

      for (i = 0; i < 5; ++i) {
         omp_set_nest_lock(&my_lock);
            if (i % 3)
               Test();
            omp_unset_nest_lock(&my_lock);
        }
    }

    omp_destroy_nest_lock(&my_lock);
}
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region

omp_set_dynamic

Menunjukkan bahwa jumlah utas yang tersedia di wilayah paralel mendatang dapat disesuaikan dengan waktu proses.

void omp_set_dynamic(
   int val
);

Parameter

Val
Nilai yang menunjukkan apakah jumlah utas yang tersedia di wilayah paralel mendatang dapat diubah oleh runtime. Jika bukan nol, runtime dapat menyesuaikan jumlah utas, jika nol, runtime tidak akan menyesuaikan jumlah utas secara dinamis.

Keterangan

Jumlah utas tidak akan pernah melebihi nilai yang ditetapkan oleh omp_set_num_threads atau menurut OMP_NUM_THREADS.

Gunakan omp_get_dynamic untuk menampilkan pengaturan saat ini dari omp_set_dynamic.

Pengaturan untuk omp_set_dynamic akan mengambil alih pengaturan variabel lingkungan OMP_DYNAMIC .

Untuk informasi selengkapnya, lihat fungsi 3.1.7 omp_set_dynamic.

Contoh

// omp_set_dynamic.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main()
{
    omp_set_dynamic(9);
    omp_set_num_threads(4);
    printf_s("%d\n", omp_get_dynamic( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_dynamic( ));
        }
}
1
1

omp_set_lock

Memblokir eksekusi utas hingga kunci tersedia.

void omp_set_lock(
   omp_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_lock_t yang diinisialisasi dengan omp_init_lock.

Keterangan

Untuk informasi selengkapnya, lihat 3.2.3 fungsi omp_set_lock dan omp_set_nest_lock.

Contoh

Lihat omp_init_lock untuk contoh penggunaan omp_set_lock.

omp_set_nest_lock

Memblokir eksekusi utas hingga kunci tersedia.

void omp_set_nest_lock(
   omp_nest_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_nest_lock_t yang diinisialisasi dengan omp_init_nest_lock.

Keterangan

Untuk informasi selengkapnya, lihat 3.2.3 fungsi omp_set_lock dan omp_set_nest_lock.

Contoh

Lihat omp_init_nest_lock untuk contoh penggunaan omp_set_nest_lock.

omp_set_nested

Mengaktifkan paralelisme berlapis.

void omp_set_nested(
   int val
);

Parameter

Val
Nilai bukan nol memungkinkan paralelisme berlapis, sementara nol menonaktifkan paralelisme berlapis.

Keterangan

Paralelisme berlapis OMP dapat diaktifkan dengan omp_set_nested, atau dengan mengatur variabel lingkungan OMP_NESTED .

Pengaturan untuk omp_set_nested akan mengambil alih pengaturan OMP_NESTED variabel lingkungan.

Mengaktifkan variabel lingkungan dapat merusak program yang biasanya berfungsi, karena jumlah utas bertambah secara eksponensial ketika wilayah paralel disarangkan. Misalnya, fungsi yang berulang enam kali dengan jumlah utas OMP yang diatur ke 4 memerlukan 4.096 (4 hingga daya 6) utas. Kecuali dengan aplikasi yang terikat I/O, performa aplikasi umumnya turun jika ada lebih banyak utas daripada prosesor.

Gunakan omp_get_nested untuk menampilkan pengaturan saat ini dari omp_set_nested.

Untuk informasi selengkapnya, lihat fungsi 3.1.9 omp_set_nested.

Contoh

// omp_set_nested.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    omp_set_nested(1);
    omp_set_num_threads(4);
    printf_s("%d\n", omp_get_nested( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_nested( ));
        }
}
1
1

omp_set_num_threads

Menetapkan jumlah thread di wilayah paralel mendatang, kecuali ditimpa oleh klausa num_threads.

void omp_set_num_threads(
   int num_threads
);

Parameter

num_threads
Jumlah utas di wilayah paralel.

Keterangan

Untuk informasi selengkapnya, lihat fungsi 3.1.1 omp_set_num_threads.

Contoh

Lihat omp_get_num_threads untuk contoh penggunaan omp_set_num_threads.

omp_test_lock

Mencoba mengunci tetapi tidak memblokir jalannya utas.

int omp_test_lock(
   omp_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_lock_t yang diinisialisasi dengan omp_init_lock.

Keterangan

Untuk informasi selengkapnya, lihat 3.2.5 fungsi omp_test_lock dan omp_test_nest_lock.

Contoh

// omp_test_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_lock_t simple_lock;

int main() {
    omp_init_lock(&simple_lock);

    #pragma omp parallel num_threads(4)
    {
        int tid = omp_get_thread_num();

        while (!omp_test_lock(&simple_lock))
            printf_s("Thread %d - failed to acquire simple_lock\n",
                     tid);

        printf_s("Thread %d - acquired simple_lock\n", tid);

        printf_s("Thread %d - released simple_lock\n", tid);
        omp_unset_lock(&simple_lock);
    }

    omp_destroy_lock(&simple_lock);
}
Thread 1 - acquired simple_lock
Thread 1 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - acquired simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - acquired simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - released simple_lock
Thread 3 - failed to acquire simple_lock
Thread 3 - acquired simple_lock
Thread 3 - released simple_lock

omp_test_nest_lock

Mencoba mengatur kunci berlapis tetapi tidak memblokir eksekusi utas.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_nest_lock_t yang diinisialisasi dengan omp_init_nest_lock.

Keterangan

Untuk informasi selengkapnya, lihat 3.2.5 fungsi omp_test_lock dan omp_test_nest_lock.

Contoh

// omp_test_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_nest_lock_t nestable_lock;

int main() {
   omp_init_nest_lock(&nestable_lock);

   #pragma omp parallel num_threads(4)
   {
      int tid = omp_get_thread_num();
      while (!omp_test_nest_lock(&nestable_lock))
         printf_s("Thread %d - failed to acquire nestable_lock\n",
                tid);

      printf_s("Thread %d - acquired nestable_lock\n", tid);

      if (omp_test_nest_lock(&nestable_lock)) {
         printf_s("Thread %d - acquired nestable_lock again\n",
                tid);
         printf_s("Thread %d - released nestable_lock\n",
                tid);
         omp_unset_nest_lock(&nestable_lock);
      }

      printf_s("Thread %d - released nestable_lock\n", tid);
      omp_unset_nest_lock(&nestable_lock);
   }

   omp_destroy_nest_lock(&nestable_lock);
}
Thread 1 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock again
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - acquired nestable_lock
Thread 2 - acquired nestable_lock again
Thread 2 - released nestable_lock
Thread 2 - released nestable_lock

omp_unset_lock

Melepaskan kunci.

void omp_unset_lock(
   omp_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_lock_t yang diinisialisasi dengan omp_init_lock, dimiliki oleh utas dan dijalankan dalam fungsi.

Keterangan

Untuk informasi selengkapnya, lihat 3.2.4 fungsi omp_unset_lock dan omp_unset_nest_lock.

Contoh

Lihat omp_init_lock untuk contoh penggunaan omp_unset_lock.

omp_unset_nest_lock

Melepaskan kunci bersarang.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

Parameter

kunci
Variabel jenis omp_nest_lock_t yang diinisialisasi dengan omp_init_nest_lock, dimiliki oleh utas dan dijalankan dalam fungsi.

Keterangan

Untuk informasi selengkapnya, lihat 3.2.4 fungsi omp_unset_lock dan omp_unset_nest_lock.

Contoh

Lihat omp_init_nest_lock untuk contoh penggunaan omp_unset_nest_lock.