Aracılığıyla paylaş


2. Yönergeler

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, Ek C'deki dil bilgisiyle resmi olarak ve aşağıdaki gibi gayriresmi 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 bir yan tümcede belirirse, 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, yalnızca bir yapılandırılmış blok olan bir sonraki deyim üzerinde 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

madde 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:

  • if tümcesi yok.
  • if ifadesi sıfır olmayan bir değere eşitlenir.

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:

  1. Eğer num_threads yan tümcesi mevcutsa, tamsayı ifadesinin değeri, talep edilen iş parçacığı sayısıdır.

  2. omp_set_num_threads Kütüphane fonksiyonu çağrıldıysa, en son yürütülen çağrıda geçen bağımsız değişkenin değeri, istenen iş parçacığı sayısıdır.

  3. Ortam değişkeni OMP_NUM_THREADS tanımlanmışsa, bu ortam değişkeninin değeri istenen iş parçacığı sayısıdır.

  4. 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, yalnızca uygulandığı paralel bölge için omp_set_num_threads kitaplık işlevi veya OMP_NUM_THREADS ortam değişkeni tarafından istenen iş parçacığı sayısının yerine geçer. 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ı, uygulamaya göre değişir. Oluşturulduktan sonra, ekipteki iş parçacığı 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, varsayılan olarak iç içe geçmiş bir paralel bölge, tek 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ı, uygulamaya göre belirlenir.

yönergesine yönelik parallel kısıtlamalar şunlardır:

  • En fazla bir if yan tümce yönergesinde görünebilir.

  • If ifadesinin veya num_threads ifadesinin içinde herhangi bir yan etki olup olmadığı belirtilmez.

  • Paralel throw bölge içinde yürütülen bir işlem, aynı yapılandırılmış blok içindeki dinamik kapsamda yeniden başlatılmalı ve istisnai durumu oluşturan aynı iş parçacığı tarafından yakalanmalıdır.

  • Yönerge üzerinde yalnızca tek bir num_threads madde görünebilir. İfade num_threads , paralel bölge bağlamının dışında değerlendirilir ve pozitif bir tamsayı değeri olarak değerlendirilmelidir.

  • if ve num_threads yan tümcelerinin değerlendirme sırası belirtilmemiştir.

Çapraz referanslar

  • private, firstprivate, default, shared, copyin ve reduction maddeleri (bölüm 2.7.2)
  • OMP_NUM_THREADS ortam değişkeni
  • omp_set_dynamic kitaplık işlevi
  • OMP_DYNAMIC ortam değişkeni
  • omp_set_nested işlevi
  • OMP_NESTED ortam değişkeni
  • omp_set_num_threads kitaplık işlevi

2.4 İş paylaşımı yapıları

İş paylaşımı konstrüksiyonu, ilişkili deyimin icra edilmesini, 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 girerken zımni bir bariyer 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

İlgili for yönergesi, for döngüsünün yapısına kısıtlamalar getirir. Ö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 boyunca for gizli olarak özel hale getirilir. for deyimi gövdesinde bu değişkeni değiştirmeyin. 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
Döngü değişmez tamsayı ifadeleri. 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 -lb+ incr değeri bu türde gösterilemiyorsa, sonuç belirsizdir. Ayrıca, mantıksal işlem veya ise, artış ifadesi, döngünün her yinelemesinde değişkenin artmasına neden olmalıdır. Mantıksal logical-op> veya >= ise, o zaman incr-expr döngünün her yinelemesinde var'ın küçülmesine neden 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 ve dönüşümlü olarak statik bir şekilde 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 parçalarını çalıştırır ve ardından atanacak parça 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.
yönlendirilmiş schedule(guided, chunk_size) belirtildiğinde, yinelemeler boyutları azalan öbekler halinde iş parçacıklarına atanır. Bir iş parçacığı atanmış yineleme öbeklerini tamamladığında, geriye hiçbiri kalmayana dek kendisine dinamik olarak başka bir yineleme öbeği atanır. chunk_size 1 olduğunda, her öbeğin boyutu, atanmış olmayan yinelemelerin sayısının iş parçacığı sayısına bölünmesi ile yaklaşık olarak hesaplanı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 türü 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. schedule(runtime) belirtildiğinde chunk_size belirtilmemelidir.

Açıkça tanımlanmış bir schedule yan tümce olmadığında, varsayılan schedule uygulamaya bağlı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 tümcesi, yönetmelikler yapıya ordered bağlandığında for mevcut olmalıdır.

Bir nowait koşulu belirtilmediği sürece, bir for yapısının sonunda örtük bir engel vardır.

