OpenGL ile karıştırılmamalıdır.
OpenCL'nin logosu
**OpenCL**, (*Open Computing Language*), Apple tarafından 2008 yılında kâr amacı gütmeyen teknoloji şirketleri birliği Khronos Group'a önerilen, kabul gördükten sonra spesifikasyonu pek çok şirketin katkılarıyla hazırlanan heterojen hesaplama platformudur. OpenCL; destekli grafik işlemcileri, genel amaçlı işlemciler ve FPGA ler gibi farklı platformlarda hesaplama yapılmasına olanak sağlar. OpenCL AMD, Intel, NVIDIA ve ARM tarafından desteklenmektedir. Ayrıca OpenCL kullanılarak Sony Playstation cihazlarında kullanılan Cell işlemcilerde de hesaplama yapılabilmektedir.

### OpenCL C Dili

OpenCL destekli cihazlarda(bundan sonra cihaz olarak geçecektir) çalıştırılacak kodun yazılması için OpenCL C de denilen, C programlama dilinin ISO/IEC 9899:1999 sürümünü baz alan bir programlama dili geliştirilmiştir. OpenCL C dilinde paralelliğin daha iyi kullanılabilmesine olanak sağlamak için C programlama dilinden bazı farklılıklara gidilmiştir. Bu farklılıklardan en çok göze çarpanları:

* Fonksiyon işaretcileri(function pointers) kaldırılmıştır.
* Özyineleme(recursion) kaldırılmıştır.
* Değişken uzunluklu diziler kaldırılmıştır.
* Vektör veri türleri eklenmiştir
* Senkronizasyon ve çalışma modeline ilişkin pek çok fonksiyon eklenmiştir .
* Hafıza yönetimi için \_\_global, \_\_local, \_\_constant ve \_\_private sıfatları eklenmiştir.

### OpenCL Çalışma Mantığı

#### Kernel

Kernel cihaz üzerinde çalıştırılabilen en temel kod dizisine verilen isimdir. Kerneller OpenCL'in ilk versiyonlarında C dilinde yazılıyordu. Artık C++ dilinin güçlü imkânları da kullanılmaktadır. C++14 versiyonu kullanılmaktadır. Kernelları cihaz üzerinde çalışacak C/C++ fonksiyonları gibi düşünebiliriz. Kerneller veri-paralel veya iş-paralel olabilirler, fakat önemli nokta paralel olmalarıdır.

#### İş-Parçaları, İş-Öbekleri(Work-item,Work-group)

İş-parçaları OpenCL paralel çalıştırma hiyerarşisinde en küçük parçalardır. Bir kernel her bir iş parçası için çalıştırılır. Her bir iş-parçasının kendi hafızası bulunur ve bu hafıza \_\_private sıfatıyla ayrılır. İş-parçaları gruplanarak iş-öbeklerini oluştururlar, aynı iş-öbeğindeki tüm iş-parçalarının paralelde birlikte çalıştırılacağı garanti altına alınmıştır. Her iş-öbeğinin, iş-parçaları arasında paylaşılan bir hafızası vardır ve bu hafıza \_\_local sıfatıyla ayrılır. Farklı iş-öbekleri birbirlerinin \_\_local hafızalarına erişemezler. Çalıştırılacak iş-parçası sayısına genel iş büyüklüğü(global work size) denilir, her bir öbekteki iş parçacığı sayısı ise yerel iş büyüklüğü(local work size) ile belirlenir. Tahmin edilebileceği gibi genel iş büyüklüğü, yerel iş büyüklüğünün tam katı olmalıdır. \_\_global ve \_\_constant hafıza alanları ise tüm iş-parçaları tarafından erişilebilen hafıza alanlarıdır. 

#### OpenCL Paralel İşleme Mantığı

OpenCL çalışma prensibi paralelliği daha etkinleştirebilmek için boyutlu bir yapıdadır. Tek boyutlu bir diziyi işlemek için tek boyutlu bir iş-parçacığı mantığı kullanabiliriz, fakat resim veya 3 boyutlu texture gibi çok boyutlu bir yapıyı işlemek istiyorsak çok boyutlu bir iş-parçacığı mantığı kullanmalıyız. Örneğin 640\*480 büyüklüğündeki 5 resmi tek bir kernel üzerinden pixel bazlı olarak işlemek istersek, 1.çalışma boyutunu 640, 2.çalışma boyutunu 480 ve 3.çalışma boyutunu 5 olarak atayabiliriz, bu durumda 640\*480\*5 = 1536000 adet iş-parçası çalıştırılacaktır, eğer yerel iş büyüklüğünü 64 olarak seçersek, 1536000 / 64 = 24000 adet iş-öbeği çalıştırılacaktır.

