OpenMP; Solaris, IBM AIX, HP-UX, (GNU/Linux), MAC OS X ve Windows işletim sistemleri üzerinde çoğu işlemci mimarisi üzerinde Fortran, , C programlama dillerinde çoklu platform paylaşımlı bellek çoklu işlemeyi destekleyen bir uygulama geliştirme arayüzüdür, yani bir API'dir. OpenMP derleyici yönergelerinin kütüphane rutinlerini ve ortam değişkenlerinin çalışma zamanı davranışını etkileyen bir kümesini içerir.
Geliştirici(ler) | OpenMP Architecture Review Board |
---|---|
Güncel sürüm | 3.1 / 9 Temmuz 2011 | )
Programlama dili | C, , Fortran |
İşletim sistemi | Çapraz platform yazılımları |
Platform | Çapraz platform yazılımları |
Tür | UPA |
Lisans | Various |
Resmî sitesi | openmp.org |
OpenMP kâr amacı gütmeyen, OpenMp Archtecture Review Board (OpenMP ARB) isimli uluslararası bir birlik tarafından yönetilir. Bu birliğin çoğunluğu yazılım satıcıları AMD, IBM, Intel, Cray, HP, Fujitsu, Nvidia, NEC, Microsoft, Texas Intstruments, Oracle Corporation şirketlerinden ve bilgisayar donanım grupları tarafından oluşur.
OpenMP standart masaüstü bilgisayarlarda süper bilgisayarlara varana kadar paralel uygulamaları geliştirmek için programcılara basit ve uygun bir arayüz veren ölçeklenebilir ve taşınabilir bir model kullanır.
Paralel programlamanın melez bir modeliyle oluşturulmuş bir uygulama hem OpenMP hem de MPI kullanarak bir bilgisayar üzerinde çalışabilir ya da paylaşımsız bellek sistemleri için OpenMP'nin gelişmiş sürümlerini kullanarak kullanıcıdan daha da bağımsız çalışabilir.
Giriş
OpenMP çoklu iş parçacığı gerçekleştirimidir. Çoklu iş parçacığı ana iş parçacığının (sırasıyla yürütülen komutların bir dizisi) belirli bir sayıda yardımcı iş parçacıklarını durdurması ve bir görev onlar arasında paylaştırması olan paralelleştirme metodudur. İş parçacıkları birbiri ardında paralel şekilde çalışırlar. Farklı işlemcilerin iş parçacıkları farklı çalışma zamanı ortamlarını kendilerine tahsis ederler.
Paralel çalışacak olan kodun bir bölümü sırasıyla işaretlenir. Bu işaretleme kod bölümünün yürütülmesinden önce iş parçacıklarının o kod bölümüne girmelerine sebep olacak ön işlemci direktifleridir. Her bir iş parçacığı onlara bağlı bir ID'ye sahiptir. omp_get_thread_num() fonksiyonu ile bu ID elde edilir.İş parçacığı ID'si bir tam sayıdır ve ana iş parçacığının ID'si sıfırdır. Paralelleştirilmiş kodun yürütülmesinden sonra iş parçacıkları ana iş parçacığına tekrar geri katılırlar. Programın sonuna kadar bu böyle devam eder.
Varsayılan olarak her bir iş parçacığı kodun paralelleştirilmiş bölümünü birbirinden bağımsız şekilde yürütür. İş paylaşımı yapıları iş parçacıkları arasında bir görevi paylaştırmak için kullanılabilir, böylece her bir iş parçacığı kodun kendisine ayrılan bölümünde çalışır. Hem görev paralelleştirme hem de veri paralelleştirme OpenMP kullanarak bu yöntemle yapılır.
Çalışma zamanı ortamı kullanıma bağlı olarak işlemcilere iş parçacığı tahsis eder, makine yükleme ve diğer faktörler gibi. İş parçacıklarının sayısı ortam değişkenleri veya kod içerisinde kullanılan fonksiyonlara bağlı olarak çalışma zamanı ortamı tarafından atanır. OpenMP fonksiyonları omp.h etiketli C/C++ header dosyaları ile programa dahil edilir.
Tarihçe
OpenMP ARB ilk arayüz programını Fortran 1.0 için Ekim 1997 OpenMP ile yayınladı. Bir sonraki yıl C/C++ standartını piyasaya sürdüler. Fortran ve C/C++ 2.0 versiyonları ile birlikte 2002 yılında piyasaya sürüldü. 2.5 versiyonu C/C++ Fortranın bir kombinasyonu olarak 2005 yılında piyasaya sürüldü.
Mayıs 2008'de 3.0 versiyonu piyasaya sürüldü. Yeni özellikler görevler ve görev yapıları kavramları versiyonu 3.0'a dahil edildi.
Versiyon 3.1 9 Temmuz 2011'de piyasaya sürüldü.
Versiyon 4.0'ın 2013 Haziran veya Temmuz aylarında sunulması bekleniyor. Aşağıdaki özellikleri geliştirmiş ve kendisine eklemiştir. Hızlandırıcılar içi destek, atomikler, hata yönetimi, iş parçacığı (thread) ilişkisi, görev geliştirimi, kullanıcı tanımlı arttırma, SIMD desteği, Fortran 2003 desteği.
Temel elemanlar
OpenMP temel elemanları iş parçacığı oluşturma iş yükü dağıtımı (iş paylaşımı), veri ortam yönetimi, iş parçacığı senkronizasyonu, kullanıcı seviyeli çalışma zamanı rutinleri ve ortam değişkenleri için yapılardır.
C/C++' ta OpenMP #pragma etiketi kullanılır. OpenMP özel pragmalar aşağıda listelenmiştir.
İş Parçacığı Oluşturma
omp parallel pragma paralelleştirilmiş yapı içerisinde kapanmış işi gerçekleştirmek için ek iş parçacıklarını çapraz dağıtmak için kullanılır. Orijinal iş parçacığı ID=0 olan ana iş parçacığı olarak gösterilir.
Örnek (C program): Çoklu iş parçacığı kullanarak "Merhaba Dünya" yazdırmak.
#include <stdio.h> int main(void) { #pragma omp parallel printf("Merhaba, dünya.\n"); return 0; }
GCC kullanarak derlemek için -fopenmp bayrağı kullanılır:
$gcc -fopenmp merhaba.c -o merhaba
' iş parçacıklı ve 2 çekirdekli bilgisayar üzerindeki çıktı.
Merhaba, dünya. Merhaba, dünya.
Bununla birlikte çıktı yarış durumları sebebiyle 2 iş parçacığının standart çıktıyı paylaşmasından dolayı bozulmuş bir şekilde alınabilir.
Merhaba, düMerha, düünya nya.
İş Paylaşma Yapıları
İş parçacıklarının birinin veya tamamına birbirinden bağımsız iş atamak için aşağıdakiler kullanılır.
- omp for veya omp do: iş parçacıkları arasında döngü iterasyonlarını paylaştırmak için kullanılır.Döngü yapıları olarak da adlandırılır.
- sections: sıralı atama yapılır fakat farklı iş parçacıklarına bağımsız kod blokları atanır
- single: sadece bir iş parçacığının yürüttüğü bir kod bloğu belirlenir, programın sonunda bir bitiş yeri gösterir
- master: single gibidir, ama kod bloğu ana iş parçacığı tarafından yürütülür ve program sonunda bir bitiş yeri gösterilmez.
Örnek: paralel olarak büyük bir diziye iş parçacıkları kullanarak ilk değerleri vermek
int main(int argc, char *argv[]) { const int N = 100000; int i, a[N]; #pragma omp parallel for for (i = 0; i < N; i++) a[i] = 2 * i; return 0; }
OpenMP Cümlecikleri
OpenMP paylaşımlı bellek programlama modeli olduğu için OpenMP kodu içerisindeki çoğu değişken varsayılan olarak tüm iş parçacıklarına görünür, ama bazen özel değişkenlerin yarış durumlarından kaçınması gereklidir ve seri bölge ile paralel bölge arasındaki değerlerin işlenebilmesi için veri ortam yönetimi veri paylaşım özellik cümlecikleri olarak tanıtılmıştır. Bu cümlecikler OpenMP direktiflerine eklenir
Veri paylaşımı özelliği cümlecikleri
- shared: paralel bölge ile birlikte veri paylaşılır. Paylaşımın anlamı tüm iş parçacıkları tarafından erişilebilir ve görülebilirdir. Varsayılan olarak iş paylaşım bölgesindeki tüm değişkenlerin döngü iterasyon sayacı dışında hepsi paylaşılır
- private: paralel bölge ile birlikte veri her bir iş parçacığına özeldir. Bunun anlamı her bir iş parçacığının yerel bir kopyaya sahip olacağı ve o değişkeni geçici olarak kullanacağıdır. Bir özel değişken ilklendirilmez ve değeri paralel bölge dışında kullanılmaz. Varsayılan olarak döngü iterasyon sayacı özeldir.
- default: programcıya Fortran için none, C/C++ için none,firstprivate, private, shared paralel bölgeleri için veri alanına müdahale etmesine izin verir. none seçeneği programcının veri paylaşımlı özellik cümleciğini kullanarak paralel bölge içerisindeki her bir değişkeni tanımlamasına zorlar.
- firstprivate: orijinal değeri ilklendirme haricindeprivate gibidir. .
- lastprivate: yapıdan sonra güncellenen orijinal değer haricinde private gibidir.
- reduction: yapıdan sonra tüm iş parçacıklarının işe katılmasının güvenli bir yöntemidir.
Senkronizasyon cümlecikleri
- critical: seçili kod bloğu bir kerede sadece bir iş parçacığı tarafından yürütülecektir ve çoklu iş parçacıkları tarafından eş zamanlı yürütlmez. Bu genelde yarış durumlarından veri paylaşımını korumak için kullanılır
- atomic: Bellek güncellenmesi otomatik olarak işletilir. Tüm ifadeyi atomic yapmaz, sadece bellek güncellenmesi atomiktir. Bir derleyici daha iyi performans için critical kullanmak yerine özel bir donanım komutu kullanabilir.
- ordered: Yapı bloğu bir sıra içerisinde yürütülür. Bu sıra seri döngü içerisinde yürütülen iterasyonlar ile yapılır.
- barrier: her bir iş parçacığı bir takımın diğer iş parçacıklarının tümü bu noktaya ulaşıncaya kadar beklerler. İş paylaşımı yapısı, yapını sonunda örtülü bir bariyer senkronizasyonuna sahiptir.
- nowait: Takım içerisindeki tüm iş parçacıklarının bitirmesini beklemeden işleyebilirler. Bu cümleciğin yokluğunda iş parçacıkları iş paylaşım yapısının sonunda bir bariyer senkronizasyonu ile karşılaşır.
Zamanlama cümlecikleri
- schedule(type, chunk): iş paylaşımlı yapı do-loop veya for-loop ise bu kullanışlıdır. İşpaylaşımı içerisindeki iterasyonlar bu cümlecik kullanılarak tanımlanan zamanlama metoduna göre iş parçacıklarına atanır. Zamanlamanın 3 tipi:
- static: Burada tüm iş parçacıkları döngü iterasyonlarını yürütmeden önce iterasyonlara tahsis edilirler. Iterasyonlar varsayılan olarak eşit bir şekilde iş parçacıkları arasında paylaştırılır. Bununla birlikte bir chunk parametresi için bir tam sayı belirlemek özel bir iş parçacığına bitişik iterasyonlar tahsis edecektir.
- dynamic: Burada, iterasyonların bazıları daha az sayıda iş parçacıklarına tahsis edilir. İlk kez özel bir iş parçacığı tahsis edildiği iterasyonu tamamlarsa iş parçacığı kalan iterasyonlardan 1 değerini elde etmek için geri döner. chunk parametresi bir kerede bir iş parçacığına tahsis edilecek bitişik iterasyonların sayısını tanımlar.
- guided: Çok sayıda bitişik iterasyon parçaları dinamik olarak her bir iş parçacığına tahsis edilir. Parça boyutu chunk parametresi içinde belirlenen minimum boyuta başarılı bir şekilde tahsis edilmesiyle üssel olarak azalır.
IF Kontrol
- if: Ancak ve ancak bir durum bir görevi paralelleştirmek için iş parçacığı ile karşılaşılmasına sebep oluyorsa görev paralelleştirilir. Diğer durumda kod bloğu seri olarak yürütülür.
İlklendirme
- firstprivate: Veri her bir iş parçacığına özeldir ama değişkenin değerini kullanan ilklendirme ana iş parçacığından aynı isim kullanılarak yapılır.
- lastprivate: Veri her bir iş parçacığına özeldir. Bu özel verinin değeri paralelleştirilmiş döngüdeki iterasyon son iterasyon ise paralel bölgenin dışındada aynı ismi kullanarak global değişkene kopyalanacaktır. Değişken hem firstprivate hem de lastprivate olabilir.
- threadprivate: Veri global bir veridir ama çalışma zamanında her bir paralel bölge içerisinde özeldir. threadprivate ve private arasındaki fark threadprivate ile ilişkilendirilmiş global alandır ve paralel bölgeler içerisinde korunmuş değerdir.
Veri kopyalama
- copyin: private değişkenler içinfirstprivate gibidir, threadprivate değişkenleri ilklendirilmez. Taki karşılık gelen global değişkenlerden değerler geçirilmek için copyin kullanılana kadar.copyout gereksizdir çünkü threadprivate değişkeninin değeri tüm programın yürütümü boyunca korunur.
- copyprivate: bir iş parçacığı üzerindeki özel nesnelerden takım içerisindeki diğer iş parçacıkları üzerinde karşılık gelen nesnelere veri değerlerinin kopyalanmasını desteklemek için single ile birlikte kullanılır.
indirgeme
- reduction(operator | intrinsic : list): değişken her bir iş parçacığı içerisinde yerel bir kopyaya sahiptir, fakat yerel kopyaların değerleri global paylaşımlı değişken içerisine indirgenmiş olacaktır. Bu eğer özel bir işlem(özel bir cümlecik için operatördeki belirlenmiş) iteratif olarak veritipi üzerindeyse kullanışlı olacaktır. Böylece özel iterasyondaki değeri onun önceki iterasyondaki değerine bağlıdır. Temel olarak operasyonel arttırma paralelleştirmeye yol açan adımlardır. Fakat iş parçacıkları toplanır ve veritipi güncellenmeden önce beklerler. Ardından sırasıyla veritiplerindeki artırımlar yarış durumlarından kaçınmak için gerçekleştirilir. Bu paralelleştirme içerisindeki fonksiyonların sayısal birleştirmelerini ve diferansiyel denklemlerini gerektirecektir.
Diğerleri
- flush: Bu değişkenin değeri paralel bölümün dışarısındaki bu değeri kullanmak için belleğe, bellekteki yazmaçtan sağlanır
- master: Sadece ana iş parçacığı tarafından yürütülür hiçbir örtülü bariyer yoktur. Diğer takım üyelerinin erişmesi gerekmez.
Kullanıcı seviyesi çalışma rutinleri
İş parçacıklarının sayısını değiştirmek ve kontrol etmek, eğer yürütüm paralel bölge içerisinde ise tespit etmek ve o an sistemde kaç tane işlemcinin çalıştığını belirlemek için kullanılır.
Ortam Değişkenleri
OpenMP uygulamalarının yürütme özelliklerini değiştirmek için kullanılan bir metottur. Kontrol döngü iterasyonlarını zamanlamak, iş parçacıklarının sayılarını varsayılan yapmak için kullanılır. Mesela OMP_NUM_THREADS bir uygulama için işparçacıklarının sayılarını belirlemede kullanılır.
Örnek programlar
Bu bölümde bazı örnek programlar üstte açıklanan kavramları göstermek için verilmiştir.
Merhaba Dünya
parallel, private ve barrier direktiflerini örnekleyen temel bir program ve omp_get_thread_num
ve omp_get_num_threads
fonksiyonlarını kullanır.
C
Bu C programı -fopenmp bayrağıyla birlikte gcc 4.4 kullanılarak derlenmiştir.
#include <omp.h> #include <stdio.h> #include <stdlib.h> int main (int argc, char *argv[]) { int th_id, nthreads; #pragma omp parallel private(th_id) { th_id = omp_get_thread_num(); printf("Hello World from thread %d\n", th_id); #pragma omp barrier if ( th_id == 0 ) { nthreads = omp_get_num_threads(); printf("There are %d threads\n",nthreads); } } return EXIT_SUCCESS; }
C++
Bu C++ programı GCC: gcc -Wall -fopenmp test.cpp -lstdc++ kullanılarak derlenmiştir.
#include <iostream> using namespace std; #include <omp.h> int main(int argc, char *argv[]) { int th_id, nthreads; #pragma omp parallel private(th_id) shared(nthreads) { th_id = omp_get_thread_num(); #pragma omp critical { cout << "Hello World from thread " << th_id << '\n'; } #pragma omp barrier #pragma omp master { nthreads = omp_get_num_threads(); cout << "There are " << nthreads << " threads" << '\n'; } } return 0; }
Fortran 77
Bu da Fortran 77 versiyonu.
PROGRAM HELLO INTEGER ID, NTHRDS INTEGER OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS C$OMP PARALLEL PRIVATE(ID) ID = OMP_GET_THREAD_NUM() PRINT *, 'HELLO WORLD FROM THREAD', ID C$OMP BARRIER IF ( ID .EQ. 0 ) THEN NTHRDS = OMP_GET_NUM_THREADS() PRINT *, 'THERE ARE', NTHRDS, 'THREADS' END IF C$OMP END PARALLEL END
Fortran 90 serbest biçim
Bu da Fortran 90 serbest biçim versiyonu.
program hello90 use omp_lib integer:: id, nthreads !$omp parallel private(id) id = omp_get_thread_num() write (*,*) 'Hello World from thread', id !$omp barrier if ( id == 0 ) then nthreads = omp_get_num_threads() write (*,*) 'There are', nthreads, 'threads' end if !$omp end parallel end program
C/C++ İş Paylaşımı Yapılarındaki Cümlecikler
Bazı OpenMP cümleciklerinin uygulaması bu bölümde basit örneklerle gösterilmiştir. Aşağıdaki kod parçası a dizisinin elemanları üzerinde basit bir operasyon işleterek b dizisinin elemanlarını günceller. Paralelleştirme OpenMP direktifi #pragma omp tarafından yapılır. Görevlerin zamanlanması dynamictir. İterasyon sayaçları j ve k'nın özel olmak zorunda olduğunu ve ilkel iterasyon sayacı i'nin varsayılan olarak özel olduğunu görebilirsiniz. i boyunca çalışan görevler çoklu iş parçacıkları arasında paylaştırılmıştır ve her iş parçacığı j ve k'nın kendi versiyonlarını oluştururlar. Bu yüzden tüm görevin tahsisini yapmak ve b dizisinin tahsis edilmiş parçasını güncellemek diğer iş parçacıklarıyla aynı zamanda yapılır.
#define CHUNKSIZE 1 /*defines the chunk size as 1 contiguous iteration*/ /*forks off the threads*/ #pragma omp parallel private(j,k) { /*Starts the work sharing construct*/ #pragma omp for schedule(dynamic, CHUNKSIZE) for(i = 2; i <= N-1; i++) for(j = 2; j <= i; j++) for(k = 1; k <= M; k++) b[i][j] += a[i-1][j]/k + a[i+1][j]/k; }
Diğer kod parçacığı indirgeme cümleciğinin indirgenmiş toplamlarını hesaplamak için yaygın kullanımını gösterir. Burada OpenMp direktifleri ve indirgeme cümlecikleri kullanarak paralelleştirdiğimiz for döngüsünü içindeki i ile birlikte tüm a dizisinin elemanlarını ekliyoruz. Zamanlama static sürdürülür.
#define N 10000 /*size of a*/ void calculate(long *); /*The function that calculates the elements of a*/ int i; long w; long a[N]; calculate(a); long sum = 0; /*forks off the threads and starts the work-sharing construct*/ #pragma omp parallel for private(w) reduction(+:sum) schedule(static,1) for(i = 0; i < N; i++) { w = i*i; sum = sum + w*a[i]; } printf("\n %li",sum);
Üstteki kodun gerçekleştirimin bir dengi her bir iş parçacığı için yerel sum değişkeni kullanmaktır ("loc_sum") ve sürecin sonunda global sum değişkeninin güncellenmesini korumaktır. Aşağıda açıklandığı gibi bu koruma önemlidir
... long sum = 0, loc_sum; /*forks off the threads and starts the work-sharing construct*/ #pragma omp parallel private(w,loc_sum) { loc_sum = 0; #pragma omp for schedule(static,1) for(i = 0; i < N; i++) { w = i*i; loc_sum = loc_sum + w*a[i]; } #pragma omp critical sum = sum + loc_sum; } printf("\n %li",sum);
Gerçekleştirimler
OpenMP birçok ticari derleyiciler içerisinde gerçekleştirilir. Mesela Visual C++ 2005,2008 ve 2010 OpenMp destekler. Aynı zamanda Intel Parallel Studio, Oracle Solaris Studio derleyicileri ve araçları OpenMp'nin son versiyonunu destekler. Fortran, C/C++ derleyicileri de OpenMP 2.5 destekler. GCC OpenMp'yi 4.2 versiyonundan beri desteklemektedir.
OpenMP 3.0 gerçekleştirimini destekleyen derleyiciler:
- GCC 4.3.1
- Nano derleyiciler
- Intel Fortran and C/C++ versions 11.0 and 11.1 derleyiciler, Intel C/C++ and Fortran Composer XE 2011 and Intel Parallel Studio.
- IBM XL C/C++ derleyici
- Sun Studio 12'nin, OpenMP 3.0'ın tüm gerçekleştirimlerini içeren bir güncellemesi vardır.
Birçok derleyici OpenMP 3.1'i destekler:
- GCC 4.7
- Intel Fortran and C/C++ derleyiciler.
Artılar ve Eksiler
- Artılar
- Taşınabilir çok iş parçacıklı kod (C/C++ ve diğer dillerde, bir tanesi tipik olarak çoklu işparçacığını elde etmek için bir platform çağırır)
- Basittir. MPI'ın yaptığı gibi mesaj geçirmeyle uğraşmaya gerek yoktur.
- Veri planı ve ayrılması direktifler tarafından otomatik olarak yönetilir.
- Artımlı paralellik: bir kerede bir programın bir kısmında çalışabilir. Kodda fazla bir değişikliğe ihtiyaç yoktur.
- Hem seri hem de paralel uygulamalar için birleştirilimiş kod:OpenMP yapıları seri derleyiciler kullanıldığı zaman derleyiciler tarafından yorumlar olarak anlaşılır.
- Seri kod ifadeleri gerekmez. Genel olarak OpenMP ile paralelleştirildiğinde bu beklenmedik hatalarla karşılaşma ihtimalini azaltır.
- Hem doğrudan hem de iyileştirilmiş paralelleştirme mümkündür.
- Eksiler
- Yarış durumları ve senkronizasyon hatalarıyla karşılaşma riski çok fazladır.
- Şu anda sadece verimli bir şekilde paylaşımlı bellek platformunda çalışır.
- Derleyicinin OpenMP'yi desteklemesini gerektirir.
- Ölçeklenebilirlik bellek mimarisi ile sınırlıdır.
- karşılaştır ve yer değiştir için destek vermez
- hata yönetimine güvenilirlik azdır.
- İş parçacığı işlemci eşleştirmeyi kontrol etmek için iyileştirilmiş mekanizma eksiktir.
- GPU üzerinde kullanılmaz.
- Kazara yanlış paylaşımlı kod yazma olasılğı yüksektir.
- Genelde çoklu iş parçacığı hala faydası olmayan yerlerde kullanılmaktadır.
Kriterler
Kullanıcı çalışması için OpenMP kriter alanları mevcuttur..
- NAS parallel benchmark28 Ekim 2011 tarihinde Wayback Machine sitesinde .
- OpenMP source code repository1 Mayıs 2013 tarihinde Wayback Machine sitesinde .
Online dokümanlar
- Tutorial18 Eylül 2008 tarihinde Wayback Machine sitesinde . on llnl.gov
- Reference/tutorial page31 Ocak 2011 tarihinde Wayback Machine sitesinde . on nersc.gov
- Tutorial in CI-Tutor20 Aralık 2011 tarihinde Wayback Machine sitesinde .
Bunları da inceleyebilirsiniz
- ve
- - C, ve Objective-C için Apple tarafından geliştirilmiş karşılaştırılabilir teknoloji
- GPGPU
- CUDA - Nvidia
- OpenCL - Apple, Nvidia, Intel, IBM, AMD/ATI ve diğer pek çoğu tarafından standart desteklidir
- - openMP'ye birleştirilmesi planlanan GPU hızlandırması için bir standart
- Derin öğrenme yazılımlarının karşılaştırılması
Yardımcı Kaynaklar
- Quinn Michael J, Parallel Programming in C with MPI and OpenMP McGraw-Hill Inc. 2004.
- R. Chandra, R. Menon, L. Dagum, D. Kohr, D. Maydan, J. McDonald, Parallel Programming in OpenMP. Morgan Kaufmann, 2000.
- R. Eigenmann (Editor), M. Voss (Editor), OpenMP Shared Memory Parallel Programming: International Workshop on OpenMP Applications and Tools, WOMPAT 2001, West Lafayette, IN, USA, July 30–31, 2001. (Lecture Notes in Computer Science). Springer 2001.
- B. Chapman, G. Jost, R. van der Pas, D.J. Kuck (foreword), Using OpenMP: Portable Shared Memory Parallel Programming. The MIT Press (October 31, 2007).
- Parallel Processing via MPI & OpenMP, M. Firuziaan, O. Nommensen. Linux Enterprise, 10/2002
- (PDF) - Hands-On Introduction to OpenMP, Mattson and Meadows, from SC08 (Austin)
- OpenMP 3.0 Summary Card30 Nisan 2013 tarihinde Wayback Machine sitesinde . (PDF)
- (PDF)
Dış bağlantılar
- Çanakkale OnSekiz Mart Üniversitesi11 Haziran 2020 tarihinde Wayback Machine sitesinde .
- Çanakkale OnSekiz Mart Üniversitesi Bilgisayar Mühendisliği22 Ekim 2013 tarihinde Wayback Machine sitesinde .
- Resmî site, includes the latest OpenMP specifications, links to resources, and a lively set of forums where questions about OpenMP can be asked and are answered by the experts and implementors.
- GOMP22 Mayıs 2013 tarihinde Wayback Machine sitesinde . is GCC's OpenMP implementation, part of GCC
- IBM Octopiler29 Ocak 2009 tarihinde Wayback Machine sitesinde . with OpenMP support
- Blaise Barney, Lawrence Livermore National Laboratory site on OpenMP18 Aralık 2019 tarihinde Wayback Machine sitesinde .
- ompca, an application in REDLIB project for the interactive symbolic model-checker of C/C++ programs with OpenMP directives23 Haziran 2013 tarihinde Wayback Machine sitesinde .
Kaynakça
- ^ http://openmp.org/wp/about-openmp/ 9 Ağustos 2013 tarihinde Wayback Machine sitesinde . About the OpenMP ARB and OpenMP.org
- ^ http://openmp.org/wp/2011/07/openmp-31-specification-released/ 21 Haziran 2013 tarihinde Wayback Machine sitesinde . OpenMP 3.1 Specification Released
- ^ http://openmp.org/wp/openmp-compilers/ 17 Temmuz 2013 tarihinde Wayback Machine sitesinde . OpenMP Compilers
wikipedia, wiki, viki, vikipedia, oku, kitap, kütüphane, kütübhane, ara, ara bul, bul, herşey, ne arasanız burada,hikayeler, makale, kitaplar, öğren, wiki, bilgi, tarih, yukle, izle, telefon için, turk, türk, türkçe, turkce, nasıl yapılır, ne demek, nasıl, yapmak, yapılır, indir, ücretsiz, ücretsiz indir, bedava, bedava indir, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, resim, müzik, şarkı, film, film, oyun, oyunlar, mobil, cep telefonu, telefon, android, ios, apple, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, pc, web, computer, bilgisayar
OpenMP Solaris IBM AIX HP UX GNU Linux MAC OS X ve Windows isletim sistemleri uzerinde cogu islemci mimarisi uzerinde Fortran C C programlama dillerinde coklu platform paylasimli bellek coklu islemeyi destekleyen bir uygulama gelistirme arayuzudur yani bir API dir OpenMP derleyici yonergelerinin kutuphane rutinlerini ve ortam degiskenlerinin calisma zamani davranisini etkileyen bir kumesini icerir OpenMPGelistirici ler OpenMP Architecture Review BoardGuncel surum3 1 9 Temmuz 2011 12 yil once 2011 07 09 Programlama diliC C FortranIsletim sistemiCapraz platform yazilimlariPlatformCapraz platform yazilimlariTurUPALisansVariousResmi sitesiopenmp org OpenMP kar amaci gutmeyen OpenMp Archtecture Review Board OpenMP ARB isimli uluslararasi bir birlik tarafindan yonetilir Bu birligin cogunlugu yazilim saticilari AMD IBM Intel Cray HP Fujitsu Nvidia NEC Microsoft Texas Intstruments Oracle Corporation sirketlerinden ve bilgisayar donanim gruplari tarafindan olusur OpenMP standart masaustu bilgisayarlarda super bilgisayarlara varana kadar paralel uygulamalari gelistirmek icin programcilara basit ve uygun bir arayuz veren olceklenebilir ve tasinabilir bir model kullanir Paralel programlamanin melez bir modeliyle olusturulmus bir uygulama hem OpenMP hem de MPI kullanarak bir bilgisayar uzerinde calisabilir ya da paylasimsiz bellek sistemleri icin OpenMP nin gelismis surumlerini kullanarak kullanicidan daha da bagimsiz calisabilir GirisOpenMP coklu is parcacigi gerceklestirimidir Coklu is parcacigi ana is parcaciginin sirasiyla yurutulen komutlarin bir dizisi belirli bir sayida yardimci is parcaciklarini durdurmasi ve bir gorev onlar arasinda paylastirmasi olan paralellestirme metodudur Is parcaciklari birbiri ardinda paralel sekilde calisirlar Farkli islemcilerin is parcaciklari farkli calisma zamani ortamlarini kendilerine tahsis ederler Paralel calisacak olan kodun bir bolumu sirasiyla isaretlenir Bu isaretleme kod bolumunun yurutulmesinden once is parcaciklarinin o kod bolumune girmelerine sebep olacak on islemci direktifleridir Her bir is parcacigi onlara bagli bir ID ye sahiptir omp get thread num fonksiyonu ile bu ID elde edilir Is parcacigi ID si bir tam sayidir ve ana is parcaciginin ID si sifirdir Paralellestirilmis kodun yurutulmesinden sonra is parcaciklari ana is parcacigina tekrar geri katilirlar Programin sonuna kadar bu boyle devam eder Varsayilan olarak her bir is parcacigi kodun paralellestirilmis bolumunu birbirinden bagimsiz sekilde yurutur Is paylasimi yapilari is parcaciklari arasinda bir gorevi paylastirmak icin kullanilabilir boylece her bir is parcacigi kodun kendisine ayrilan bolumunde calisir Hem gorev paralellestirme hem de veri paralellestirme OpenMP kullanarak bu yontemle yapilir Calisma zamani ortami kullanima bagli olarak islemcilere is parcacigi tahsis eder makine yukleme ve diger faktorler gibi Is parcaciklarinin sayisi ortam degiskenleri veya kod icerisinde kullanilan fonksiyonlara bagli olarak calisma zamani ortami tarafindan atanir OpenMP fonksiyonlari omp h etiketli C C header dosyalari ile programa dahil edilir TarihceOpenMP ARB ilk arayuz programini Fortran 1 0 icin Ekim 1997 OpenMP ile yayinladi Bir sonraki yil C C standartini piyasaya surduler Fortran ve C C 2 0 versiyonlari ile birlikte 2002 yilinda piyasaya suruldu 2 5 versiyonu C C Fortranin bir kombinasyonu olarak 2005 yilinda piyasaya suruldu Mayis 2008 de 3 0 versiyonu piyasaya suruldu Yeni ozellikler gorevler ve gorev yapilari kavramlari versiyonu 3 0 a dahil edildi Versiyon 3 1 9 Temmuz 2011 de piyasaya suruldu Versiyon 4 0 in 2013 Haziran veya Temmuz aylarinda sunulmasi bekleniyor Asagidaki ozellikleri gelistirmis ve kendisine eklemistir Hizlandiricilar ici destek atomikler hata yonetimi is parcacigi thread iliskisi gorev gelistirimi kullanici tanimli arttirma SIMD destegi Fortran 2003 destegi Temel elemanlarOpenMP yapilarinin semasi OpenMP temel elemanlari is parcacigi olusturma is yuku dagitimi is paylasimi veri ortam yonetimi is parcacigi senkronizasyonu kullanici seviyeli calisma zamani rutinleri ve ortam degiskenleri icin yapilardir C C ta OpenMP pragma etiketi kullanilir OpenMP ozel pragmalar asagida listelenmistir Is Parcacigi Olusturma omp parallel pragma paralellestirilmis yapi icerisinde kapanmis isi gerceklestirmek icin ek is parcaciklarini capraz dagitmak icin kullanilir Orijinal is parcacigi ID 0 olan ana is parcacigi olarak gosterilir Ornek C program Coklu is parcacigi kullanarak Merhaba Dunya yazdirmak include lt stdio h gt int main void pragma omp parallel printf Merhaba dunya n return 0 GCC kullanarak derlemek icin fopenmp bayragi kullanilir gcc fopenmp merhaba c o merhaba is parcacikli ve 2 cekirdekli bilgisayar uzerindeki cikti Merhaba dunya Merhaba dunya Bununla birlikte cikti yaris durumlari sebebiyle 2 is parcaciginin standart ciktiyi paylasmasindan dolayi bozulmus bir sekilde alinabilir Merhaba duMerha duunya nya Is Paylasma Yapilari Is parcaciklarinin birinin veya tamamina birbirinden bagimsiz is atamak icin asagidakiler kullanilir omp for veya omp do is parcaciklari arasinda dongu iterasyonlarini paylastirmak icin kullanilir Dongu yapilari olarak da adlandirilir sections sirali atama yapilir fakat farkli is parcaciklarina bagimsiz kod bloklari atanir single sadece bir is parcaciginin yuruttugu bir kod blogu belirlenir programin sonunda bir bitis yeri gosterir master single gibidir ama kod blogu ana is parcacigi tarafindan yurutulur ve program sonunda bir bitis yeri gosterilmez Ornek paralel olarak buyuk bir diziye is parcaciklari kullanarak ilk degerleri vermek int main int argc char argv const int N 100000 int i a N pragma omp parallel for for i 0 i lt N i a i 2 i return 0 OpenMP Cumlecikleri OpenMP paylasimli bellek programlama modeli oldugu icin OpenMP kodu icerisindeki cogu degisken varsayilan olarak tum is parcaciklarina gorunur ama bazen ozel degiskenlerin yaris durumlarindan kacinmasi gereklidir ve seri bolge ile paralel bolge arasindaki degerlerin islenebilmesi icin veri ortam yonetimi veri paylasim ozellik cumlecikleri olarak tanitilmistir Bu cumlecikler OpenMP direktiflerine eklenir Veri paylasimi ozelligi cumlecikleri shared paralel bolge ile birlikte veri paylasilir Paylasimin anlami tum is parcaciklari tarafindan erisilebilir ve gorulebilirdir Varsayilan olarak is paylasim bolgesindeki tum degiskenlerin dongu iterasyon sayaci disinda hepsi paylasilir private paralel bolge ile birlikte veri her bir is parcacigina ozeldir Bunun anlami her bir is parcaciginin yerel bir kopyaya sahip olacagi ve o degiskeni gecici olarak kullanacagidir Bir ozel degisken ilklendirilmez ve degeri paralel bolge disinda kullanilmaz Varsayilan olarak dongu iterasyon sayaci ozeldir default programciya Fortran icin none C C icin none firstprivate private shared paralel bolgeleri icin veri alanina mudahale etmesine izin verir none secenegi programcinin veri paylasimli ozellik cumlecigini kullanarak paralel bolge icerisindeki her bir degiskeni tanimlamasina zorlar firstprivate orijinal degeri ilklendirme haricindeprivate gibidir lastprivate yapidan sonra guncellenen orijinal deger haricinde private gibidir reduction yapidan sonra tum is parcaciklarinin ise katilmasinin guvenli bir yontemidir Senkronizasyon cumlecikleri critical secili kod blogu bir kerede sadece bir is parcacigi tarafindan yurutulecektir ve coklu is parcaciklari tarafindan es zamanli yurutlmez Bu genelde yaris durumlarindan veri paylasimini korumak icin kullanilir atomic Bellek guncellenmesi otomatik olarak isletilir Tum ifadeyi atomic yapmaz sadece bellek guncellenmesi atomiktir Bir derleyici daha iyi performans icin critical kullanmak yerine ozel bir donanim komutu kullanabilir ordered Yapi blogu bir sira icerisinde yurutulur Bu sira seri dongu icerisinde yurutulen iterasyonlar ile yapilir barrier her bir is parcacigi bir takimin diger is parcaciklarinin tumu bu noktaya ulasincaya kadar beklerler Is paylasimi yapisi yapini sonunda ortulu bir bariyer senkronizasyonuna sahiptir nowait Takim icerisindeki tum is parcaciklarinin bitirmesini beklemeden isleyebilirler Bu cumlecigin yoklugunda is parcaciklari is paylasim yapisinin sonunda bir bariyer senkronizasyonu ile karsilasir Zamanlama cumlecikleri schedule type chunk is paylasimli yapi do loop veya for loop ise bu kullanislidir Ispaylasimi icerisindeki iterasyonlar bu cumlecik kullanilarak tanimlanan zamanlama metoduna gore is parcaciklarina atanir Zamanlamanin 3 tipi static Burada tum is parcaciklari dongu iterasyonlarini yurutmeden once iterasyonlara tahsis edilirler Iterasyonlar varsayilan olarak esit bir sekilde is parcaciklari arasinda paylastirilir Bununla birlikte bir chunk parametresi icin bir tam sayi belirlemek ozel bir is parcacigina bitisik iterasyonlar tahsis edecektir dynamic Burada iterasyonlarin bazilari daha az sayida is parcaciklarina tahsis edilir Ilk kez ozel bir is parcacigi tahsis edildigi iterasyonu tamamlarsa is parcacigi kalan iterasyonlardan 1 degerini elde etmek icin geri doner chunk parametresi bir kerede bir is parcacigina tahsis edilecek bitisik iterasyonlarin sayisini tanimlar guided Cok sayida bitisik iterasyon parcalari dinamik olarak her bir is parcacigina tahsis edilir Parca boyutu chunk parametresi icinde belirlenen minimum boyuta basarili bir sekilde tahsis edilmesiyle ussel olarak azalir IF Kontrol if Ancak ve ancak bir durum bir gorevi paralellestirmek icin is parcacigi ile karsilasilmasina sebep oluyorsa gorev paralellestirilir Diger durumda kod blogu seri olarak yurutulur Ilklendirme firstprivate Veri her bir is parcacigina ozeldir ama degiskenin degerini kullanan ilklendirme ana is parcacigindan ayni isim kullanilarak yapilir lastprivate Veri her bir is parcacigina ozeldir Bu ozel verinin degeri paralellestirilmis dongudeki iterasyon son iterasyon ise paralel bolgenin disindada ayni ismi kullanarak global degiskene kopyalanacaktir Degisken hem firstprivate hem de lastprivate olabilir threadprivate Veri global bir veridir ama calisma zamaninda her bir paralel bolge icerisinde ozeldir threadprivate ve private arasindaki fark threadprivate ile iliskilendirilmis global alandir ve paralel bolgeler icerisinde korunmus degerdir Veri kopyalama copyin private degiskenler icinfirstprivate gibidir threadprivate degiskenleri ilklendirilmez Taki karsilik gelen global degiskenlerden degerler gecirilmek icin copyin kullanilana kadar copyout gereksizdir cunku threadprivate degiskeninin degeri tum programin yurutumu boyunca korunur copyprivate bir is parcacigi uzerindeki ozel nesnelerden takim icerisindeki diger is parcaciklari uzerinde karsilik gelen nesnelere veri degerlerinin kopyalanmasini desteklemek icin single ile birlikte kullanilir indirgeme reduction operator intrinsic list degisken her bir is parcacigi icerisinde yerel bir kopyaya sahiptir fakat yerel kopyalarin degerleri global paylasimli degisken icerisine indirgenmis olacaktir Bu eger ozel bir islem ozel bir cumlecik icin operatordeki belirlenmis iteratif olarak veritipi uzerindeyse kullanisli olacaktir Boylece ozel iterasyondaki degeri onun onceki iterasyondaki degerine baglidir Temel olarak operasyonel arttirma paralellestirmeye yol acan adimlardir Fakat is parcaciklari toplanir ve veritipi guncellenmeden once beklerler Ardindan sirasiyla veritiplerindeki artirimlar yaris durumlarindan kacinmak icin gerceklestirilir Bu paralellestirme icerisindeki fonksiyonlarin sayisal birlestirmelerini ve diferansiyel denklemlerini gerektirecektir Digerleri flush Bu degiskenin degeri paralel bolumun disarisindaki bu degeri kullanmak icin bellege bellekteki yazmactan saglanir master Sadece ana is parcacigi tarafindan yurutulur hicbir ortulu bariyer yoktur Diger takim uyelerinin erismesi gerekmez Kullanici seviyesi calisma rutinleri Is parcaciklarinin sayisini degistirmek ve kontrol etmek eger yurutum paralel bolge icerisinde ise tespit etmek ve o an sistemde kac tane islemcinin calistigini belirlemek icin kullanilir Ortam Degiskenleri OpenMP uygulamalarinin yurutme ozelliklerini degistirmek icin kullanilan bir metottur Kontrol dongu iterasyonlarini zamanlamak is parcaciklarinin sayilarini varsayilan yapmak icin kullanilir Mesela OMP NUM THREADS bir uygulama icin isparcaciklarinin sayilarini belirlemede kullanilir Ornek programlarBu bolumde bazi ornek programlar ustte aciklanan kavramlari gostermek icin verilmistir Merhaba Dunya parallel private ve barrier direktiflerini ornekleyen temel bir program ve omp get thread num ve omp get num threads fonksiyonlarini kullanir C Bu C programi fopenmp bayragiyla birlikte gcc 4 4 kullanilarak derlenmistir include lt omp h gt include lt stdio h gt include lt stdlib h gt int main int argc char argv int th id nthreads pragma omp parallel private th id th id omp get thread num printf Hello World from thread d n th id pragma omp barrier if th id 0 nthreads omp get num threads printf There are d threads n nthreads return EXIT SUCCESS C Bu C programi GCC gcc Wall fopenmp test cpp lstdc kullanilarak derlenmistir include lt iostream gt using namespace std include lt omp h gt int main int argc char argv int th id nthreads pragma omp parallel private th id shared nthreads th id omp get thread num pragma omp critical cout lt lt Hello World from thread lt lt th id lt lt n pragma omp barrier pragma omp master nthreads omp get num threads cout lt lt There are lt lt nthreads lt lt threads lt lt n return 0 Fortran 77 Bu da Fortran 77 versiyonu PROGRAM HELLO INTEGER ID NTHRDS INTEGER OMP GET THREAD NUM OMP GET NUM THREADS C OMP PARALLEL PRIVATE ID ID OMP GET THREAD NUM PRINT HELLO WORLD FROM THREAD ID C OMP BARRIER IF ID EQ 0 THEN NTHRDS OMP GET NUM THREADS PRINT THERE ARE NTHRDS THREADS END IF C OMP END PARALLEL END Fortran 90 serbest bicim Bu da Fortran 90 serbest bicim versiyonu program hello90 use omp lib integer id nthreads omp parallel private id id omp get thread num write Hello World from thread id omp barrier if id 0 then nthreads omp get num threads write There are nthreads threads end if omp end parallel end program C C Is Paylasimi Yapilarindaki Cumlecikler Bazi OpenMP cumleciklerinin uygulamasi bu bolumde basit orneklerle gosterilmistir Asagidaki kod parcasi a dizisinin elemanlari uzerinde basit bir operasyon isleterek b dizisinin elemanlarini gunceller Paralellestirme OpenMP direktifi pragma omp tarafindan yapilir Gorevlerin zamanlanmasi dynamictir Iterasyon sayaclari j ve k nin ozel olmak zorunda oldugunu ve ilkel iterasyon sayaci i nin varsayilan olarak ozel oldugunu gorebilirsiniz i boyunca calisan gorevler coklu is parcaciklari arasinda paylastirilmistir ve her is parcacigi j ve k nin kendi versiyonlarini olustururlar Bu yuzden tum gorevin tahsisini yapmak ve b dizisinin tahsis edilmis parcasini guncellemek diger is parcaciklariyla ayni zamanda yapilir define CHUNKSIZE 1 defines the chunk size as 1 contiguous iteration forks off the threads pragma omp parallel private j k Starts the work sharing construct pragma omp for schedule dynamic CHUNKSIZE for i 2 i lt N 1 i for j 2 j lt i j for k 1 k lt M k b i j a i 1 j k a i 1 j k Diger kod parcacigi indirgeme cumleciginin indirgenmis toplamlarini hesaplamak icin yaygin kullanimini gosterir Burada OpenMp direktifleri ve indirgeme cumlecikleri kullanarak paralellestirdigimiz for dongusunu icindeki i ile birlikte tum a dizisinin elemanlarini ekliyoruz Zamanlama static surdurulur define N 10000 size of a void calculate long The function that calculates the elements of a int i long w long a N calculate a long sum 0 forks off the threads and starts the work sharing construct pragma omp parallel for private w reduction sum schedule static 1 for i 0 i lt N i w i i sum sum w a i printf n li sum Ustteki kodun gerceklestirimin bir dengi her bir is parcacigi icin yerel sum degiskeni kullanmaktir loc sum ve surecin sonunda global sum degiskeninin guncellenmesini korumaktir Asagida aciklandigi gibi bu koruma onemlidir long sum 0 loc sum forks off the threads and starts the work sharing construct pragma omp parallel private w loc sum loc sum 0 pragma omp for schedule static 1 for i 0 i lt N i w i i loc sum loc sum w a i pragma omp critical sum sum loc sum printf n li sum GerceklestirimlerOpenMP bircok ticari derleyiciler icerisinde gerceklestirilir Mesela Visual C 2005 2008 ve 2010 OpenMp destekler Ayni zamanda Intel Parallel Studio Oracle Solaris Studio derleyicileri ve araclari OpenMp nin son versiyonunu destekler Fortran C C derleyicileri de OpenMP 2 5 destekler GCC OpenMp yi 4 2 versiyonundan beri desteklemektedir OpenMP 3 0 gerceklestirimini destekleyen derleyiciler GCC 4 3 1 Nano derleyiciler Intel Fortran and C C versions 11 0 and 11 1 derleyiciler Intel C C and Fortran Composer XE 2011 and Intel Parallel Studio IBM XL C C derleyici Sun Studio 12 nin OpenMP 3 0 in tum gerceklestirimlerini iceren bir guncellemesi vardir Bircok derleyici OpenMP 3 1 i destekler GCC 4 7 Intel Fortran and C C derleyiciler Artilar ve EksilerArtilarTasinabilir cok is parcacikli kod C C ve diger dillerde bir tanesi tipik olarak coklu isparcacigini elde etmek icin bir platform cagirir Basittir MPI in yaptigi gibi mesaj gecirmeyle ugrasmaya gerek yoktur Veri plani ve ayrilmasi direktifler tarafindan otomatik olarak yonetilir Artimli paralellik bir kerede bir programin bir kisminda calisabilir Kodda fazla bir degisiklige ihtiyac yoktur Hem seri hem de paralel uygulamalar icin birlestirilimis kod OpenMP yapilari seri derleyiciler kullanildigi zaman derleyiciler tarafindan yorumlar olarak anlasilir Seri kod ifadeleri gerekmez Genel olarak OpenMP ile paralellestirildiginde bu beklenmedik hatalarla karsilasma ihtimalini azaltir Hem dogrudan hem de iyilestirilmis paralellestirme mumkundur EksilerYaris durumlari ve senkronizasyon hatalariyla karsilasma riski cok fazladir Su anda sadece verimli bir sekilde paylasimli bellek platformunda calisir Derleyicinin OpenMP yi desteklemesini gerektirir Olceklenebilirlik bellek mimarisi ile sinirlidir karsilastir ve yer degistir icin destek vermez hata yonetimine guvenilirlik azdir Is parcacigi islemci eslestirmeyi kontrol etmek icin iyilestirilmis mekanizma eksiktir GPU uzerinde kullanilmaz Kazara yanlis paylasimli kod yazma olasilgi yuksektir Genelde coklu is parcacigi hala faydasi olmayan yerlerde kullanilmaktadir KriterlerKullanici calismasi icin OpenMP kriter alanlari mevcuttur NAS parallel benchmark28 Ekim 2011 tarihinde Wayback Machine sitesinde OpenMP source code repository1 Mayis 2013 tarihinde Wayback Machine sitesinde Online dokumanlarTutorial18 Eylul 2008 tarihinde Wayback Machine sitesinde on llnl gov Reference tutorial page31 Ocak 2011 tarihinde Wayback Machine sitesinde on nersc gov Tutorial in CI Tutor20 Aralik 2011 tarihinde Wayback Machine sitesinde Bunlari da inceleyebilirsinizve C C ve Objective C icin Apple tarafindan gelistirilmis karsilastirilabilir teknoloji GPGPU CUDA Nvidia OpenCL Apple Nvidia Intel IBM AMD ATI ve diger pek cogu tarafindan standart desteklidir openMP ye birlestirilmesi planlanan GPU hizlandirmasi icin bir standart Derin ogrenme yazilimlarinin karsilastirilmasiYardimci KaynaklarQuinn Michael J Parallel Programming in C with MPI and OpenMP McGraw Hill Inc 2004 ISBN 0 07 058201 7 R Chandra R Menon L Dagum D Kohr D Maydan J McDonald Parallel Programming in OpenMP Morgan Kaufmann 2000 ISBN 1 55860 671 8 R Eigenmann Editor M Voss Editor OpenMP Shared Memory Parallel Programming International Workshop on OpenMP Applications and Tools WOMPAT 2001 West Lafayette IN USA July 30 31 2001 Lecture Notes in Computer Science Springer 2001 ISBN 3 540 42346 X B Chapman G Jost R van der Pas D J Kuck foreword Using OpenMP Portable Shared Memory Parallel Programming The MIT Press October 31 2007 ISBN 0 262 53302 2 Parallel Processing via MPI amp OpenMP M Firuziaan O Nommensen Linux Enterprise 10 2002 PDF Hands On Introduction to OpenMP Mattson and Meadows from SC08 Austin OpenMP 3 0 Summary Card30 Nisan 2013 tarihinde Wayback Machine sitesinde PDF PDF Dis baglantilarCanakkale OnSekiz Mart Universitesi11 Haziran 2020 tarihinde Wayback Machine sitesinde Canakkale OnSekiz Mart Universitesi Bilgisayar Muhendisligi22 Ekim 2013 tarihinde Wayback Machine sitesinde Resmi site includes the latest OpenMP specifications links to resources and a lively set of forums where questions about OpenMP can be asked and are answered by the experts and implementors GOMP22 Mayis 2013 tarihinde Wayback Machine sitesinde is GCC s OpenMP implementation part of GCC IBM Octopiler29 Ocak 2009 tarihinde Wayback Machine sitesinde with OpenMP support Blaise Barney Lawrence Livermore National Laboratory site on OpenMP18 Aralik 2019 tarihinde Wayback Machine sitesinde ompca an application in REDLIB project for the interactive symbolic model checker of C C programs with OpenMP directives23 Haziran 2013 tarihinde Wayback Machine sitesinde Kaynakca http openmp org wp about openmp 9 Agustos 2013 tarihinde Wayback Machine sitesinde About the OpenMP ARB and OpenMP org http openmp org wp 2011 07 openmp 31 specification released 21 Haziran 2013 tarihinde Wayback Machine sitesinde OpenMP 3 1 Specification Released http openmp org wp openmp compilers 17 Temmuz 2013 tarihinde Wayback Machine sitesinde OpenMP Compilers