1. Giriş
Bu belge, C ve C++ programlarında paylaşılan bellek paralelliğini belirtmek için kullanabileceğiniz derleyici yönergeleri, kitaplık işlevleri ve ortam değişkenlerinden oluşan bir koleksiyonu belirtir. Bu belgede açıklanan işlevsellik, topluca OpenMP C/C++ Uygulama Programı Arabirimi (API) olarak bilinir. Bu belirtimin amacı, bir programın farklı satıcıların paylaşılan bellek mimarileri arasında taşınabilir olmasını sağlayan paralel programlama modeli sağlamaktır. Birçok satıcının derleyicileri OpenMP C/C++ API'sini destekler. OpenMP Fortran Uygulama Programı Arabirimi de dahil olmak üzere OpenMP hakkında daha fazla bilgiyi aşağıdaki web sitesinde bulabilirsiniz:
Bu belgede tanımlanan yönergeler, kitaplık işlevleri ve ortam değişkenleri, taşınabilirliğe izin verirken paralel programlar oluşturmanıza ve yönetmenize olanak tanır. Yönergeleri, C ve C++ sıralı programlama modelini tek program birden çok veri (SPMD) yapısı, iş paylaşımı yapısı ve eşitleme yapısıyla genişletir. Ayrıca verilerin paylaşılması ve özelleştirilmesi de desteklenir. OpenMP C ve C++ API'sini destekleyen derleyiciler, derleyiciye tüm OpenMP derleyici yönergelerini etkinleştiren ve yorumlamaya izin veren bir komut satırı seçeneği içerir.
1.1 Kapsam
Bu belirtim yalnızca kullanıcı tarafından yönlendirilen paralelleştirmeyi kapsar; burada derleyicinin ve çalışma zamanı sisteminin programı paralel olarak yürütmek için hangi eylemleri gerçekleştireceği açıkça tanımlarsınız. Bağımlılıkları, çakışmaları, kilitlenmeleri, yarış koşullarını veya yanlış program yürütülmesine neden olan diğer sorunları denetlemek için OpenMP C ve C++ uygulamaları gerekmez. OpenMP C ve C++ API yapılarını kullanan uygulamanın doğru şekilde yürütülmesini sağlamak sizin sorumluluğundadır. Derleyici tarafından oluşturulan otomatik paralelleştirme ve bu tür paralelleştirmeye yardımcı olmak için derleyiciye yönelik yönergeler bu belgede ele alınmıyor.
1.2 Terimlerin tanımı
Bu belgede aşağıdaki terimler kullanılır:
barrier
Takımdaki tüm iş parçacıklarının ulaşması gereken eşitleme noktası. Her iş parçacığı, ekipteki tüm iş parçacıklarının bu noktaya gelmesini bekler. Yönergeler tarafından tanımlanan açık engeller ve uygulama tarafından oluşturulan örtük engeller vardır.
yapmak
Yapı bir deyimdir. Bir yönergeden ve ardından yapılandırılmış bir blokdan oluşur. Bazı yönergeler bir yapıya ait değildir. (Bkz. ek C'de openmp-yönergesi).
Yönergesi
C veya C++
#pragma
ve ardındanomp
tanımlayıcı, diğer metin ve yeni bir satır. yönergesi program davranışını belirtir.dinamik kapsam
Sözcük temelli ölçüdeki tüm deyimlerin yanı sıra deyimlerin sözcük temelli kapsam içinde yürütülmesi sonucu yürütülen bir işlev içindeki deyimler. Dinamik kapsam, bölge olarak da adlandırılır.
sözcük temelli kapsam
Deyimler, yapılandırılmış bir blok içinde sözcük temelli olarak tutulur.
ana iş parçacığı
Paralel bölgeye girildiğinde ekip oluşturan iş parçacığı.
paralel bölge
OpenMP paralel yapısına bağlanan ve birçok iş parçacığı tarafından yürütülebilen deyimler.
private
Özel değişken, başvuruyu yapan iş parçacığına özgü bir depolama bloğunu adlandırıyor. Bir değişkenin özel olduğunu belirtmenin birkaç yolu vardır: paralel bölge içindeki bir tanım, bir yönerge, bir
threadprivate
, , veya yan tümcesi veya değişkenin bir veyaparallel for
yönergesinin hemen ardındanfor
döngüfor
denetim değişkeni olarakfor
kullanılması.reduction
lastprivate
firstprivate
private
region
Dinamik bir kapsam.
seri bölge
Herhangi bir paralel bölgenin dinamik kapsamı dışında yalnızca ana iş parçacığı tarafından yürütülen deyimler.
seri hale getirme
Ile paralel bir yapı yürütmek için:
Yalnızca tek bir iş parçacığından (bu paralel yapı için ana iş parçacığı) oluşan iş parçacıklarından oluşan bir ekip,
yapılandırılmış blok içindeki deyimler için yürütme seri sırası (blok paralel bir yapının parçası değil gibi aynı sıra) ve
tarafından
omp_in_parallel()
döndürülen değer üzerinde hiçbir etkisi yoktur (iç içe paralel yapıların etkileri dışında).
shared
Paylaşılan değişken, tek bir depolama bloğunu adlandıran bir değişkendir. Bir ekipteki bu değişkene erişen tüm iş parçacıkları da bu tek depolama bloğuna erişmektedir.
yapılandırılmış blok
Yapılandırılmış blok, tek girişi ve tek çıkışı olan bir deyimdir (tek veya bileşik). Bir deyiminin içine veya dışına atlama varsa, bu deyim yapılandırılmış bir blok olur. (Bu kural,
longjmp
(3C) veya kullanımınathrow
izin verilse deexit
.) Yürütmesi her zaman açılışta{
başlar ve her zaman kapanışta}
biterse, bileşik deyim yapılandırılmış bir blok olur. İfade deyimi, seçim deyimi, yineleme deyimi veyatry
blok, buna karşılık gelen bileşik deyim içine{
}
alınıp yapılandırılmış bir blok olacaksa yapılandırılmış bir blok olur. Atlama deyimi, etiketli deyim veya bildirim deyimi yapılandırılmış bir blok değildir.takım
Bir yapının yürütülmesinde işbirliği yapan bir veya daha fazla iş parçacığı.
thread
Seri denetim akışına, bir dizi özel değişkene ve paylaşılan değişkenlere erişime sahip bir yürütme varlığı.
değişken
İsteğe bağlı olarak ad alanı adlarının nitelediği ve bir nesneyi adlandıran bir tanımlayıcı.
1.3 Yürütme modeli
OpenMP, paralel yürütmenin çatal birleştirme modelini kullanır. Bu çatal birleştirme modeli çeşitli sorunları çözmek için yararlı olsa da, büyük dizi tabanlı uygulamalar için uyarlanmıştır. OpenMP, hem paralel programlar (birçok yürütme iş parçacığı hem de tam openMP destek kitaplığı) olarak doğru şekilde yürütülen programları desteklemeye yöneliktir. Ayrıca sıralı programlar olarak doğru şekilde yürütülen programlar (yoksayılan yönergeler ve basit bir OpenMP saplama kitaplığı) içindir. Ancak, sıralı olarak yürütülürken doğru şekilde davranmayan bir program geliştirmek mümkündür ve izin verilir. Ayrıca, farklı paralellik dereceleri, sayısal işlemlerin ilişkisindeki değişiklikler nedeniyle farklı sayısal sonuçlara neden olabilir. Örneğin, seri ekleme azaltması, paralel azaltmadan farklı bir toplama ilişkisi desenine sahip olabilir. Bu farklı ilişkilendirmeler kayan nokta eklemenin sonuçlarını değiştirebilir.
OpenMP C/C++ API'si ile yazılmış bir program, ana iş parçacığı adı verilen tek bir yürütme iş parçacığı olarak yürütülmeye başlar. İlk paralel yapıyla karşılaşılana kadar ana iş parçacığı seri bölgede yürütülür. OpenMP C/C++ API'sinde parallel
yönergesi paralel bir yapı oluşturur. Paralel bir yapıyla karşılaşıldığında, ana iş parçacığı bir iş parçacığı ekibi oluşturur ve ana iş parçacığı ekibin yöneticisi olur. Ekipteki her iş parçacığı, iş paylaşımı yapıları dışında deyimleri paralel bir bölgenin dinamik kapsamında yürütür. Ekipteki tüm iş parçacıkları aynı sırada iş paylaşımı yapılarıyla karşılaşmalıdır ve bir veya daha fazla iş parçacığı ilişkili yapılandırılmış blok içinde deyimleri yürütür. Yan tümcesi olmayan nowait
bir iş paylaşımı yapısının sonunda ima edilen engel, ekipteki tüm iş parçacıkları tarafından yürütülür.
İş parçacığı paylaşılan bir nesneyi değiştirirse, yalnızca kendi yürütme ortamını değil, aynı zamanda programdaki diğer iş parçacıklarını da etkiler. Değişikliğin, başka bir iş parçacığının bakış açısından, bir sonraki sıra noktasında (temel dilde tanımlandığı gibi) ancak nesne geçici olarak bildirilirse tamamlanması garanti edilir. Aksi takdirde, değişikliğin ilk değiştirme iş parçacığından sonra tamamlanması garanti edilir. Diğer iş parçacıkları daha sonra (veya eşzamanlı olarak) nesnesini belirten bir flush
yönerge görür (örtük veya açıkça). flush
Diğer OpenMP yönergeleri tarafından ima edilen yönergeler yan etkilerin doğru sıralamasını garanti etmediğinde, ek ve açık flush
yönergeler sağlamak programcının sorumluluğundadır.
Paralel yapı tamamlandıktan sonra, takımdaki iş parçacıkları örtük bir engelde eşitlenir ve yalnızca ana iş parçacığı yürütülmeye devam eder. Tek bir programda herhangi bir sayıda paralel yapı belirtilebilir. Sonuç olarak, bir program yürütme sırasında birçok kez çatal yapabilir ve birleşebilir.
OpenMP C/C++ API'si, programcıların paralel yapıların içinden çağrılan işlevlerde yönergeleri kullanmasına olanak tanır. Paralel bir yapı sözcük biçiminde görünmeyen ancak dinamik uzantıda yer alan yönergeler yalnız bırakılmış yönergeler olarak adlandırılır. Yalnız bırakılmış yönergelerle, programcılar programlarının büyük bölümlerini paralel olarak yürütebilir ve sıralı programda yalnızca en az değişiklik yapılabilir. Bu işlevsellikle, program çağrı ağacının en üst düzeylerinde paralel yapıları kodlayabilir ve çağrılan işlevlerin herhangi birinde yürütmeyi denetlemek için yönergeleri kullanabilirsiniz.
Aynı dosyaya yazan C ve C++ çıkış işlevlerine yapılan zaman uyumsuz çağrılar, farklı iş parçacıkları tarafından yazılan verilerin belirsiz bir sırada görünme çıkışına neden olabilir. Benzer şekilde, aynı dosyadan okunan giriş işlevlerine yapılan zaman uyumsuz çağrılar da verileri belirsiz bir sırada okuyabilir. Her iş parçacığının farklı bir dosyaya erişmesi için G/Ç'nin zaman uyumsuz kullanımı, G/Ç işlevlerinin seri yürütülmesiyle aynı sonuçları üretir.
1.4 Uyumluluk
OpenMP C/C++ API'sinin bir uygulaması, Bölüm 1, 2, 3, 4 ve Ek C'de gösterildiği gibi bu belirtimdeki tüm öğelerin semantiğini tanır ve korursa OpenMP uyumlu olur. A, B, D, E ve F ekleri yalnızca bilgi amaçlıdır ve belirtim kapsamında değildir. API'nin yalnızca bir alt kümesini içeren uygulamalar OpenMP uyumlu değildir.
OpenMP C ve C++ API'si, bir uygulama tarafından desteklenen temel dilin uzantısıdır. Temel dil bu belgede görünen bir dil yapısını veya uzantısını desteklemiyorsa, bunu desteklemek için OpenMP uygulaması gerekmez.
Tüm standart C ve C++ kitaplık işlevleri ve yerleşik işlevler (derleyicinin belirli bilgilere sahip olduğu işlevler) iş parçacığı açısından güvenli olmalıdır. Paralel bölge içindeki farklı iş parçacıkları tarafından iş parçacığı güvenli işlevlerin eşitlenmemiş kullanımı tanımlanmamış davranış üretmez. Ancak, davranış bir seri bölgedekiyle aynı olmayabilir. (Rastgele sayı oluşturma işlevi bir örnektir.)
OpenMP C/C++ API'si, belirli davranışların uygulama tanımlı olduğunu belirtir. Bu durumlarda davranışını tanımlamak ve belgelemek için uyumlu bir OpenMP uygulaması gerekir. Uygulama tanımlı davranışların listesi için bkz . ek E.
1.5 Normatif başvurular
ISO/IEC 9899:1999, Bilgi Teknolojisi - Programlama Dilleri - C. Bu OpenMP API belirtimi, C99 olarak ISO/IEC 9899:1999'a başvurur.
ISO/IEC 9899:1990, Bilgi Teknolojisi - Programlama Dilleri - C. Bu OpenMP API belirtimi, ISO/IEC 9899:1990'ı C90 olarak ifade eder.
ISO/IEC 14882:1998, Bilgi Teknolojisi - Programlama Dilleri - C++. Bu OpenMP API belirtimi, ISO/IEC 14882:1998'i C++ olarak ifade eder.
Bu OpenMP API belirtimi C'ye başvuruda bulunduğunda, uygulama tarafından desteklenen temel dile başvuru yapılır.