Aracılığıyla paylaş


OpenMP İşlevleri

OpenMP API'sinde kullanılan işlevlerin bağlantılarını sağlar.

OpenMP standardının Visual C++ uygulaması aşağıdaki işlevleri ve veri türlerini içerir.

Ortam yürütme için:

İşlev Tanım
omp_set_num_threads bir num_threads yan tümcesi tarafından geçersiz kılınmadığı sürece, yaklaşan paralel bölgelerdeki iş parçacığı sayısını ayarlar.
omp_get_num_threads Paralel bölgedeki iş parçacığı sayısını döndürür.
omp_get_max_threads Kodda num_threads olmayan paralel bir bölge tanımlandıysa kullanılabilir iş parçacığı sayısına eşit veya ondan büyük bir tamsayı döndürür.
omp_get_thread_num İş parçacığı ekibinde yürütülen iş parçacığının iş parçacığı numarasını döndürür.
omp_get_num_procs İşlev çağrıldığında kullanılabilen işlemci sayısını döndürür.
omp_in_parallel Paralel bir bölgeden çağrılırsa sıfır olmayan döndürür.
omp_set_dynamic Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanına göre ayarlanabileceğini gösterir.
omp_get_dynamic Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanına göre ayarlanabileceğini gösteren bir değer döndürür.
omp_set_nested İç içe paralelliği etkinleştirir.
omp_get_nested İç içe paralelliğin etkinleştirilip etkinleştirilmediğini gösteren bir değer döndürür.

Kilit için:

İşlev Tanım
omp_init_lock Basit bir kilit başlatır.
omp_init_nest_lock Bir kilit başlatır.
omp_destroy_lock Kilidin başlatılmamış halini alır.
omp_destroy_nest_lock İç içe bir kilidi başlatmaz.
omp_set_lock Bir kilit kullanılabilir olana kadar iş parçacığı yürütmeyi engeller.
omp_set_nest_lock Bir kilit kullanılabilir olana kadar iş parçacığı yürütmeyi engeller.
omp_unset_lock Kilidi serbest bırakır.
omp_unset_nest_lock İç içe bir kilit bırakır.
omp_test_lock Kilit ayarlamaya çalışır, ancak iş parçacığı yürütmeyi engellemez.
omp_test_nest_lock İç içe bir kilit ayarlamaya çalışır, ancak iş parçacığı yürütmeyi engellemez.
Veri türü Tanım
omp_lock_t Kilidin durumunu, kilidin kullanılabilir olup olmadığını veya bir iş parçacığının kilidi olup olmadığını tutan bir tür.
omp_nest_lock_t Bir kilit hakkında aşağıdaki bilgi parçalarından birini tutan bir tür: kilidin kullanılabilir olup olmadığı ve kilidin sahibi olan iş parçacığının kimliği ve iç içe yerleştirme sayısı.

Zamanlama yordamları için:

İşlev Tanım
omp_get_wtime Bir noktadan geçen sürenin saniye cinsinden değerini döndürür.
omp_get_wtick İşlemci saati değer değerleri arasındaki saniye sayısını döndürür.

omp_destroy_lock

Kilidin başlatılmamış halini alır.

void omp_destroy_lock(
   omp_lock_t *lock
);

Parametreler

lock
omp_init_lock ile başlatılan türde omp_lock_t bir değişken.

Açıklamalar

Daha fazla bilgi için bkz . 3.2.2 omp_destroy_lock ve omp_destroy_nest_lock işlevleri.

Örnek

kullanma omp_destroy_lockörneği için bkz. omp_init_lock.

omp_destroy_nest_lock

İç içe bir kilidi başlatmaz.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

Parametreler

lock
omp_init_nest_lock ile başlatılan türde omp_nest_lock_t bir değişken.

Açıklamalar

Daha fazla bilgi için bkz . 3.2.2 omp_destroy_lock ve omp_destroy_nest_lock işlevleri.

Örnek

kullanma omp_destroy_nest_lockörneği için bkz. omp_init_nest_lock.

omp_get_dynamic

Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanına göre ayarlanabileceğini gösteren bir değer döndürür.

int omp_get_dynamic();

Dönüş değeri

Sıfır olmayan bir değer, iş parçacıklarının dinamik olarak ayarlanacağı anlamına gelir.

Açıklamalar

İş parçacıklarının dinamik ayarı omp_set_dynamic ve OMP_DYNAMIC ile belirtilir.

Daha fazla bilgi için bkz . 3.1.7 omp_set_dynamic işlevi.

Örnek

kullanma omp_get_dynamicörneği için bkz. omp_set_dynamic.