yönergesine yönelik for kısıtlamalar şunlardır:

  • Döngü for yapısal bir blok olmalı ve buna ek olarak, yürütülmesi bir break ifade ile sonlandırılmamalıdır.

  • Bir for yönergeyle ilişkili döngü denetim ifadelerinin for değerleri takımdaki tüm iş parçacıkları için aynı olmalıdır.

  • Döngü for yineleme değişkeninin imzalı bir tamsayı türü olmalıdır.

  • Yönergede yalnızca bir schedulefor yan tümce görünebilir.

  • Yönergede yalnızca bir orderedfor yan tümce görünebilir.

  • Yönergede yalnızca bir nowaitfor yan 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ım içerisindeki tüm iş parçacıkları için aynı olmalıdır.

Çapraz referanslar

2.4.2 bölüm yapısı

sections yönergesi, bir ekipteki iş parçacıkları arasında bölünecek yapı kümesini belirtir ve yinelenmeyen iş paylaşımı yapısını tanımlar. Her bölüm, takımdaki 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 section yönergesi isteğe bağlı olsa da, her bölüm bir section yönerge ile başlar. section yönergeleri, sections yönergesinin sözcüksel kapsamı içinde yer almalıdır. Bir sections yapısının sonunda, bir nowait belirtilmediği sürece örtük bir engel vardır.

yönergesine yönelik sections kısıtlamalar şunlardır:

  • Yönerge section, yönerge sections'nin sözcük kapsamı dışında görünmemelidir.

  • Yönergede yalnızca bir nowaitsections yan tümce görünebilir.

Çapraz referanslar

  • private, firstprivate, lastprivate ve reduction maddeleri (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

nowait yan tümce belirtilmediği sürece single yapısından sonra örtük bir engel vardır.

yönergesine yönelik single kısıtlamalar şunlardır:

  • Yönergede yalnızca bir nowaitsingle yan tümce görünebilir.
  • copyprivate yan tümcesi, nowait yan tümcesiyle kullanılmamalıdır.

Çapraz referanslar

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:

Yapı için 2.5.1 paralel

parallel for yönergesi, yalnızca tek bir for yönergesi içeren parallel bölgesi 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, yönergenin parallel ve for yönergelerinin, nowait yan tümcesi dışında, aynı anlamlarla ve kısıtlamalarla tüm yan tümcelerine izin verir. Anlambilim, bir parallel yönergesinin hemen ardından bir for yönergesinin açıkça belirtilmesiyle aynıdır.

Çapraz referanslar

2.5.2 paralel kesitler konstrüksiyonu

yönergesiparallel sections, yalnızca tek parallel yönergesi olan bir sections bölge belirtmek için bir kısayol formu sağlar. Anlam bilimi, parallel yönergesi hemen ardından sections yönergesinin 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  ]
   ...
}

tümcenowait tümcesi dışında, parallel ve sections yönergeleri tarafından kabul edilen tümcelerden biri olabilir.

Çapraz referanslar

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

Takımdaki diğer iş parçacıkları, ilgili 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 kurgusu

Yönerge, critical ile ilişkili yapılandırılmış bloğun yürütülmesini bir seferde yalnızca bir iş parçacığına sınırlayan 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, harici bağlantıya sahiptir ve etiketler, işaretçiler, ü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. Bütün adlandırılmamış critical yönergeler aynı belirtilmemiş ada eşlenir.

2.6.3 bariyer yönergesi

barrier komutu, bir ekibin tüm iş parçacıklarını senkronize eder. 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önergelerini aynı benzersiz isime sahip critical yönergelerle değiştirip değiştirmeyeceği uygulama tarafından tanımlanmış olsa da, atomic yönergesi daha iyi optimizasyona 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ükleme ve depolama işlemleri atomiktir; expr ifadesinin 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 listesindeki bir işaretçi varsa, işaretçinin kendisi temizlenir, işaretçinin başvurduğu nesne değil.

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, flush değişken listesi içeren bir 'den daha fazla ek yüke sahip olabilir.) Aşağıdaki yönergeler için, flush değişken listesi içermeyen bir 'nin ima edildiği varsayılır:

  • barrier
  • Giriş ve çıkış sırasında critical
  • Girişte ve çıkışta ordered
  • Girişte ve çıkışta parallel
  • Çıkışta for
  • Çıkışta sections
  • Çıkış noktasında single
  • Girişte ve çıkışta parallel for
  • Girişte ve çıkışta parallel sections

