Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu bölümde OpenMP C ve C++ çalışma zamanı kitaplığı işlevleri açıklanmaktadır. omp.h<>, paralel yürütme ortamını denetlemek ve sorgulamak için kullanılabilecek çeşitli işlevler ve verilere erişimi eşitlemek için kullanılabilecek kilit işlevleri olmak üzere iki tür bildirir.
türü omp_lock_t , bir kilidin kullanılabilir olduğunu veya bir iş parçacığının bir kilidi olduğunu temsil edebilen bir nesne türüdür. Bu kilitler basit kilitler olarak adlandırılır.
Tür omp_nest_lock_t, bir kilidin müsait olduğunu veya kilidin sahibi olan iş parçacığının kimliğini ve iç içe geçme sayısını (aşağıda açıklanmıştır) temsil edebilen bir nesne türüdür. Bu kilitler iç içe kilitler olarak adlandırılır.
Kitaplık işlevleri, "C" bağlantısı olan dış işlevlerdir.
Bu bölümdeki açıklamalar aşağıdaki konulara ayrılmıştır:
3.1 Yürütme ortamı işlevleri
Bu bölümde açıklanan işlevler iş parçacıklarını, işlemcileri ve paralel ortamı etkiler ve izler:
- omp_set_num_threads
- omp_get_num_threads fonksiyonu, kullanılan iş parçacığı sayısını alır.
- omp_get_max_threads - (Maksimum iş parçacıklarını elde etme fonksiyonu)
- omp_get_thread_num
- omp_get_num_procs
- omp_in_parallel
- omp_set_dynamic
- omp_get_dynamic
- omp_set_nested
- omp_get_nested
3.1.1 omp_set_num_threads işlevi
omp_set_num_threads işlevi, num_threads yan tümcesi belirtilmemiş sonraki paralel bölgeler için varsayılan iş parçacığı sayısını ayarlar. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
void omp_set_num_threads(int num_threads);
parametre num_threads değeri pozitif bir tamsayı olmalıdır. Bunun etkisi, iş parçacığı sayısının dinamik olarak ayarlanmasının etkinleştirilip etkinleştirilmediğine bağlıdır. İşlev omp_set_num_threads ve iş parçacıklarının dinamik ayarlaması arasındaki etkileşim hakkında kapsamlı bir kural kümesi için bkz bölüm 2.3.
Bu işlev, programın bir bölümünden, işlevin sıfır döndürdüğü bir durumda çağrıldığında yukarıda açıklanan etkilere sahiptir. İşlevin sıfır olmayan bir değer döndürdüğü programın bir bölümünden omp_in_parallel çağrılırsa, bu işlevin davranışı tanımlanmamış olur.
Bu çağrının ortam değişkenine OMP_NUM_THREADS göre önceliği vardır. Çağrılarak omp_set_num_threads veya ortam değişkeni OMP_NUM_THREADS ayarlanarak oluşturulabilen iş parçacığı sayısının varsayılan değeri, num_threads yan tümcesi belirtilerek tek bir parallel yönergede açıkça geçersiz kılınabilir.
Daha fazla bilgi için bkz . omp_set_dynamic.
Çapraz referanslar
- omp_set_dynamic işlevi
- omp_get_dynamic işlevi
- OMP_NUM_THREADS ortam değişkeni
- num_threads yan tümcesi
3.1.2 omp_get_num_threads işlevi
Bu işlev, çağrıldığı paralel bölgeyi yürüten ekipte şu anda bulunan iş parçacığı sayısını döndürür. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
int omp_get_num_threads(void);
num_threads yan tümcesi, omp_set_num_threads işlevi ve OMP_NUM_THREADS ortam değişkeni bir ekipteki iş parçacığı sayısını denetler.
İş parçacığı sayısı kullanıcı tarafından açıkça ayarlanmamışsa, varsayılan değer uygulama tarafından tanımlanır. Bu işlev en yakın kapsayan parallel yönergeye bağlanır. Programın seri bir bölümünden veya serileştirilmiş iç içe paralel bölgeden çağrılırsa, bu işlev 1 döndürür.
Daha fazla bilgi için bkz . omp_set_dynamic.
Çapraz referanslar
3.1.3 omp_get_max_threads işlevi
Kodun bu noktasında num_threads yan tümcesi olmadan bir paralel bölge bulunması durumunda ekip oluşturmak için kullanılacak iş parçacığı sayısından en az o kadar büyük bir tamsayı döndüren omp_get_max_threads işlevi. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
int omp_get_max_threads(void);
Aşağıdaki ifade, omp_get_max_threads üzerinde olan c0 değerinin alt sınırını ifade eder.
Sonraki ekip için iş parçacıkları kullanıldı<=
omp_get_max_threads
Başka bir paralel bölge, belirli sayıda iş parçacığı istemek için num_threads ifadesini kullanırsa, omp_get_max_threads işleminin sonucunun alt sınırı için verilen garanti artık geçerli olmayacaktır.
İşlevin omp_get_max_threads dönüş değeri, bir sonraki paralel bölgede oluşturulan ekipteki tüm iş parçacıkları için dinamik olarak yeterli depolama alanı ayırmak için kullanılabilir.
Çapraz referanslar
- omp_get_num_threads fonksiyonu, kullanılan iş parçacığı sayısını alır.
- omp_set_num_threads
- omp_set_dynamic
- num_threads
3.1.4 omp_get_thread_num işlevi
İşlev omp_get_thread_num takımı içindeki, işlevi çalıştıran iş parçacığının iş parçacığı numarasını döndürür. İş parçacığı numarası 0 ile omp_get_num_threads()-1 (dahil) arasında yer alır. Ekibin ana iş parçacığı, 0 numaralı iş parçacığıdır.
Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
int omp_get_thread_num(void);
Seri bölgeden omp_get_thread_num çağrılırsa 0 döndürür. Serileştirilmiş iç içe paralel bölge içinden çağrılırsa, bu işlev 0 döndürür.
Çapraz referanslar
- omp_get_num_threads işlevi
3.1.5 omp_get_num_procs işlevi
İşlev, omp_get_num_procs işlev çağrıldığında program tarafından kullanılabilen işlemci sayısını döndürür. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
int omp_get_num_procs(void);
3.1.6 omp_in_parallel fonksiyonu
İşlev, omp_in_parallel paralel yürütülen paralel bir bölgenin dinamik kapsamı içinde çağrılırsa sıfır olmayan bir değer döndürür; aksi takdirde 0 döndürür. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
int omp_in_parallel(void);
Bu işlev, seri hale getirilmiş iç içe bölgeler de dahil olmak üzere paralel olarak yürütülen bir bölgenin içinden çağrıldığında sıfır olmayan bir değer döndürür.
3.1.7 omp_set_dynamic işlevi
işlevi, omp_set_dynamic paralel bölgelerin yürütülmesi için kullanılabilen iş parçacığı sayısının dinamik olarak ayarlanmasını etkinleştirir veya devre dışı bırakır. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
void omp_set_dynamic(int dynamic_threads);
dynamic_threads sıfır olmayan bir değere değerlendirilirse, yaklaşan paralel bölgeleri yürütmek için kullanılan iş parçacığı sayısı, sistem kaynaklarını en iyi şekilde kullanmak için çalışma zamanı ortamı tarafından otomatik olarak ayarlanabilir. Kullanıcı tarafından belirtilen iş parçacığı sayısı, maksimum iş parçacığı sayısıdır. Bir paralel bölgeyi yürüten takımın iş parçacığı sayısı, o paralel bölge süresince sabit kalır ve omp_get_num_threads fonksiyonu tarafından raporlanır.
dynamic_threads 0 olarak değerlendirilirse dinamik ayarlama devre dışı bırakılır.
Bu işlev, programın bir bölümünde omp_in_parallel işlevinin sıfır döndürdüğü durumlarda yukarıda açıklanan etkilere sahiptir. İşlevin sıfır olmayan bir değer döndürdüğü programın bir bölümünden omp_in_parallel çağrılırsa, bu işlevin davranışı tanımlanmamış olur.
çağrısının omp_set_dynamic ortam değişkenine OMP_DYNAMIC göre önceliği vardır.
İş parçacıklarının dinamik ayarı için varsayılan ayar uygulama tanımlıdır. Sonuç olarak, doğru yürütme için belirli sayıda iş parçacığına bağımlı olan kullanıcı kodları dinamik iş parçacıklarını açıkça devre dışı bırakmalıdır. Uygulama, iş parçacığı sayısını dinamik olarak ayarlama olanağı sağlamak için gerekli değildir, ancak tüm platformlarda taşınabilirliği desteklemek için arabirim sağlamak için gereklidir.
Microsoft'a özgü
omp_get_dynamic ve omp_set_dynamic öğelerinin mevcut desteği aşağıdaki gibidir:
için omp_set_dynamic giriş parametresi iş parçacığı ilkesini etkilemez ve iş parçacığı sayısını değiştirmez.
omp_get_num_threads ayarlanmışsa her zaman kullanıcı tanımlı sayıyı veya varsayılan iş parçacığı numarasını döndürür. Geçerli Microsoft uygulamasında, omp_set_dynamic(0) mevcut iş parçacıkları kümesinin aşağıdaki paralel bölge için yeniden kullanılabilmesi için dinamik iş parçacığı oluşturma özelliğini kapatır.
omp_set_dynamic(1) mevcut iş parçacıkları kümesini atarak ve yaklaşan paralel bölge için yeni bir küme oluşturarak dinamik iş parçacığı oluşturmayı açar. Yeni kümedeki iş parçacıklarının sayısı, eski kümeyle aynıdır ve omp_get_num_threads'nin dönüş değerine dayanır. Bu nedenle, en iyi performans için mevcut iş parçacıklarını yeniden kullanmak amacıyla omp_set_dynamic(0) kullanın.
Çapraz referanslar
- omp_get_num_threads fonksiyonu, kullanılan iş parçacığı sayısını alır.
- OMP_DYNAMIC
- omp_in_parallel
3.1.8 omp_get_dynamic işlevi
İş parçacıklarının omp_get_dynamic dinamik ayarı etkinleştirilirse işlev sıfır olmayan bir değer döndürür ve aksi takdirde 0 döndürür. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
int omp_get_dynamic(void);
Uygulama iş parçacığı sayısı için dinamik ayarlama uygulamazsa, bu işlev her zaman 0 döndürür. Daha fazla bilgi için bkz . omp_set_dynamic.
Çapraz referanslar
- Dinamik iş parçacığı ayarlamasının açıklaması için bkz. omp_set_dynamic.
3.1.9 omp_set_nested işlevi
omp_set_nested işlevi, iç içe paralelliği etkinleştirir veya devre dışı bırakır. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
void omp_set_nested(int nested);
İç içe değerlendirme 0'a eşitse, iç içe paralellik devre dışı bırakılır; bu varsayılan ayardır ve iç içe paralel bölgeler mevcut iş parçacığı tarafından serileştirilir ve yürütülür. Aksi takdirde, iç içe paralellik etkinleştirilir ve iç içe yerleştirilmiş paralel bölgeler iç içe ekipler oluşturmak için ek iş parçacıkları dağıtabilir.
Bu işlev, programın bir bölümünden, işlevin sıfır döndürdüğü bir durumda çağrıldığında yukarıda açıklanan etkilere sahiptir. İşlevin sıfır olmayan bir değer döndürdüğü programın bir bölümünden omp_in_parallel çağrılırsa, bu işlevin davranışı tanımlanmamış olur.
Bu çağrının ortam değişkenine OMP_NESTED göre önceliği vardır.
İç içe paralellik etkinleştirildiğinde, iç içe paralel bölgeleri yürütmek için kullanılan iş parçacığı sayısı uygulama tanımlıdır. Sonuç olarak, iç içe paralellik etkinleştirildiğinde bile OpenMP uyumlu uygulamaların iç içe paralel bölgeleri seri hale getirmesine izin verilir.
Çapraz referanslar
3.1.10 omp_get_nested işlevi
omp_get_nested işlevi, iç içe paralellik etkinse sıfır olmayan bir değer, devre dışıysa 0 döndürür. İç içe paralellik hakkında daha fazla bilgi için bkz . omp_set_nested. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
int omp_get_nested(void);
Bir uygulama iç içe paralellik uygulamazsa, bu işlev her zaman 0 döndürür.
3.2 Kilit işlevleri
Bu bölümde açıklanan işlevler, eşitleme için kullanılan kilitleri işler.
Aşağıdaki işlevler için kilit değişkeninin türü omp_lock_tolmalıdır. Bu değişkene yalnızca bu işlevler aracılığıyla erişilmelidir. Tüm kilit işlevleri, işaretçi türü omp_lock_t olan bir bağımsız değişken gerektirir.
- omp_init_lock işlevi basit bir kilit başlatır.
- omp_destroy_lock işlevi basit bir kilidi kaldırır.
- omp_set_lock işlevi basit bir kilit kullanılabilir olana kadar bekler.
- omp_unset_lock işlevi basit bir kilit bırakır.
- omp_test_lock işlevi basit bir kilidi test ediyor.
Aşağıdaki işlevler için kilit değişkeninin türü omp_nest_lock_tolmalıdır. Bu değişkene yalnızca bu işlevler aracılığıyla erişilmelidir. Tüm iç içe yerleştirilebilir kilit işlevleri, omp_nest_lock_t türüne işaretçi olan bir bağımsız değişken gerektirir.
- omp_init_nest_lock işlevi yuvalanabilir bir kilit başlatır.
- omp_destroy_nest_lock işlevi yuva yapısı oluşturulabilir bir kilidi kaldırır.
- omp_set_nest_lock işlevi iç içe yerleştirilmiş bir kilit kullanılabilir olana kadar bekler.
- omp_unset_nest_lock işlevi iç içe geçirilebilir bir kilidi serbest bırakır.
- omp_test_nest_lock işlevi iç içe bir kilidi test ediyor.
OpenMP lock işlevleri kilit değişkenine her zaman kilit değişkeninin en güncel değerini okuyacak ve güncelleştirebilecekleri şekilde erişer. Bu nedenle, bir OpenMP programının kilit değişkeninin değerinin farklı iş parçacıkları arasında tutarlı olduğundan emin olmak için açık flush yönergeleri içermesi gerekmez. (Diğer değişkenlerin değerlerini tutarlı hale getirmek için flush yönergeler gerekebilir.)
3.2.1 omp_init_lock ve omp_init_nest_lock işlevleri
Bu işlevler bir kilidi başlatmanın tek araçlarını sağlar. Her bir işlev, gelecek çağrılarda kullanılmak üzere kilit parametresiyle ilişkili kilidi başlatır. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
void omp_init_lock(omp_lock_t *lock);
void omp_init_nest_lock(omp_nest_lock_t *lock);
Başlangıç durumu kilidi açık (yani hiçbir iş parçacığı kilide sahip değildir). Yuvalanabilir bir kilit için başlangıç yuvalanma sayısı sıfırdır. Bu yordamlardan herhangi birini zaten başlatılmış bir kilit değişkeniyle çağırmak uyumsuz bir işlemdir.
3.2.2 omp_destroy_lock ve omp_destroy_nest_lock işlevleri
Bu işlevler, kilit değişkeninin başlatılmadığından emin olur. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
void omp_destroy_lock(omp_lock_t *lock);
void omp_destroy_nest_lock(omp_nest_lock_t *lock);
Bu yordamlardan herhangi birini başlatılmamış veya kilidi açılmış bir kilit değişkeniyle çağırmak uyumsuz bir işlemdir.
3.2.3 omp_set_lock ve omp_set_nest_lock işlevleri
Bu işlevlerin her biri, belirtilen kilit kullanılabilir duruma gelene kadar işlevi yürüten iş parçacığını engeller ve ardından kilidi ayarlar. Kilidi açıksa basit bir kilit kullanılabilir. kilidi açıksa veya zaten işlevi yürüten iş parçacığına aitse iç içe geçirilebilir bir kilit kullanılabilir. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
void omp_set_lock(omp_lock_t *lock);
void omp_set_nest_lock(omp_nest_lock_t *lock);
Basit bir kilit için omp_set_lock işlevinin bağımsız değişkeni, başlatılmış bir kilit değişkenine işaret etmelidir. Kilidin sahipliği, işlevi yürüten iş parçacığına verilir.
İç içe geçirilebilir bir kilit için, işlevin omp_set_nest_lock bağımsız değişkeninin başlatılan bir kilit değişkenine işaret etmesi gerekir. İç içe yerleştirme sayısı artırılır ve iş parçacığı kilidin sahipliğini alır ya da korur.
3.2.4 omp_unset_lock ve omp_unset_nest_lock işlevleri
Bu işlevler, bir kilidin sahipliğini serbest bırakmanın araçlarını sağlar. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
void omp_unset_lock(omp_lock_t *lock);
void omp_unset_nest_lock(omp_nest_lock_t *lock);
Bu işlevlerin her birinin bağımsız değişkeni, iş parçacığının yürüttüğü işlevin sahip olduğu, başlatılmış bir kilit değişkenine işaret etmelidir. İş parçacığı bu kilidin sahibi değilse, davranış belirsizdir.
Basit bir kilit için omp_unset_lock işlev, kilidin sahipliğinden işlevi yürüten iş parçacığını serbest bırakır.
İçe aktarılabilir bir kilit için omp_unset_nest_lock işlevi yuvalama sayısını azaltır ve sonuçta elde edilen sayı sıfır olduğunda işlevi çalıştıran iş parçacığını kilidin sahipliğinden çıkarır.
3.2.5 omp_test_lock ve omp_test_nest_lock işlevleri
Bu işlevler bir kilit ayarlamaya çalışır, ancak iş parçacığının yürütülmesini durdurmaz. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
int omp_test_lock(omp_lock_t *lock);
int omp_test_nest_lock(omp_nest_lock_t *lock);
Bağımsız değişken, başlatılmış bir kilit değişkenine işaret etmelidir. Bu işlevler, omp_set_lock ve omp_set_nest_lock ile aynı şekilde bir kilit ayarlamaya çalışır, ancak iş parçacığının yürütülmesini engellemezler.
Basit bir kilit için, omp_test_lock kilit başarıyla ayarlanırsa işlev sıfır olmayan bir değer döndürür; aksi takdirde sıfır döndürür.
Yuvalanabilir bir kilit için, omp_test_nest_lock kilit başarıyla ayarlanmışsa işlev yeni yuvalama sayısını döndürür; aksi takdirde sıfır döndürür.
3.3 Zamanlama yordamları
Bu bölümde açıklanan işlevler taşınabilir bir duvar saati zamanlayıcısını destekler:
- omp_get_wtime işlevi, geçen duvar saati saatini döndürür.
- omp_get_wtick işlevi, ardışık saat değerleri arasındaki saniyeleri döndürür.
3.3.1 omp_get_wtime işlevi
İşlev, omp_get_wtime, geçmişteki bir an'dan itibaren geçen duvar saati süresi ile eşit saniye cinsinden çift duyarlıklı kayan nokta değeri döndürür. Gerçek "geçmişteki süre" rastgeledir, ancak uygulama programının yürütülmesi sırasında değişmemesi garanti edilir. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
double omp_get_wtime(void);
İşlevin, aşağıdaki örnekte gösterildiği gibi geçen süreleri ölçmek için kullanılacağı tahmin edilir:
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);
Döndürülen süreler "iş parçacığı başına süreler"dir ve bu da bir uygulamaya katılan tüm iş parçacıklarında genel olarak tutarlı olmaları gerekmez anlamına gelir.
3.3.2 omp_get_wtick işlevi
İşlev, omp_get_wtick ardışık saat işaretleri arasındaki saniye sayısına eşit bir çift duyarlıklı kayan nokta değeri döndürür. Bunun biçimi aşağıdaki gibidir:
#include <omp.h>
double omp_get_wtick(void);