omp_get_max_threads

Kodda num_threads olmayan paralel bir bölge tanımlandıysa kullanılabilir iş parçacığı sayısına eşit veya ondan büyük bir tamsayı döndürür.

int omp_get_max_threads( )

Açıklamalar

Daha fazla bilgi için bkz . 3.1.3 omp_get_max_threads işlevi.

Örnek

// 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

İç içe paralelliğin etkinleştirilip etkinleştirilmediğini gösteren bir değer döndürür.

int omp_get_nested( );

Dönüş değeri

Sıfır olmayan bir değer, iç içe paralelliğin etkinleştirildiği anlamına gelir.

Açıklamalar

İç içe paralellik omp_set_nested ve OMP_NESTED ile belirtilir.

Daha fazla bilgi için bkz . 3.1.10 omp_get_nested işlevi.

Örnek

kullanma omp_get_nestedörneği için bkz. omp_set_nested.

omp_get_num_procs

İşlev çağrıldığında kullanılabilen işlemci sayısını döndürür.

int omp_get_num_procs();

Açıklamalar

Daha fazla bilgi için bkz . 3.1.5 omp_get_num_procs işlevi.

Örnek

// 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

Paralel bölgedeki iş parçacığı sayısını döndürür.

int omp_get_num_threads( );

Açıklamalar

Daha fazla bilgi için bkz . 3.1.2 omp_get_num_threads işlevi.

Örnek

// 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

İş parçacığı ekibinde yürütülen iş parçacığının iş parçacığı numarasını döndürür.

int omp_get_thread_num( );

Açıklamalar

Daha fazla bilgi için bkz . 3.1.4 omp_get_thread_num işlevi.

Örnek

kullanma omp_get_thread_numörneği için bkz. paralel.

omp_get_wtick

İşlemci saati değer değerleri arasındaki saniye sayısını döndürür.

double omp_get_wtick( );

Açıklamalar

Daha fazla bilgi için bkz . 3.3.2 omp_get_wtick işlevi.

Örnek

kullanma omp_get_wtickörneği için bkz. omp_get_wtime.

omp_get_wtime

Bir noktadan geçen sürenin saniye cinsinden değerini döndürür.

double omp_get_wtime( );

Dönüş değeri

Rastgele ancak tutarlı bir noktadan geçen sürenin saniye cinsinden bir değer döndürür.

Açıklamalar

Bu nokta, program yürütme sırasında tutarlı olarak kalır ve yaklaşan karşılaştırmaları mümkün hale getirir.

Daha fazla bilgi için bkz . 3.3.1 omp_get_wtime işlevi.

Örnek

// 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

Paralel bir bölgeden çağrılırsa sıfır olmayan döndürür.

int omp_in_parallel( );

Açıklamalar

Daha fazla bilgi için bkz . 3.1.6 omp_in_parallel işlevi.

Örnek

// 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

Basit bir kilit başlatır.

void omp_init_lock(
   omp_lock_t *lock
);

Parametreler

lock
türünde omp_lock_tbir değişken.

Açıklamalar

Daha fazla bilgi için bkz . 3.2.1 omp_init_lock ve omp_init_nest_lock işlevleri.

Örnek

// 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

Bir kilit başlatır.

void omp_init_nest_lock(
   omp_nest_lock_t *lock
);

Parametreler

lock
türünde omp_nest_lock_tbir değişken.

Açıklamalar

İlk iç içe yerleştirme sayısı sıfırdır.

Daha fazla bilgi için bkz . 3.2.1 omp_init_lock ve omp_init_nest_lock işlevleri.

Örnek

// 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

Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanına göre ayarlanabileceğini gösterir.

void omp_set_dynamic(
   int val
);

Parametreler

Val
Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanı tarafından ayarlanabileceğini gösteren bir değer. Sıfır değilse, çalışma zamanı iş parçacığı sayısını ayarlayabilir, sıfırsa çalışma zamanı iş parçacığı sayısını dinamik olarak ayarlamaz.

Açıklamalar

İş parçacığı sayısı, omp_set_num_threads veya OMP_NUM_THREADS tarafından ayarlanan değeri asla aşmaz.

geçerli ayarını omp_set_dynamicgörüntülemek için omp_get_dynamic kullanın.

ayarıomp_set_dynamic, OMP_DYNAMIC ortam değişkeninin ayarını geçersiz kılar.

Daha fazla bilgi için bkz . 3.1.7 omp_set_dynamic işlevi.

Örnek

// 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

Bir kilit kullanılabilir olana kadar iş parçacığı yürütmeyi engeller.