Bir nowait yan tümcesi varsa, yönerge belirtilmez. flush direktifinin aşağıdakilerden hiçbiri için öngörülmediğ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:

  • Bir flush yönergesinde belirtilen değ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 veya parallel for yönergesinin bağlandığı ordered yapısı, bölüm 2.4.1'de açıklandığı gibi bir ordered yan tümcesine sahip olmalıdır. Bir for veya parallel for yapısının ordered yan tümcesiyle çalıştırılmasında, ordered yapılar kesinlikle döngünün sırayla yürütüldüğü biçimde çalıştırılır.

yönergesine yönelik ordered kısıtlamalar şunlardır:

  • Bir yapıya sahip for bir döngü yinelemesi aynı sıralı yönergeyi birden çok kez yürütmemeli ve birden ordered fazla 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:

  • Bir threadprivate yönergesi, dosya kapsamı, ad alanı kapsamı veya statik blok kapsamı değişkenlerini bir iş parçacığına yerel hale getirmek için 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, bir iş parçacığı, başka bir iş parçacığının threadprivate nesne kopyasına başvurmamalıdır. Programın seri bölümleri ve ana bölgeleri sırasında, başvurular ana iş parçacığının nesne üzerindeki 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:

  • threadprivate Dosya 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 threadprivate yönergesinde belirtilen değişken listesindeki her değişken, bu yönergenin öncesinde dosya veya ad alanı kapsamındaki bir değişken bildirimine atıfta bulunmalıdır.

  • threadprivate Statik blok kapsamı değişkenleri için bir talimat, iç içe yerleştirilmiş bir kapsamda değil, değişkenin kendi kapsamında yer almalıdır. Yönerge, listesindeki tüm değişkenlere yapılan başvurulardan önce sözcükte yer almalı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 threadprivate yönergede belirtilirse, içinde bildirildiği her çeviri birimindeki bir threadprivate yönergede belirtilmelidir.

  • Değişken threadprivate, copyin, copyprivate, schedule, num_threads veya if yan tümcelerinden başka hiçbir yan tümcede görünmemelidir.

  • Değişkenin threadprivate adresi bir adres sabiti değildir.

  • Değişkenin threadprivate tamamlanmamış bir türü veya referans tipi olmamalıdır.

  • threadprivate POD olmayan sınıf türüne sahip bir değişken, açık bir başlatıcıyla bildirildiyse erişilebilir, belirsiz olmayan 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 referanslar

2.7.2 Veri paylaşımı öznitelik klausulleri

Ç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. Paylaşım öznitelik yan tümceleri yalnızca yan tümcenin göründüğü talimatın leksikal 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ümce listesi, ilgili yönergeyle birlikte 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++'da malloc() kullanarak veya C++'da new işleci kullanarak) 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.

İfadelerin çoğu, görünür olan değişkenlerin virgülle ayrılmış bir listesi olan değişken-listesi argümanını 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 firstprivate ve lastprivate yan tümcelerinde belirtilmesi dışında, bir değişken birden fazla yan tümcede belirtilemez.

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. private ifadesinin 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özdizimsel kapsamı içinde, değişken, iş parçacığı tarafından ayrılan yeni bir ö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 private değişkenin erişilebilir, açık bir varsayılan oluşturucuya sahip olması gerekir.

  • private yan tümcesinde belirtilen bir değişken, yalnızca mutable üyesine sahip bir sınıf türü değilse, const-tarafından nitelendirilmiş bir türe sahip olmamalıdır.

  • Bir private tümcesinde belirtilen bir değişkenin eksik bir türü veya başvuru türü olmamalıdır.

  • Bir reduction yönergenin parallel yan tümcesinde görünen değişkenler, paralel yapıya bağlanan bir private iş paylaşımı yönergesindeki bir yan tümcede belirtilemiyor.

2.7.2.2 firstprivate

firstprivate yan tümcesi, private yan tümcesinin sağladığı işlevselliğin üst kümesini sağlar. firstprivate cümlesinin 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 private yan tümcesi semantiği vardır. Başlatma veya yapı oluşturma, iş parçacığının yapıyı yürütmesinden önce, her iş parçacığı için bir kez yapılmış gibi gerçekleşir. Paralel yapıdaki bir firstprivate koşul için, yeni özel nesnenin ilk değeri, onu karşılayan iş parçacığının paralel yapı ile karşılaşmasından hemen önce mevcut 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ığına ait yeni özel nesne, özgün nesneden kopya edilerek oluşturulur.

