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.
Yönergeler, C ve C++ standartlarında tanımlanan yönergeleri temel alır #pragma . OpenMP C ve C++ API'sini destekleyen derleyiciler, tüm OpenMP derleyici yönergelerini etkinleştiren ve yorumlamaya izin veren bir komut satırı seçeneği içerir.
2.1 Yönerge biçimi
OpenMP yönergesinin söz dizimi, C ekindeki dil bilgisi tarafından resmi olarak ve resmi olarak aşağıdaki gibi belirtilir:
#pragma omp directive-name [clause[ [,] clause]...] new-line
Her yönerge, aynı adlara sahip diğer (OpenMP olmayan veya OpenMP'ye satıcı uzantıları) pragma yönergeleriyle çakışma olasılığını azaltmak için ile #pragma ompbaşlar. Yönergenin geri kalanı, derleyici yönergeleri için C ve C++ standartlarının kurallarını izler. Özellikle, boşluk önce ve sonra #kullanılabilir ve bazen boşluk bir yönergedeki sözcükleri ayırmak için kullanılmalıdır. öğesini izleyen #pragma omp belirteçlerin ön işlemesi makro değişimine tabidir.
Yönergeler büyük/küçük harfe duyarlıdır. Yan tümcelerin yönergelerde görünme sırası önemli değildir. Yönergelerdeki yan tümceler, her yan tümcenin açıklamasında listelenen kısıtlamalara bağlı olarak gerektiğinde tekrarlanabilir. Değişken listesi yan tümcesinde görünüyorsa, yalnızca değişkenleri belirtmelidir. Yönerge başına yalnızca bir yönerge-adı belirtilebilir. Örneğin, aşağıdaki yönergeye izin verilmez:
/* ERROR - multiple directive names not allowed */
#pragma omp parallel barrier
OpenMP yönergesi, yapılandırılmış bir blok olması gereken en fazla bir başarılı deyim için geçerlidir.
2.2 Koşullu derleme
Makro _OPENMP adı, OpenMP uyumlu uygulamalar tarafından onaylanan belirtimin yılı ve ayı olacak ondalık sabiti yymm olarak tanımlanır. Bu makro bir #define veya #undef ön işleme yönergesinin konusu olmamalıdır.
#ifdef _OPENMP
iam = omp_get_thread_num() + index;
#endif
Satıcılar OpenMP uzantılarını tanımlarsa, önceden tanımlanmış ek makrolar belirtebilirler.
2.3 paralel yapı
Aşağıdaki yönerge, paralel olarak birçok iş parçacığı tarafından yürütülecek programın bir bölgesi olan paralel bölgeyi tanımlar. Bu yönerge, paralel yürütmeyi başlatan temel yapıdır.
#pragma omp parallel [clause[ [, ]clause] ...] new-line structured-block
yan tümcesi aşağıdakilerden biridir:
-
if(skaler ifade) -
private(değişken listesi) -
firstprivate(değişken listesi) default(shared | none)-
shared(değişken listesi) -
copyin(değişken listesi) -
reduction(operatör:değişken listesi) -
num_threads(integer-expression)
Bir iş parçacığı paralel bir yapıya ulaştığında, aşağıdaki durumlardan biri doğruysa bir iş parçacığı ekibi oluşturulur:
- Yan
iftümcesi yok. - İfade
ifsıfır olmayan bir değer olarak değerlendirilir.
Bu iş parçacığı, iş parçacığı sayısı 0 olan ekibin ana iş parçacığı olur ve ana iş parçacığı da dahil olmak üzere ekipteki tüm iş parçacıkları bölgeyi paralel olarak yürütür. İfadenin if değeri sıfırsa bölge serileştirilir.
İstenen iş parçacığı sayısını belirlemek için aşağıdaki kurallar sırayla dikkate alınır. Koşulu karşılanan ilk kural uygulanır:
num_threadsYan tümcesi varsa, tamsayı ifadesinin değeri istenen iş parçacığı sayısıdır.omp_set_num_threadsKitaplık işlevi çağrıldıysa, en son yürütülen çağrıdaki bağımsız değişkenin değeri istenen iş parçacığı sayısıdır.Ortam değişkeni
OMP_NUM_THREADStanımlanmışsa, bu ortam değişkeninin değeri istenen iş parçacığı sayısıdır.Yukarıdaki yöntemlerden hiçbiri kullanılmazsa, istenen iş parçacığı sayısı uygulama tanımlıdır.
num_threads Yan tümcesi varsa, kitaplık işlevi veya omp_set_num_threads ortam değişkeni tarafından OMP_NUM_THREADS yalnızca uygulandığı paralel bölge için istenen iş parçacığı sayısının yerini alır. Sonraki paralel bölgeler bundan etkilenmez.
Paralel bölgeyi yürüten iş parçacıklarının sayısı, iş parçacığı sayısının dinamik olarak ayarlanmasının etkinleştirilip etkinleştirilmediğine de bağlıdır. Dinamik ayarlama devre dışı bırakılırsa, istenen iş parçacığı sayısı paralel bölgeyi yürütür. Dinamik ayarlama etkinleştirildiyse, istenen iş parçacığı sayısı paralel bölgeyi yürütebilecek en fazla iş parçacığı sayısıdır.
İş parçacığı sayısının dinamik olarak ayarlanması devre dışı bırakılırken paralel bir bölgeyle karşılaşılırsa ve paralel bölge için istenen iş parçacığı sayısı, çalışma zamanı sisteminin sağlayabildiği sayıdan fazlaysa, programın davranışı uygulama tanımlıdır. Bir uygulama, örneğin, programın yürütülmesini kesintiye uğratabilir veya paralel bölgeyi seri hale getirebilir.
kitaplık omp_set_dynamic işlevi ve OMP_DYNAMIC ortam değişkeni, iş parçacığı sayısının dinamik olarak ayarlanmasını etkinleştirmek ve devre dışı bırakmak için kullanılabilir.
Herhangi bir zamanda iş parçacıklarını barındıran fiziksel işlemcilerin sayısı uygulama tanımlıdır. Oluşturulduktan sonra, ekipteki iş parçacıklarının sayısı bu paralel bölge süresi boyunca sabit kalır. Kullanıcı tarafından açıkça veya çalışma zamanı sistemi tarafından bir paralel bölgeden diğerine otomatik olarak değiştirilebilir.
Paralel bölgenin dinamik kapsamı içinde yer alan deyimler her iş parçacığı tarafından yürütülür ve her iş parçacığı diğer iş parçacıklarından farklı deyimlerin yolunu yürütebilir. Paralel bir bölgenin sözcük temelli kapsamı dışında karşılaşılan yönergeler yalnız bırakılmış yönergeler olarak adlandırılır.
Paralel bölgenin sonunda zımni bir engel vardır. Yalnızca ekibin ana iş parçacığı paralel bölgenin sonunda yürütmeye devam eder.
Paralel bölge yürüten bir ekipteki bir iş parçacığı başka bir paralel yapıyla karşılaşırsa, yeni bir ekip oluşturur ve bu yeni ekibin yöneticisi olur. İç içe paralel bölgeler varsayılan olarak seri hale getirilir. Sonuç olarak, iç içe paralel bölge varsayılan olarak bir iş parçacığından oluşan bir ekip tarafından yürütülür. Varsayılan davranış, çalışma zamanı kitaplığı işlevi omp_set_nested veya ortam değişkeni OMP_NESTEDkullanılarak değiştirilebilir. Ancak, bir ekipte iç içe paralel bölge yürüten iş parçacıklarının sayısı uygulama tanımlıdır.
yönergesine yönelik parallel kısıtlamalar şunlardır:
En fazla yönergesinde bir
ifyan tümce görünebilir.If ifadesinin veya
num_threadsifadesinin içinde herhangi bir yan etki olup olmadığı belirtilmez.Paralel
throwbölge içinde yürütülen bir yürütmenin aynı yapılandırılmış bloğun dinamik kapsamı içinde sürdürülmesine neden olması ve özel durum oluşturan aynı iş parçacığı tarafından yakalanması gerekir.Yönergesinde yalnızca tek
num_threadsbir yan tümce görünebilir. İfadenum_threads, paralel bölge bağlamının dışında değerlendirilir ve pozitif bir tamsayı değeri olarak değerlendirilmelidir.ve
ifyan tümcelerininnum_threadsdeğerlendirme sırası belirtilmemiştir.
Çapraz başvurular
-
private,firstprivate,default,shared,copyinvereductionyan tümceleri (bölüm 2.7.2) - OMP_NUM_THREADS ortam değişkeni
- kitaplık işlevini omp_set_dynamic
- OMP_DYNAMIC ortam değişkeni
- omp_set_nested işlevi
- OMP_NESTED ortam değişkeni
- kitaplık işlevini omp_set_num_threads
2.4 İş paylaşımı yapıları
İş paylaşımı yapısı, ilişkili deyimin yürütülmesini, kendisiyle karşılaşan ekibin üyeleri arasında dağıtır. İş paylaşımı yönergeleri yeni iş parçacıkları başlatmaz ve iş paylaşımı yapısına girişte örtülü bir engel yoktur.
Karşılaşılan iş paylaşımı yapılarının ve barrier yönergelerinin dizisi, ekipteki her iş parçacığı için aynı olmalıdır.
OpenMP aşağıdaki iş paylaşım yapılarını tanımlar ve bu yapılar aşağıdaki bölümlerde açıklanmıştır:
Yapı için 2.4.1
yönergesi, for ilişkili döngü yinelemelerinin paralel olarak yürütüleceğini belirten yinelemeli bir iş paylaşımı yapısı tanımlar. Döngü yinelemeleri for , bağlandığı paralel yapıyı yürüten ekipte zaten var olan iş parçacıkları arasında dağıtılır. Yapısının for söz dizimi aşağıdaki gibidir:
#pragma omp for [clause[[,] clause] ... ] new-line for-loop
yan tümcesi aşağıdakilerden biridir:
-
private(değişken listesi) -
firstprivate(değişken listesi) -
lastprivate(değişken listesi) -
reduction(operatör:değişken listesi) ordered-
schedule(kind [,chunk_size]) nowait
yönergesi, for ilgili for döngünün yapısına kısıtlamalar yerleştirir. Özel olarak, karşılık gelen for döngü kurallı şekle sahip olmalıdır:
for (
init-expr;var logical-op b;incr-expr)
init-expr
Aşağıdakilerden biri:
- var = Lb
- tamsayı türü var = lb
incr-expr
Aşağıdakilerden biri:
-
++var -
var
++ -
--var -
var
-- -
var
+=incr -
var
-=incr -
var
=var+incr -
var
=incr+var -
var
=var-incr
var
İmzalı bir tamsayı değişkeni. Bu değişken aksi takdirde paylaşılacaksa, süresi forboyunca örtük olarak özel yapılır. Bu değişkeni deyiminin gövdesinde değiştirmeyin for . Değişkeni belirtilmediği lastprivatesürece, döngüden sonraki değeri belirsizdir.
mantıksal op
Aşağıdakilerden biri:
<<=>>=
lb, b ve incr
Sabit tamsayı ifadelerini döngüye alın. Bu ifadelerin değerlendirilmesi sırasında eşitleme yapılmaz, dolayısıyla değerlendirilen yan etkiler belirsiz sonuçlar üretir.
Kurallı form, döngüye girişte döngü yinelemelerinin sayısının hesaplanmasına olanak tanır. Bu hesaplama, integral yükseltmelerinden sonra var türündeki değerlerle yapılır. Özellikle, b -+ değeri bu türde gösterilemiyorsa, sonuç belirsizdir. Ayrıca, mantıksal işlem, döngünün her yinelemesinde var'ın<olmalıdır. Mantıksal-op, >, döngünün her yinelemesinde var>=olmalıdır.
schedule yan tümcesi, döngü yinelemelerinin ekibin for iş parçacıkları arasında nasıl bölüneceğini belirtir. Bir programın doğruluğu, belirli bir yinelemeyi yürüten iş parçacığına bağlı olmamalıdır. chunk_size değeri belirtilirse, pozitif bir değere sahip döngü sabit tamsayı ifadesi olmalıdır. Bu ifadenin değerlendirilmesi sırasında eşitleme yapılmaz, bu nedenle değerlendirilen tüm yan etkiler belirsiz sonuçlar üretir. Zamanlama türü aşağıdaki değerlerden biri olabilir:
Tablo 2-1: schedule yan tümce türü değerleri
| Değer | Açıklama |
|---|---|
| durağan |
schedule(static,
chunk_size) belirtildiğinde, yinelemeler chunk_size tarafından belirtilen boyuttaki öbeklere ayrılır. Öbekler, ekipteki iş parçacıklarına iş parçacığı numarası sırasına göre hepsini bir kez deneme şeklinde statik olarak atanır.
hiçbir chunk_size belirtilmediğinde, yineleme alanı her iş parçacığına bir öbek atanarak yaklaşık olarak eşit boyuttaki öbeklere bölünür. |
| dinamik |
schedule(dynamic,
chunk_size) belirtildiğinde, yinelemeler her biri chunk_size yinelemeleri içeren bir öbek dizisine ayrılır. Her öbek, atama bekleyen bir iş parçacığına atanır. İş parçacığı yinelemelerin öbeklerini yürütür ve ardından atanacak öbek kalmayana kadar sonraki atamasını bekler. Atanacak son öbek daha az sayıda yinelemeye sahip olabilir. Hiçbir chunk_size belirtilmediğinde varsayılan olarak 1 olur. |
| güdümlü |
schedule(guided,
chunk_size) belirtildiğinde, yinelemeler boyutları azalan öbeklerdeki iş parçacıklarına atanır. bir iş parçacığı, atanmış yineleme öbeklerini tamamladığında, hiçbiri kalana kadar dinamik olarak başka bir öbek atanır.
1 chunk_size için her öbeğin boyutu, atanmamış yinelemelerin iş parçacığı sayısına bölünmesinin yaklaşık sayısıdır. Bu boyutlar neredeyse üssel olarak 1'e düşer. K değeri 1'den büyük olan bir chunk_size boyutları neredeyse üstel olarak k olarak azalır, ancak son öbek k yinelemelerinden daha az olabilir. Hiçbir chunk_size belirtilmediğinde varsayılan olarak 1 olur. |
| çalışma zamanı | Belirtildiğinde schedule(runtime) , zamanlamayla ilgili karar çalışma zamanına kadar ertelenmiş olur. Ortam değişkeni ayarlanarak öbeklerin zamanlama OMP_SCHEDULE ve boyutu çalışma zamanında seçilebilir. Bu ortam değişkeni ayarlanmamışsa, sonuçta elde edilen zamanlama uygulama tanımlıdır. Belirtildiğinde schedule(runtime) , chunk_size belirtilmemelidir. |
Açıkça tanımlanmış schedule bir yan tümce olmadığında, varsayılan schedule uygulama tanımlıdır.
OpenMP uyumlu bir program, doğru yürütme için belirli bir zamanlamaya güvenmemelidir. Bir program, yukarıda verilen açıklamaya tam olarak uyan bir zamanlama türüne güvenmemelidir, çünkü farklı derleyiciler arasında aynı zamanlama türünün uygulamalarında çeşitlemeler olması mümkündür. Açıklamalar, belirli bir duruma uygun zamanlamayı seçmek için kullanılabilir.
ordered yan tümcesi, yönergeler yapıya ordered bağlandığında mevcut for olmalıdır.
Bir yan tümce belirtilmediği sürece bir for yapı sonunda örtük bir nowait engel vardır.
yönergesine yönelik for kısıtlamalar şunlardır:
Döngü
foryapılandırılmış bir blok olmalıdır ve buna ek olarak, yürütmesi birbreakdeyim tarafından sonlandırılmamalıdır.Bir
foryönergeyle ilişkili döngü denetim ifadelerininfordeğerleri takımdaki tüm iş parçacıkları için aynı olmalıdır.Döngü
foryineleme değişkeninin imzalı bir tamsayı türü olmalıdır.Yönergede yalnızca tek
schedulebirforyan tümce görünebilir.Yönergede yalnızca tek
orderedbirforyan tümce görünebilir.Yönergede yalnızca tek
nowaitbirforyan tümce görünebilir.chunk_size, lb, b veya incr ifadelerindeki yan etkilerin olup olmadığını veya ne sıklıkta oluştuğu belirtilmez.
chunk_size ifadesinin değeri takımdaki tüm iş parçacıkları için aynı olmalıdır.
Çapraz başvurular
-
private,firstprivate,lastprivatevereductionyan tümceleri (bölüm 2.7.2) - OMP_SCHEDULE ortam değişkeni
- sıralı yapı
- schedule yan tümcesi
2.4.2 bölüm yapısı
yönergesi sections , bir ekipteki iş parçacıkları arasında bölünecek bir yapı kümesini belirten bir tanımlayıcı olmayan iş paylaşımı yapısını tanımlar. Her bölüm ekipteki bir iş parçacığı tarafından bir kez yürütülür. yönergesinin sections söz dizimi aşağıdaki gibidir:
#pragma omp sections [clause[[,] clause] ...] new-line
{
[#pragma omp section new-line]
structured-block
[#pragma omp section new-linestructured-block ]
...
}
yan tümcesi aşağıdakilerden biridir:
-
private(değişken listesi) -
firstprivate(değişken listesi) -
lastprivate(değişken listesi) -
reduction(operatör:değişken listesi) nowait
İlk bölüm için isteğe bağlı olsa da, her bölümün section önünde bir section yönerge bulunur. Yönergelerin section , yönergenin sözcük temelli kapsamı sections içinde görünmesi gerekir. Bir yapı belirtilmediği sürece, bir yapısının sonunda örtük bir sectionsnowait engel vardır.
yönergesine yönelik sections kısıtlamalar şunlardır:
Yönerge
section, yönergenin sözcük temelli kapsamınınsectionsdışında görünmelidir.Yönergede yalnızca tek
nowaitbirsectionsyan tümce görünebilir.
Çapraz başvurular
-
private,firstprivate,lastprivatevereductionyan tümceleri (bölüm 2.7.2)
2.4.3 tek yapı
yönergesi single , ilişkili yapılandırılmış bloğun ekipteki tek bir iş parçacığı tarafından yürütüldüğünü belirten bir yapı tanımlar (ana iş parçacığı olması gerekmez). yönergesinin single söz dizimi aşağıdaki gibidir:
#pragma omp single [clause[[,] clause] ...] new-linestructured-block
yan tümcesi aşağıdakilerden biridir:
-
private(değişken listesi) -
firstprivate(değişken listesi) -
copyprivate(değişken listesi) nowait
Bir yan tümce belirtilmediği sürece yapıdan single sonra örtük bir nowait engel vardır.
yönergesine yönelik single kısıtlamalar şunlardır:
- Yönergede yalnızca tek
nowaitbirsingleyan tümce görünebilir. -
copyprivateyan tümcesi yan tümcesiylenowaitkullanılmamalıdır.
Çapraz başvurular
-
private,firstprivatevecopyprivateyan tümceleri (bölüm 2.7.2)
2.5 Birleşik paralel iş paylaşımı yapıları
Birleştirilmiş paralel iş paylaşımı yapıları, yalnızca bir iş paylaşımı yapısına sahip paralel bir bölge belirtmek için kısayollardır. Bu yönergelerin semantiği, bir yönergeyi ve ardından tek bir parallel iş paylaşımı yapısını açıkça belirtmekle aynıdır.
Aşağıdaki bölümlerde, birleşik paralel iş paylaşımı yapıları açıklanmaktadır:
- yönergesi için paralel
- parallel sections yönergesi
Yapı için 2.5.1 paralel
yönergesiparallel for, yalnızca tek parallel bir yönerge içeren bir for bölge için bir kısayoldur. yönergesinin parallel for söz dizimi aşağıdaki gibidir:
#pragma omp parallel for [clause[[,] clause] ...] new-linefor-loop
Bu yönerge, yan tümcesi dışında yönergenin parallel ve yönergenin fornowait tüm yan tümcelerine, aynı anlamlara ve kısıtlamalara izin verir. Semantik, bir yönergenin hemen ardından parallel bir for yönergenin açıkça belirtilmesiyle aynıdır.
Çapraz başvurular
- paralel yönerge
- for yönergesi
- Veri özniteliği yan tümceleri
2.5.2 paralel bölüm yapısı
yönergesiparallel sections, yalnızca tek parallel yönergesi olan bir sections bölge belirtmek için bir kısayol formu sağlar. Semantik, bir yönergenin hemen ardından parallel bir sections yönergenin açıkça belirtilmesiyle aynıdır. yönergesinin parallel sections söz dizimi aşağıdaki gibidir:
#pragma omp parallel sections [clause[[,] clause] ...] new-line
{
[#pragma omp section new-line]
structured-block
[#pragma omp section new-linestructured-block ]
...
}
yan tümcesi, yan tümcesi dışında parallel ve sections yönergeleri tarafından nowait kabul edilen yan tümcelerden biri olabilir.
Çapraz başvurular
2.6 Ana ve eşitleme yönergeleri
Aşağıdaki bölümlerde şunlar açıklanmaktadır:
2.6.1 ana yapısı
yönergesi master , ekibin ana iş parçacığı tarafından yürütülen yapılandırılmış bir bloğu belirten bir yapıyı tanımlar. yönergesinin master söz dizimi aşağıdaki gibidir:
#pragma omp master new-linestructured-block
Ekipteki diğer iş parçacıkları ilişkili yapılandırılmış bloğu yürütmez. Ana yapıya giriş veya çıkışta zımni bir engel yoktur.
2.6.2 kritik yapısı
yönergesi, critical ilişkili yapılandırılmış bloğun yürütülmesini tek seferde tek bir iş parçacığıyla kısıtlayan bir yapı tanımlar. yönergesinin critical söz dizimi aşağıdaki gibidir:
#pragma omp critical [(name)] new-linestructured-block
Kritik bölgeyi tanımlamak için isteğe bağlı bir ad kullanılabilir. Kritik bir bölgeyi tanımlamak için kullanılan tanımlayıcıların dış bağlantısı vardır ve etiketler, etiketler, üyeler ve sıradan tanımlayıcılar tarafından kullanılan ad alanlarından ayrı bir ad alanındadır.
İş parçacığı, başka bir iş parçacığı aynı ada sahip kritik bir bölgeyi (programın herhangi bir yerinde) yürütmeyene kadar kritik bir bölgenin başında bekler. Tüm adlandırılmamış critical yönergeler aynı belirtilmeyen ada eşler.
2.6.3 bariyer yönergesi
yönergesi barrier , bir takımdaki tüm iş parçacıklarını eşitler. Karşılaşıldığında, ekipteki her iş parçacığı diğerlerinin tümü bu noktaya ulaşana kadar bekler. yönergesinin barrier söz dizimi aşağıdaki gibidir:
#pragma omp barrier new-line
Ekipteki tüm iş parçacıkları engelle karşılaştıklarından sonra, takımdaki her iş parçacığı, bariyer yönergesinin ardından deyimleri paralel olarak yürütmeye başlar. Yönergenin barrier söz diziminin bir parçası olarak bir C dil deyimi olmadığından, program içinde yerleştirilmesiyle ilgili bazı kısıtlamalar vardır. Resmi dil bilgisi hakkında daha fazla bilgi için bkz . ek C. Aşağıdaki örnekte bu kısıtlamalar gösterilmektedir.
/* ERROR - The barrier directive cannot be the immediate
* substatement of an if statement
*/
if (x!=0)
#pragma omp barrier
...
/* OK - The barrier directive is enclosed in a
* compound statement.
*/
if (x!=0) {
#pragma omp barrier
}
2.6.4 atomik yapısı
yönergesi atomic , belirli bir bellek konumunun birden çok eşzamanlı yazma iş parçacığı olasılığına maruz kalmasını sağlamak yerine atomik olarak güncelleştirilmesini sağlar. yönergesinin atomic söz dizimi aşağıdaki gibidir:
#pragma omp atomic new-lineexpression-stmt
İfade deyimi aşağıdaki formlardan birine sahip olmalıdır:
-
x binop
=ifade -
x
++ -
++x -
x
-- -
--x
Önceki ifadelerde:
x , skaler türe sahip bir lvalue ifadesidir.
expr, skaler türüne sahip bir ifadedir ve x tarafından belirlenen nesneye başvurmaz.
binop aşırı yüklenmiş bir işleç değildir ve , ,
+,*,-,/,&, ,^|veya<<öğelerinden biridir>>.
Bir uygulamanın tüm atomic yönergeleri aynı benzersiz critical sahip yönergelerle değiştirip değiştirmediği uygulama tanımlı olsa da, atomic yönerge daha iyi iyileştirmeye izin verir. Genellikle en az ek yükle atomik güncelleştirmeyi gerçekleştirebilen donanım yönergeleri sağlanır.
Yalnızca x tarafından belirlenen nesnenin yükü ve deposu atomiktir; ifadenin değerlendirilmesi atomik değildir. Yarış koşullarından kaçınmak için, yarış koşullarından arınmış olduğu bilinenler dışında paralel konumdaki tüm güncelleştirmeler yönergeyle atomic korunmalıdır.
yönergesine yönelik atomic kısıtlamalar şunlardır:
- Program genelinde x depolama konumuna yapılan tüm atomik başvuruların uyumlu bir türe sahip olması gerekir.
Örnekler
extern float a[], *p = a, b;
/* Protect against races among multiple updates. */
#pragma omp atomic
a[index[i]] += b;
/* Protect against races with updates through a. */
#pragma omp atomic
p[i] -= 1.0f;
extern union {int n; float x;} u;
/* ERROR - References through incompatible types. */
#pragma omp atomic
u.n++;
#pragma omp atomic
u.x -= 1.0f;
2.6.5 temizleme yönergesi
yönergesi flush , açık veya zımni olsun, bir ekipteki tüm iş parçacıklarının bellekteki belirli nesnelerin (aşağıda belirtilen) tutarlı bir görünümüne sahip olduğundan emin olmak için uygulamanın gerekli olduğu bir "çapraz iş parçacığı" sıra noktası belirtir. Bu, bu nesnelere başvuran ifadelerin önceki değerlendirmelerinin tamamlandığını ve sonraki değerlendirmelerin henüz başlamadığını gösterir. Örneğin, derleyicilerin nesnelerin değerlerini yazmaçlardan belleğe geri yüklemesi gerekir ve donanım yazma arabelleklerini belleğe boşaltmalı ve nesnelerin değerlerini bellekten yeniden yüklemelidir.
yönergesinin flush söz dizimi aşağıdaki gibidir:
#pragma omp flush [(variable-list)] new-line
Eşitleme gerektiren nesnelerin tümü değişkenler tarafından belirlenebiliyorsa, bu değişkenler isteğe bağlı değişken listesinde belirtilebilir. Değişken listesinde bir işaretçi varsa, işaretçinin başvurduğu nesne değil, işaretçinin kendisi boşaltılır.
flush Değişken listesi olmayan bir yönerge, erişilemeyen nesneler dışındaki tüm paylaşılan nesneleri otomatik depolama süresiyle eşitler. (Bu, değişken listesiflushbir değerinden daha fazla ek yüke sahip olabilir.) flush Değişken listesi olmayan bir yönerge, aşağıdaki yönergeler için örtülüdür:
barrier- Girişte ve çıkışta
critical - Girişte ve çıkışta
ordered - Girişte ve çıkışta
parallel - Çıkışta
for - Çıkışta
sections - Çıkışta
single - Girişte ve çıkışta
parallel for - Girişte ve çıkışta
parallel sections
Yan tümcesi varsa nowait yönergesi ima değildir. Yönergenin flush aşağıdakilerden herhangi biri için ima edilmediği belirtilmelidir:
- Girişte
for - Girişte veya çıkışta
master - Girişte
sections - Girişte
single
Geçici nitelikli türe sahip bir nesnenin değerine erişen bir başvuru, önceki sıra noktasında bu nesneyi belirten bir flush yönerge varmış gibi davranır. Geçici nitelikli türe sahip bir nesnenin değerini değiştiren bir başvuru, sonraki sıra noktasında bu nesneyi belirten bir flush yönerge varmış gibi davranır.
Yönergenin flush söz diziminin bir parçası olarak bir C dil deyimi olmadığından, program içinde yerleştirilmesiyle ilgili bazı kısıtlamalar vardır. Resmi dil bilgisi hakkında daha fazla bilgi için bkz . ek C. Aşağıdaki örnekte bu kısıtlamalar gösterilmektedir.
/* ERROR - The flush directive cannot be the immediate
* substatement of an if statement.
*/
if (x!=0)
#pragma omp flush (x)
...
/* OK - The flush directive is enclosed in a
* compound statement
*/
if (x!=0) {
#pragma omp flush (x)
}
yönergesine yönelik flush kısıtlamalar şunlardır:
- Yönergesinde belirtilen bir
flushdeğişkenin başvuru türü olmamalıdır.
2.6.6 sıralı yapı
Bir ordered yönergeyi izleyen yapılandırılmış blok, yinelemelerin sıralı döngüde yürütüleceği sırayla yürütülür. yönergesinin ordered söz dizimi aşağıdaki gibidir:
#pragma omp ordered new-linestructured-block
Yönerge, ordered bir for veya parallel for yapısının dinamik kapsamı içinde olmalıdır.
for Yapı bağlamalarının parallel for bölüm 2.4.1'de orderedaçıklandığı gibi belirtilen bir ordered yan tümcesine sahip olması gereken or yönergesi. Bir for veya parallel for yapısının bir ordered yan tümcesi ile yürütülmesinde, ordered yapılar kesinlikle döngünün sıralı yürütmesinde yürütülecekleri sırayla yürütülür.
yönergesine yönelik ordered kısıtlamalar şunlardır:
- Bir yapıya sahip
forbir döngü yinelemesi aynı sıralı yönergeyi birden çok kez yürütmemeli ve birdenorderedfazla yönerge yürütmemelidir.
2.7 Veri ortamı
Bu bölümde, paralel bölgelerin yürütülmesi sırasında veri ortamını denetlemeye yönelik bir yönerge ve çeşitli yan tümceler aşağıda gösterildiği gibi verilmiştir:
İş parçacığında dosya kapsamı, ad alanı kapsamı veya statik blok kapsamı değişkenlerini yerel hale getirmek için bir threadprivate yönergesi sağlanır.
Paralel veya iş paylaşımı yapıları süresi boyunca değişkenlerin paylaşım özniteliklerini denetlemek için yönergelerinde belirtilebilen yan tümceler bölüm 2.7.2'de açıklanmıştır.
2.7.1 threadprivate yönergesi
yönergesithreadprivate, değişken listesinde belirtilen adlandırılmış dosya kapsamı, ad alanı-kapsamı veya statik blok kapsamı değişkenlerini bir iş parçacığı için özel hale getirir.
variable-list , tamamlanmamış türü olmayan değişkenlerin virgülle ayrılmış listesidir. yönergesinin threadprivate söz dizimi aşağıdaki gibidir:
#pragma omp threadprivate(variable-list) new-line
Bir threadprivate değişkenin her kopyası, bir kez, bu kopyaya ilk başvurudan önce programda belirtilmeyen bir noktada ve normal şekilde başlatılır (örneğin, ana kopya programın seri yürütmesinde başlatılacağı gibi). Değişkenin açık başlatıcısında threadprivate bir nesneye başvurulursa ve değişkenin bir kopyasına ilk başvurudan önce nesnenin değeri değiştirilirse, davranış belirtilmez.
Herhangi bir özel değişkende olduğu gibi, iş parçacığı başka bir iş parçacığının nesne kopyasına threadprivate başvurmamalıdır. Programın seri bölgeleri ve ana bölgeleri sırasında, başvurular ana iş parçacığının nesne kopyasına yapılır.
İlk paralel bölge yürütüldükten sonra, nesnelerdeki threadprivate verilerin yalnızca dinamik iş parçacıkları mekanizması devre dışı bırakıldıysa ve tüm paralel bölgeler için iş parçacığı sayısı değişmeden kalırsa kalıcı olması garanti edilir.
yönergesine yönelik threadprivate kısıtlamalar aşağıdaki gibidir:
threadprivateDosya kapsamı veya ad alanı kapsamı değişkenlerine yönelik bir yönerge herhangi bir tanımın veya bildirimin dışında görünmelidir ve listesindeki tüm değişkenlere yapılan tüm başvurulardan önce olmalıdır.Dosya veya ad alanı kapsamındaki bir yönergenin değişken listesindeki her değişkenin
threadprivate, yönergeden önce gelen dosya veya ad alanı kapsamındaki değişken bildirimine başvurması gerekir.threadprivateStatik blok kapsamı değişkenlerine yönelik bir yönerge, iç içe yerleştirilmiş kapsamda değil değişkenin kapsamında görünmelidir. yönergesi, listesindeki tüm değişkenlere yönelik tüm başvurulardan önce sözcük temelli olmalıdır.Blok kapsamındaki bir yönergenin değişken listesindeki her değişken
threadprivate, yönergeden önce gelen aynı kapsamdaki bir değişken bildirimine başvurmalıdır. Değişken bildirimi statik depolama sınıfı tanımlayıcısını kullanmalıdır.Bir değişken bir çeviri birimindeki bir
threadprivateyönergede belirtilirse, içinde bildirildiği her çeviri birimindeki birthreadprivateyönergede belirtilmelidir.Değişkenin
threadprivate, ,copyin,copyprivatescheduleveya yan tümcesinum_threadsdışında herhangi bir yan tümcedeifgörünmemesi gerekir.Değişkenin
threadprivateadresi bir adres sabiti değildir.Değişkenin
threadprivatetamamlanmamış bir türü veya başvuru türü olmamalıdır.threadprivatePOD olmayan sınıf türüne sahip bir değişken, açık bir başlatıcıyla bildirildiyse erişilebilir, belirsiz bir kopya oluşturucuya sahip olmalıdır.
Aşağıdaki örnekte, başlatıcıda görünen bir değişkenin değiştirilmesinin belirtilmeyen davranışa nasıl neden olabileceği ve ayrıca yardımcı bir nesne ve kopya oluşturucu kullanarak bu sorunun nasıl önileceği gösterilmektedir.
int x = 1;
T a(x);
const T b_aux(x); /* Capture value of x = 1 */
T b(b_aux);
#pragma omp threadprivate(a, b)
void f(int n) {
x++;
#pragma omp parallel for
/* In each thread:
* Object a is constructed from x (with value 1 or 2?)
* Object b is copy-constructed from b_aux
*/
for (int i=0; i<n; i++) {
g(a, b); /* Value of a is unspecified. */
}
}
Çapraz başvurular
- dinamik iş parçacıkları
- OMP_DYNAMIC ortam değişkeni
2.7.2 Veri paylaşımı öznitelik yan tümceleri
Çeşitli yönergeler, kullanıcının bölge süresi boyunca değişkenlerin paylaşım özniteliklerini denetlemesine olanak sağlayan yan tümceleri kabul eder. Sharing attribute yan tümceleri yalnızca yan tümcesinin göründüğü yönergenin sözcük temelli kapsamındaki değişkenlere uygulanır. Tüm yönergelerde aşağıdaki yan tümcelerin tümüne izin verilmez. Belirli bir yönergede geçerli olan yan tümcelerin listesi yönergesiyle açıklanmıştır.
Paralel veya iş paylaşımı yapısıyla karşılaşıldığında bir değişken görünür durumdaysa ve değişken bir sharing özniteliği yan tümcesinde veya threadprivate yönergesinde belirtilmezse, değişken paylaşılır. Paralel bölgenin dinamik kapsamı içinde bildirilen statik değişkenler paylaşılır. Yığın ayrılan bellek (örneğin, C veya C++ içinde veya C++malloc()'da işleç kullanılaraknew) paylaşılır. (Ancak bu belleğin işaretçisi özel veya paylaşılan olabilir.) Paralel bölgenin dinamik kapsamı içinde bildirilen otomatik depolama süresine sahip değişkenler özeldir.
Yan tümcelerin çoğu, görünür olan değişkenlerin virgülle ayrılmış bir listesi olan değişken listesi bağımsız değişkenini kabul eder. Veri paylaşımı öznitelik yan tümcesinde başvuruda bulunan bir değişken bir şablondan türetilmiş bir türe sahipse ve programda bu değişkene başka başvuru yoksa, davranış tanımlanmamıştır.
Yönerge yan tümceleri içinde görünen tüm değişkenler görünür olmalıdır. Yan tümceler gerektiğinde yinelenebilir, ancak bir değişkenin hem hem de firstprivatelastprivate yan tümcesinde belirtilmesi dışında birden fazla yan tümcede değişken belirtilmez.
Aşağıdaki bölümlerde veri paylaşımı öznitelik yan tümceleri açıklanmaktadır:
2.7.2.1 özel
private yan tümcesi, değişken listesindeki değişkenleri bir ekipteki her iş parçacığına özel olacak şekilde bildirir. Yan tümcesinin private söz dizimi aşağıdaki gibidir:
private(variable-list)
Yan tümcesinde private belirtilen bir değişkenin davranışı aşağıdaki gibidir. Yapı için otomatik depolama süresine sahip yeni bir nesne ayrılır. Yeni nesnenin boyutu ve hizalaması değişkenin türüne göre belirlenir. Bu ayırma, ekipteki her iş parçacığı için bir kez gerçekleşir ve gerekirse bir sınıf nesnesi için varsayılan oluşturucu çağrılır; aksi takdirde ilk değer belirsizdir. değişkeni tarafından başvuruda bulunılan özgün nesne, yapıya girdikten sonra belirsiz bir değere sahiptir, yapının dinamik kapsamı içinde değiştirilmemelidir ve yapıdan çıkışta belirsiz bir değere sahiptir.
Yönerge yapısının sözcük temelli uzantısında, değişken iş parçacığı tarafından ayrılan yeni özel nesneye başvurur.
yan tümcesine yönelik private kısıtlamalar aşağıdaki gibidir:
Yan tümcesinde belirtilen sınıf türüne sahip bir
privatedeğişkenin erişilebilir, belirsiz bir varsayılan oluşturucuya sahip olması gerekir.Bir yan tümcesinde belirtilen değişken
private, üyeliconstbirmutablesınıf türüne sahip olmadığı sürece -qualified türüne sahip olmamalıdır.Yan tümcesinde belirtilen değişkenin
privateeksik türü veya başvuru türü olmamalıdır.Bir
reductionyönergeninparallelyan tümcesinde görünen değişkenler, paralel yapıya bağlanan birprivateiş paylaşımı yönergesindeki bir yan tümcede belirtilemiyor.
2.7.2.2 firstprivate
firstprivate yan tümcesi, yan tümcesi tarafından sağlanan işlevselliğin private üst kümesini sağlar. Yan tümcesinin firstprivate söz dizimi aşağıdaki gibidir:
firstprivate(variable-list)
Değişken listesinde belirtilen değişkenlerin 2.7.2.1 bölümünde açıklandığı gibi yan tümcesi semantiği vardırprivate. Başlatma veya oluşturma, iş parçacığının yapısını yürütmeden önce iş parçacığı başına bir kez yapılmış gibi gerçekleşir. Paralel yapıdaki bir firstprivate yan tümce için, yeni özel nesnenin ilk değeri, karşılaşılan iş parçacığının paralel yapısından hemen önce var olan özgün nesnenin değeridir. İş paylaşımı yapısındaki bir firstprivate yan tümce için, iş paylaşımı yapısını yürüten her iş parçacığı için yeni özel nesnenin ilk değeri, aynı iş parçacığının iş paylaşımı yapısıyla karşılaştığı noktadan önce var olan özgün nesnenin değeridir. Ayrıca, C++ nesneleri için her iş parçacığı için yeni özel nesne özgün nesneden oluşturulur.
yan tümcesine yönelik firstprivate kısıtlamalar aşağıdaki gibidir:
Yan tümcesinde belirtilen değişkenin
firstprivateeksik türü veya başvuru türü olmamalıdır.Olarak
firstprivatebelirtilen sınıf türüne sahip bir değişkenin erişilebilir, belirsiz bir kopya oluşturucuya sahip olması gerekir.Paralel bölge içinde özel olan veya bir
reductionyönergeninparallelyan tümcesinde görünen değişkenler, paralel yapıya bağlanan birfirstprivateiş paylaşımı yönergesindeki yan tümcesinde belirtilemiyor.
2.7.2.3 lastprivate
lastprivate yan tümcesi, yan tümcesi tarafından sağlanan işlevselliğin private üst kümesini sağlar. Yan tümcesinin lastprivate söz dizimi aşağıdaki gibidir:
lastprivate(variable-list)
variable-listyan tümcesi semantiği vardır. Bir iş paylaşımı yapısını tanımlayan yönergede bir lastprivate yan tümce göründüğünde, ilişkili döngünün sıralı son yinelemesinden veya sözcük temelli son bölüm yönergesinden her lastprivate değişkenin değeri değişkenin özgün nesnesine atanır. veya öğesinin son yinelemesi veya veya foryönergesinin parallel for sözcüksel olarak son bölümü sectionsparallel sections tarafından bir değer atanmamış değişkenler, yapısından sonra belirsiz değerlere sahiptir. Atanmamış alt nesneler de yapıdan sonra belirsiz bir değere sahiptir.
yan tümcesine yönelik lastprivate kısıtlamalar aşağıdaki gibidir:
Için tüm kısıtlamalar
privategeçerlidir.Olarak
lastprivatebelirtilen sınıf türüne sahip bir değişkenin erişilebilir, belirsiz bir kopya atama işleci olması gerekir.Paralel bölge içinde özel olan veya bir
reductionyönergeninparallelyan tümcesinde görünen değişkenler, paralel yapıya bağlanan birlastprivateiş paylaşımı yönergesindeki yan tümcesinde belirtilemiyor.
2.7.2.4 paylaşılan
Bu yan tümce, bir ekipteki tüm iş parçacıkları arasında değişken listesinde görünen değişkenleri paylaşır. Bir ekip içindeki tüm iş parçacıkları, değişkenler için shared aynı depolama alanına erişmektedir.
Yan tümcesinin shared söz dizimi aşağıdaki gibidir:
shared(variable-list)
2.7.2.5 varsayılanı
default yan tümcesi, kullanıcının değişkenlerin veri paylaşımı özniteliklerini etkilemesine olanak tanır. Yan tümcesinin default söz dizimi aşağıdaki gibidir:
default(shared | none)
default(shared) Belirtme, veya shared-nitelenmediği sürecethreadprivate, şu anda görünen her değişkenin bir const yan tümcede açıkça listelenmesiyle eşdeğerdir. Açık default bir yan tümcesi olmadığında, varsayılan davranış belirtildiyse default(shared) ile aynıdır.
Belirtilmesi default(none) , paralel yapısının sözcük düzeyindeki bir değişkene yapılan her başvuru için aşağıdakilerden en az birinin doğru olmasını gerektirir:
değişkeni, başvuruyu içeren bir yapının veri paylaşımı öznitelik yan tümcesinde açıkça listelenir.
değişkeni paralel yapı içinde bildirilir.
değişkenidir
threadprivate.Değişkenin -
constqualified türü vardır.değişkeni, bir veya
foryönergesini hemen izleyenforbirparallel fordöngünün döngü denetim değişkenidir ve değişken başvurusu döngünün içinde görünür.
Kapalı yönergenin bir firstprivate, lastprivateveya reduction yan tümcesinde bir değişken belirtmek, kapsayan bağlamda değişkene örtük bir başvuruya neden olur. Bu tür örtük başvurular da yukarıda listelenen gereksinimlere tabidir.
Yönergede yalnızca tek default bir parallel yan tümce belirtilebilir.
Bir değişkenin varsayılan veri paylaşımı özniteliği, aşağıdaki örnekte gösterildiği gibi , privatefirstprivate, , lastprivateve reduction yan tümceleri kullanılarak sharedgeçersiz kılınabilir:
#pragma omp parallel for default(shared) firstprivate(i)\
private(x) private(r) lastprivate(i)
2.7.2.6 azaltma
Bu yan tümce, işleç op ile değişken listesinde görünen skaler değişkenlerde bir azaltma gerçekleştirir. Yan tümcesinin reduction söz dizimi aşağıdaki gibidir:
reduction(
Op:değişken listesi)
Azaltma genellikle aşağıdaki formlardan birine sahip bir deyim için belirtilir:
-
x
=xopexpr -
xbinop
=expr -
x
=expropx (çıkarma hariç) -
x
++ -
++x -
x
-- -
--x
konumu:
x
Listede belirtilen azaltma değişkenlerinden biri.
değişken listesi
Skaler azaltma değişkenlerinin virgülle ayrılmış listesi.
ifade
x'e başvurmayan skaler türe sahip bir ifade.
Op
Aşırı yüklenmiş bir işleç değil, , +, *, -, &, ^|veya &&.||
binop
Aşırı yüklenmiş bir işleç değil, , +, *, -&veya ^.|
Aşağıdaki yan tümcenin reduction bir örneğidir:
#pragma omp parallel for reduction(+: a, y) reduction(||: am)
for (i=0; i<n; i++) {
a += b[i];
y = sum(y, c[i]);
am = am || b[i] == c[i];
}
Örnekte gösterildiği gibi, bir işleç bir işlev çağrısının içinde gizlenmiş olabilir. Kullanıcı, yan tümcesinde reduction belirtilen işlecin azaltma işlemiyle eşleşmesine dikkat etmelidir.
İşlecin doğru işleneninin || bu örnekte yan etkileri olmasa da bunlara izin verilir, ancak dikkatli kullanılmalıdır. Bu bağlamda, döngünün sıralı yürütülmesi sırasında gerçekleşmemesi garanti edilen bir yan etki paralel yürütme sırasında gerçekleşebilir. Yinelemelerin yürütme sırası belirsiz olduğundan bu fark oluşabilir.
işleci, azaltma için derleyici tarafından kullanılan tüm özel değişkenlerin başlangıç değerini belirlemek ve sonlandırma işlecini belirlemek için kullanılır. işlecinin açıkça belirtilmesi, azaltma deyiminin yapısının sözcük temelli kapsamının dışında olmasını sağlar. Yönergede herhangi bir sayıda reduction yan tümce belirtilebilir, ancak bir değişken bu yönerge için en fazla bir reduction yan tümcede görünebilir.
Yan tümcesi kullanılmış gibi, değişken listesindeki her değişkenin private özel bir kopyası oluşturulur ve her iş parçacığı için bir tane oluşturulur. Özel kopya işlecine göre başlatılır (aşağıdaki tabloya bakın).
Yan tümcesinin belirtildiği bölgenin reduction sonunda, özgün nesnesi belirtilen işleci kullanılarak özgün değerini özel kopyaların her birinin son değeriyle birleştirmenin sonucunu yansıtacak şekilde güncelleştirilir. Azaltma işleçlerinin tümü ilişkilendirilebilir (çıkarma hariç) ve derleyici son değerin hesaplamasını serbestçe yeniden ilişkilendirebilir. (Çıkarma azaltmanın kısmi sonuçları, son değeri oluşturmak için eklenir.)
İlk iş parçacığı içeren yan tümcesine ulaştığında özgün nesnenin değeri belirsiz hale gelir ve azaltma hesaplaması tamamlanana kadar böyle kalır. Normalde hesaplama, yapı sonunda tamamlanır; ancak yan tümcesi reduction aynı zamanda uygulanan bir yapıda nowait kullanılıyorsa, tüm iş parçacıklarının yan tümcesini tamamlamasını sağlamak için bir engel eşitleme gerçekleştirilene kadar özgün nesnenin reduction değeri belirsiz kalır.
Aşağıdaki tabloda geçerli olan işleçler ve kurallı başlatma değerleri listelenmiştir. Gerçek başlatma değeri, azaltma değişkeninin veri türüyle tutarlı olacaktır.
| Operatör | Başlatma |
|---|---|
+ |
0 |
* |
1 |
- |
0 |
& |
~0 |
| |
0 |
^ |
0 |
&& |
1 |
|| |
0 |
yan tümcesine yönelik reduction kısıtlamalar aşağıdaki gibidir:
yan tümcesindeki
reductiondeğişkenlerin türü, işaretçi türlerine ve başvuru türlerine hiçbir zaman izin verilmemesi dışında azaltma işleci için geçerli olmalıdır.Yan tümcesinde
reductionbelirtilen bir değişken -qualified olmamalıdırconst.Paralel bölge içinde özel olan veya bir
reductionyönergeninparallelyan tümcesinde görünen değişkenler, paralel yapıya bağlanan birreductioniş paylaşımı yönergesindeki yan tümcesinde belirtilemiyor.#pragma omp parallel private(y) { /* ERROR - private variable y cannot be specified in a reduction clause */ #pragma omp for reduction(+: y) for (i=0; i<n; i++) y += b[i]; } /* ERROR - variable x cannot be specified in both a shared and a reduction clause */ #pragma omp parallel for shared(x) reduction(+: x)
2.7.2.7 kopya
copyin yan tümcesi, paralel bölgeyi yürüten ekipteki her iş parçacığı için değişkenlere threadprivate aynı değeri atamak için bir mekanizma sağlar. Yan copyin tümcesinde belirtilen her değişken için, ekibin ana iş parçacığındaki değişkenin değeri, atamayla olduğu gibi paralel bölgenin başındaki iş parçacığı özel kopyalarına kopyalanır. Yan tümcesinin copyin söz dizimi aşağıdaki gibidir:
copyin(
variable-list
)
yan tümcesine yönelik copyin kısıtlamalar aşağıdaki gibidir:
yan tümcesinde
copyinbelirtilen bir değişkenin erişilebilir, belirsiz bir kopya atama işleci olmalıdır.Yan tümcesinde
copyinbelirtilen bir değişken birthreadprivatedeğişken olmalıdır.
2.7.2.8 copyprivate
copyprivate yan tümcesi, bir ekibin bir üyesinden diğer üyelere bir değer yayınlamak için özel değişken kullanma mekanizması sağlar. Bu, böyle bir paylaşılan değişken sağlarken değer için paylaşılan değişken kullanmanın bir alternatifidir (örneğin, her düzeyde farklı bir değişken gerektiren özyinelemede).
copyprivate yan tümcesi yalnızca yönergesinde single görünebilir.
Yan tümcesinin copyprivate söz dizimi aşağıdaki gibidir:
copyprivate(
variable-list
)
Yan tümcesinin copyprivate değişken listesindeki değişkenler üzerindeki etkisi, yapıyla single ilişkili yapılandırılmış bloğun yürütülmesinden sonra ve ekipteki iş parçacıklarından herhangi biri yapının sonundaki engeli bırakmadan önce gerçekleşir. Ardından, ekipteki diğer tüm iş parçacıklarında, değişken listesindeki her değişken için bu değişken, yapının yapılandırılmış bloğunu yürüten iş parçacığında karşılık gelen değişkenin değeriyle tanımlanır (atama tarafından gibi).
yan tümcesine yönelik copyprivate kısıtlamalar şunlardır:
Yan tümcesinde belirtilen bir değişkenin
copyprivateaynıprivateyönerge için orfirstprivatesingleyan tümcesinde görünmemesi gerekir.Yan tümcesine sahip bir
singlecopyprivateyönerge paralel bölgenin dinamik bağlamında karşılaşıyorsa, yan tümcesindecopyprivatebelirtilen tüm değişkenlerin kapsayan bağlamda özel olması gerekir.Yan tümcesinde
copyprivatebelirtilen bir değişkenin erişilebilir ve belirsiz bir kopya atama işleci olması gerekir.
2.8 Yönerge bağlaması
Yönergelerin dinamik bağlaması aşağıdaki kurallara uymalıdır:
for,sections,single,mastervebarrieryönergeleri, varsa, bu yönergede mevcut olabilecek herhangi birparallelyan tümcenin değerinden bağımsız olarak dinamik olarak kapsayaniföğesine bağlanır. Şu anda hiçbir paralel bölge yürütülmezse, yönergeler yalnızca ana iş parçacığından oluşan bir ekip tarafından yürütülür.yönergesi
ordereddinamik olarak kapsayanforöğesine bağlanır.yönergesi
atomic, yalnızca geçerli takıma değil tüm iş parçacıklarındaki yönergelereatomicgöre özel erişim uygular.yönergesi
critical, yalnızca geçerli takıma değil tüm iş parçacıklarındaki yönergelerecriticalgöre özel erişim uygular.Bir yönerge hiçbir zaman en yakın dinamik olarak kapsayan dışında herhangi bir yönergeye
parallelbağlanamaz.
2.9 Yönerge iç içe yerleştirme
Yönergelerin dinamik iç içe yerleştirme işlemi aşağıdaki kurallara uymalıdır:
İç
paralleliçe paralellik etkinleştirilmediği sürece, başka birparallelmantıksal ortamda dinamik olarak yönergesi yalnızca geçerli iş parçacığından oluşan yeni bir ekip oluşturur.for,sectionsvesingleyönergelerinin birbirineparallelbağlanmasına izin verilmez.criticalaynı ada sahip yönergelerin iç içe yerleştirilmiş olması yasaktır. Bu kısıtlamanın kilitlenmeyi önlemek için yeterli olmadığını unutmayın.for,sectionsvesingleyönergeleri, , ve bölgeleriyle aynıcriticalbölgelere bağlanıyorsa,ordered, vemasterbölgelerinin dinamik kapsamındaparallelizin verilmez.barrieryönergeleri, ,for, ve bölgelerininorderedsectionsdinamik kapsamında, yönergeler bölgelerle aynısingleşekilde bağlanırsa izin verilmez.mastercriticalparallelmasteryönergeleri, iş paylaşımı yönergeleriyle aynıforşekilde bağlanıyorsasections, ,singlevemasteryönergelerinin dinamik kapsamındaparallelizin verilmez.orderedyönergeleri bölgelerle aynıcriticalşekilde bağlanıyorsa, bölgelerin dinamik kapsamındaparallelizin verilmez.Paralel bölge içinde dinamik olarak yürütürken izin verilen tüm yönergelere paralel bölge dışında yürütürken de izin verilir. Kullanıcı tarafından belirtilen paralel bölge dışında dinamik olarak yürütürken yönergesi yalnızca ana iş parçacığından oluşan bir ekip tarafından yürütülür.