void omp_set_lock(
   omp_lock_t *lock
);

Parametreler

lock
omp_init_lock ile başlatılan türde omp_lock_t bir değişken.

Açıklamalar

Daha fazla bilgi için bkz . 3.2.3 omp_set_lock ve omp_set_nest_lock işlevleri.

Örnekler

kullanma omp_set_lockörneği için bkz. omp_init_lock.

omp_set_nest_lock

Bir kilit kullanılabilir olana kadar iş parçacığı yürütmeyi engeller.

void omp_set_nest_lock(
   omp_nest_lock_t *lock
);

Parametreler

lock
omp_init_nest_lock ile başlatılan türde omp_nest_lock_t bir değişken.

Açıklamalar

Daha fazla bilgi için bkz . 3.2.3 omp_set_lock ve omp_set_nest_lock işlevleri.

Örnekler

kullanma omp_set_nest_lockörneği için bkz. omp_init_nest_lock.

omp_set_nested

İç içe paralelliği etkinleştirir.

void omp_set_nested(
   int val
);

Parametreler

Val
Sıfır olmayan bir değer iç içe paralelliği etkinleştirirken sıfır iç içe paralelliği devre dışı bırakır.

Açıklamalar

İç içe OMP paralelliği ile omp_set_nestedveya OMP_NESTED ortam değişkeni ayarlanarak açılabilir.

ayarı omp_set_nested ortam değişkeninin OMP_NESTED ayarını geçersiz kılar.

Ortam değişkeninin etkinleştirilmesi, paralel bölgeleri iç içe geçirirken iş parçacıklarının sayısı katlanarak artacağından, başka bir işlem programını bozabilir. Örneğin, OMP iş parçacığı sayısının 4 olarak ayarlandığı altı kez yinelenen bir işlev için 4.096 (6'nın gücüne 4) iş parçacığı gerekir. G/Ç'ye bağlı uygulamalar dışında, işlemcilerden daha fazla iş parçacığı varsa uygulamanın performansı genellikle düşer.

geçerli ayarını omp_set_nestedgörüntülemek için omp_get_nested kullanın.

Daha fazla bilgi için bkz . 3.1.9 omp_set_nested işlevi.

Örnek

// 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

bir num_threads yan tümcesi tarafından geçersiz kılınmadığı sürece, yaklaşan paralel bölgelerdeki iş parçacığı sayısını ayarlar.

void omp_set_num_threads(
   int num_threads
);

Parametreler

num_threads
Paralel bölgedeki iş parçacığı sayısı.

Açıklamalar

Daha fazla bilgi için bkz . 3.1.1 omp_set_num_threads işlevi.

Örnek

kullanma omp_set_num_threadsörneği için bkz. omp_get_num_threads.

omp_test_lock

Kilit ayarlamaya çalışır, ancak iş parçacığı yürütmeyi engellemez.

int omp_test_lock(
   omp_lock_t *lock
);

Parametreler

lock
omp_init_lock ile başlatılan türde omp_lock_t bir değişken.

Açıklamalar

Daha fazla bilgi için bkz . 3.2.5 omp_test_lock ve omp_test_nest_lock işlevleri.

Örnek

// 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

İç içe bir kilit ayarlamaya çalışır, ancak iş parçacığı yürütmeyi engellemez.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

Parametreler

lock
omp_init_nest_lock ile başlatılan türde omp_nest_lock_t bir değişken.

Açıklamalar

Daha fazla bilgi için bkz . 3.2.5 omp_test_lock ve omp_test_nest_lock işlevleri.

Örnek

// 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

Kilidi serbest bırakır.

void omp_unset_lock(
   omp_lock_t *lock
);

Parametreler

lock
İş parçacığının sahip olduğu ve işlevinde yürütülen omp_init_lock ile başlatılan türde omp_lock_t bir değişken.

Açıklamalar

Daha fazla bilgi için bkz . 3.2.4 omp_unset_lock ve omp_unset_nest_lock işlevleri.

Örnek

kullanma omp_unset_lockörneği için bkz. omp_init_lock.

omp_unset_nest_lock

İç içe bir kilit bırakır.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

Parametreler

lock
İş parçacığının sahip olduğu ve işlevinde yürütülen omp_init_nest_lock ile başlatılan türde omp_nest_lock_t bir değişken.

Açıklamalar

Daha fazla bilgi için bkz . 3.2.4 omp_unset_lock ve omp_unset_nest_lock işlevleri.

Örnek

kullanma omp_unset_nest_lockörneği için bkz. omp_init_nest_lock.