yan tümcesine yönelik firstprivate kısıtlamalar aşağıdaki gibidir:

  • firstprivate yan tümcesinde belirtilen bir değişkenin eksik bir türü veya bir başvuru türü olmamalıdır.

  • Olarak firstprivate belirtilen 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 reduction yönergenin parallel yan tümcesinde görünen değişkenler, paralel yapıya bağlanan bir firstprivate iş paylaşımı yönergesindeki yan tümcesinde belirtilemiyor.

2.7.2.3 lastprivate

lastprivate maddesi, private maddesi tarafından sağlanan işlevselliğin üst kümesini sunar. Şart cümlesinin lastprivate söz dizimi aşağıdaki gibidir:

lastprivate(variable-list)

variable-list içinde belirtilen değişkenlerin private yan tümce 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. Son yinelemede for veya parallel for tarafından ya da sections veya parallel sections yönergesinin sözcüksel olarak son bölümünde bir değer atanmamış olan 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:

  • Tüm kısıtlamalar private için geçerlidir.

  • Olarak lastprivate belirtilen 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 reduction yönergenin parallel yan tümcesinde görünen değişkenler, paralel yapıya bağlanan bir lastprivate iş 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 listesindeki değişkenleri paylaşır. Bir ekip içindeki tüm iş parçacıkları, shared değişkenleri için aynı depolama alanına erişir.

shared ifadesinin 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. Koşul ifadesinin default söz dizimi aşağıdaki gibidir:

default(shared | none)

default(shared) belirtme, threadprivate veya const niteliği taşımadığı sürece, şu anda görünen her değişkenin bir shared yan tümcede açıkça listelenmesiyle eşdeğerdir. Açık bir default maddesi yoksa, varsayılan davranış default(shared) belirtilmiş gibi olur.

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 const-nitelikli bir türü vardır.

  • Değişken, for veya parallel for yönergesini hemen izleyen for döngüsünün döngü denetim değişkenidir ve değişken referansı 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, operatör op ile değişken listesinde görünen skaler değişkenlerde bir indirgeme gerçekleştirir. Koşul ifadesinin 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

nerede:

x
Listede belirtilen azaltma değişkenlerinden biri.

değişken listesi
Skaler azaltma değişkenlerinin virgülle ayrılmış listesi.

ifade
Skaler türe sahip, x'e başvurmayan bir ifade.

op
Aşırı yüklenmiş bir işleç değil, +, *, -, &, ^, |, && veya ||.

binop
Aşırı yüklenmiş bir işleç değil, ama +, *, -, &, ^ veya |.

Aşağıdaki reduction ifadesinin 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ı, reduction yan tümcesinde belirtilen işlecin azaltma işlemiyle uyumlu olmasına 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.

private yan tümcesi kullanılmış gibi, değişken listesindeki her değişkenin özel bir kopyası, her bir iş parçacığı için oluşturulur. Özel kopya operatöre göre başlatılır (aşağıdaki tabloya bakın).

Belirtilen yan tümce için reduction belirtildiği bölgenin sonunda, özgün nesne belirtilen operatörü kullanarak özel kopyaların her birinin son değeriyle özgün değerini birleştirmenin sonucunu yansıtacak şekilde güncellenir. Azaltma işleçlerinin tümü ilişkilendirilebilir (çıkarma hariç) ve derleyici son değerin hesaplamasını serbestçe yeniden ilişkilendirebilir. (Çıkarma işleminin azaltılmasının kısmi sonuçları, nihai değerin elde edilmesi için toplanır.)

İlk iş parçacığı içeren yan tümcesine ulaştığında, özgün nesnenin değeri belirsiz hale gelir ve bu durum, indirgeme hesaplaması tamamlanana kadar böyle kalır. Normalde hesaplama, yapının sonunda tamamlanır; ancak reduction yan tümcesiyle birlikte nowait yapıya uygulanmışsa, tüm iş parçacıklarının reduction yan tümcesini tamamladığından emin olmak için bir engel senkronizasyonu gerçekleştirilene kadar orijinal nesnenin 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 Aşaması
+ 0
* 1
- 0
& ~0
| 0
^ 0
&& 1
|| 0

yan tümcesine yönelik reduction kısıtlamalar aşağıdaki gibidir:

  • reduction cümledeki değişken türleri, işaretçi türleri ve başvuru türleri hariç, azaltma operatörü için geçerli olmalıdır.

  • reduction yan cümlede belirtilen bir değişkenin const nitelikli olmaması gerekir.

  • Paralel bölge içinde özel olan veya bir reduction yönergenin parallel yan tümcesinde görünen değişkenler, paralel yapıya bağlanan bir reduction iş 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. Koşul ifadesinin copyin söz dizimi aşağıdaki gibidir:

copyin(
variable-list
)