#### OpenCL Çalışma Dizi Toplama Örneği

Standart C dilinde 2 diziyi toplama işlemini aşağıdaki gibi kod ile gerçekleştirebiliriz

```
void diziTopla(  

  int n,  

  const float *a,  

  const float *b,  

  float *result  

```

){  

```
  int i;  

  for(i = 0 ; i < n ; i++)  

     result[i] = a[i] + b[i];  

}  

```

Bu işlemi OpenCL ile yapmak için ise aşağıdaki gibi paralel çalışacak bir kernel yazabiliriz, bu kernel her iş-parçası için 1 kere çalıştırılacak, dolayısıyla iş parçası indisi ile o kernel da işlenecek dizi elemanlarına ulaşıyoruz. Bu durumda tek boyutlu bir iş büyüklüğü kullanabiliriz, genel iş büyüklüğünü dizinin uzunluğuna ayarlarsak her bir dizi elemanı için bir iş parçası çalıştırılmasını sağlayabiliriz.

```
__kernel void diziTopla(  

  __global const float *a,  

  __global const float *b,  

  __global float *result  

```

){  

```
  int id = get_global_id(0); // iş parçası indisini alıyor  

  result[id] = a[id] + b[id];
}
```

Ayrıca bakınız
--------------

* Derin öğrenme yazılımlarının karşılaştırılması

Dış bağlantılar
---------------

* 
* 
* 
* 
* 
*

Kaynakça
--------

1. ↑  "Arşivlenmiş kopya". 10 Ocak 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Ocak 2017.

| * g
* t
* d
Paralel hesaplama |
| --- |
| Genel | Yüksek başarımlı hesaplama **·**  Kümesel hesaplama **·**  Dağıtık hesaplama **·**  Dağıtımlı hesaplama **·**  Bulut bilişim **·**  Grafik işlemci biriminde genel amaçlı hesaplama **·**  Bilgisayar ağı |
| Koşutluk düzeyleri | Bit **·**  Komut **·**  Veri **·**  Görev |
| İzlekler | Üst izlekleme **·**  Yüksek izlekleme |
| Kuram | Amdahl yasası **·**  Gustafson yasası **·**  Karp-Flatt ölçütü **·**  Yavaşlama **·**  Hızlanma |
| Ögeler | İşlem **·**  İzlek **·**  Lif **·**  PRAM **·**  Buyruk penceresi **·**  Dizi |
| Eşgüdüm | Çoklu işleme **·**  Çoklu izlekleme **·**  Bellek tutarlılığı **·**  Ön bellek tutarlılığı **·**  Engel **·**  Eşzamanlılaştırma **·**  Aşamalı uygulama denetimi |
| Programlama | Modeller (Gizli koşutluk **·**  Açık koşutluk **·**  Koşutzamanlılık) |
| Donanım | Flynn Sınıflandırması (SISD • SIMD • MISD • MIMD) **·** Boru hattı yöntemi **·**  Çoklu işleme (Bakışımlı **·**  Bakışımsız) **·**  Bellek (NUMA **·**  COMA **·**  Dağıtık **·**  Paylaşımlı **·**  Dağıtık paylaşımlı) **·**  SMT
MPP **·**  Sayılüstü **·**  Dizi işlemcisi **·**  Süper bilgisayar **·**  *Beowulf* |
| APIler | POSIX Threads **·**  OpenMP **·**  MPI **·**  OpenCL **·**  UPC **·**  Intel İzlekleme Yapıtaşları **·**  Boost.Thread **·**  Evrensel Diziler **·**  Charm++ **·**  Cilk **·**  CUDA **·**  PVM |
| Sorunsallar | Olağanüstü koşutluk **·**  Büyük Sorun **·**  Yazılım durağanlığı  **·**  Ölçeklenebilirlik  **·**  Yarışma koşulları  **·**  Deadlock  **·**  Gerekirci algoritma |
| 
* Kategori **Kategori**
* Commons sayfası Paralel hesaplama

 |

|  |  |
| --- | --- |
| Otorite kontrolü Bunu Vikiveri'de düzenleyin | 
* LCCN: sh2011002885
* NLI: 987007599892205171

 |