yan tümcesine yönelik copyin kısıtlamalar aşağıdaki gibidir:

  • copyin yan tümcesinde belirtilen bir değişken, erişilebilir ve belirli bir kopya atama işlemcisine sahip olmalıdır.

  • copyin koşulunda belirtilen bir değişken, bir threadprivate değ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. Değer için paylaşılan bir değişken sağlamanın zor olduğu durumlarda, paylaşılan değişken kullanımı yerine bir alternatif sunar (örneğin, her seviyede farklı bir değişken gerektiren bir özyineleme). copyprivate yan tümcesi yalnızca single yönerge üzerinde görünebilir.

Koşul ifadesinin copyprivate söz dizimi aşağıdaki gibidir:

copyprivate(
variable-list
)

Değişken listesindeki copyprivate yan tümcesinin değişkenler üzerindeki etkisi, single ile ilişkili yapılandırılmış bloğun yürütülmesinden sonra ve takımdaki herhangi bir iş parçacığı yapının sonundaki senkronizasyon engelini terk etmeden önce gerçekleşir. Ardından, ekipteki diğer tüm iş parçacıklarında, değişken listesindeki her bir değişken için, bu değişken, yapıyı çalıştıran iş parçacığındaki yapılandırılmış bloğun karşılık gelen değişkeninin değeri ile (bir atama yapmışçasına) tanımlanır.

yan tümcesine yönelik copyprivate kısıtlamalar şunlardır:

  • Aynı single yönergesi için belirtilen bir değişken, copyprivate tümcesinde belirtilmişse, private veya firstprivate yan tümcelerinde görünmemelidir.

  • Paralel bir bölgenin dinamik kapsamı içinde yan tümceye sahip bir singlecopyprivate yönergesiyle karşılaşılıyorsa, copyprivate yan tümcesinde belirtilen tüm değişkenlerin kapsayan bağlamda özel olması gerekir.

  • Yan tümcesinde belirtilen bir değişkenin erişilebilir bir kopya atama işleci olmalıdır ve bu işleç belirsiz olmamalıdır.

2.8 Yönerge bağlama

Yönergelerin dinamik bağlaması aşağıdaki kurallara uymalıdır:

  • for, sections, single, master ve barrier yönergeleri, varsa, dinamik olarak kapsayan parallel'e, o yönergede mevcut olabilecek herhangi bir if yan tümcesinin değerinden bağımsız olarak 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 ordered, dinamik olarak kapsayıcı for ile bağlanır.

  • atomic yönergesi, yalnızca geçerli takımla sınırlı kalmayıp tüm iş parçacıklarındaki atomic yönergelerine karşı özel erişim hakkını uygular.

  • critical yönergesi, yalnızca geçerli takıma değil, tüm iş parçacıklarındaki critical yönergelerine göre özel erişimi zorunlu kılar.

  • Bir yönerge, en yakın dinamik olarak kapsayan parallel dışında hiçbir yönergeye bağlanamaz.

2.9 Yönerge iç içe geçirme

Yönergelerin dinamik iç içe yerleştirme işlemi aşağıdaki kurallara uymalıdır:

  • İç içe paralellik etkinleştirilmediği sürece, bir başka parallel içindeki parallel yönerge, yalnızca geçerli iş parçacığından oluşan yeni bir ekip kurar.

  • for, sections ve single yönergelerinin aynı parallel'e bağlanırken birbirinin içine yerleştirilmesine izin verilmez.

  • critical aynı adı taşıyan yönergelerin birbirinin içine yerleştirilmesi yasaktır. Bu kısıtlamanın kilitlenmeyi önlemek için yeterli olmadığını unutmayın.

  • for, sections ve single yönergeleri, critical bölgelerle aynı bölgelere bağlanıyorsa, ordered ve master bölgelerinin dinamik kapsamında parallel izin verilmez.

  • barrier yönergelerine, for, ordered, sections, single, master, ve critical bölgelerinin dinamik kapsamı içinde, eğer yönergeler bölgelerle aynı parallel ile bağlanıyorsa izin verilmez.

  • master yönergelerine, for, sections ve single yönergelerinin dinamik kapsamı içinde, ve bu yönergeler iş paylaşımı yönergeleriyle aynı master ile bağlanıyorsa, parallel izin verilmez.

  • ordered yönergeleri, eğer aynı parallel ile bölgelere bağlanıyorsa, critical bölgelerin dinamik kapsamı içinde izin 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ının belirttiği paralel bölge dışında dinamik olarak çalıştırıldığında, yönerge yalnızca ana iş parçacığının yer aldığı bir ekip tarafından yürütülür.