Bu maddedeki bilgilerin için ek kaynaklar gerekli.Mart 2020) () ( |
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 işlemcilerde de hesaplama yapılabilmektedir.
![image](https://www.wikipedia.tr-tr.nina.az/image/aHR0cHM6Ly93d3cud2lraXBlZGlhLnRyLXRyLm5pbmEuYXovaW1hZ2UvYUhSMGNITTZMeTkxY0d4dllXUXVkMmxyYVcxbFpHbGhMbTl5Wnk5M2FXdHBjR1ZrYVdFdlkyOXRiVzl1Y3k5aUwySTRMMDl3Wlc1RFRDNXFjR2M9LmpwZw==.jpg)
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
Dış bağlantılar
- http://www.khronos.org/opencl/9 Ağustos 2011 tarihinde Wayback Machine sitesinde .
- http://www.khronos.org/registry/cl/29 Mayıs 2012 tarihinde Wayback Machine sitesinde .
- http://www.opencldev.com/24 Haziran 2012 tarihinde Wayback Machine sitesinde .
- http://developer.nvidia.com/opencl10 Haziran 2012 tarihinde Wayback Machine sitesinde .
- http://developer.amd.com/zones/OpenCLZone/[]
- https://developer.apple.com/softwarelicensing/agreements/opencl.html16 Nisan 2012 tarihinde Wayback Machine sitesinde .
Kaynakça
- ^ "Arşivlenmiş kopya". 10 Ocak 2017 tarihinde kaynağından . Erişim tarihi: 11 Ocak 2017.
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
Bu maddedeki bilgilerin dogrulanabilmesi icin ek kaynaklar gerekli Lutfen guvenilir kaynaklar ekleyerek maddenin gelistirilmesine yardimci olun Kaynaksiz icerik itiraz konusu olabilir ve kaldirilabilir Kaynak ara OpenCL haber gazete kitap akademik JSTOR Mart 2020 Bu sablonun nasil ve ne zaman kaldirilmasi gerektigini ogrenin OpenCL Open Computing Language Apple tarafindan 2008 yilinda kar amaci gutmeyen teknoloji sirketleri birligi Khronos Group a onerilen kabul gordukten sonra spesifikasyonu pek cok sirketin katkilariyla hazirlanan heterojen hesaplama platformudur OpenCL destekli grafik islemcileri genel amacli islemciler ve FPGA ler gibi farkli platformlarda hesaplama yapilmasina olanak saglar OpenCL AMD Intel NVIDIA ve ARM tarafindan desteklenmektedir Ayrica OpenCL kullanilarak Sony Playstation cihazlarinda kullanilan islemcilerde de hesaplama yapilabilmektedir OpenCL nin logosu OpenCL C Dili OpenCL destekli cihazlarda bundan sonra cihaz olarak gececektir calistirilacak kodun yazilmasi icin OpenCL C de denilen C programlama dilinin ISO IEC 9899 1999 surumunu baz alan bir programlama dili gelistirilmistir OpenCL C dilinde paralelligin daha iyi kullanilabilmesine olanak saglamak icin C programlama dilinden bazi farkliliklara gidilmistir Bu farkliliklardan en cok goze carpanlari Fonksiyon isaretcileri function pointers kaldirilmistir Ozyineleme recursion kaldirilmistir Degisken uzunluklu diziler kaldirilmistir Vektor veri turleri eklenmistir Senkronizasyon ve calisma modeline iliskin pek cok fonksiyon eklenmistir Hafiza yonetimi icin global local constant ve private sifatlari eklenmistir OpenCL Calisma Mantigi Kernel Kernel cihaz uzerinde calistirilabilen en temel kod dizisine verilen isimdir Kerneller OpenCL in ilk versiyonlarinda C dilinde yaziliyordu Artik C dilinin guclu imkanlari da kullanilmaktadir C 14 versiyonu kullanilmaktadir Kernellari cihaz uzerinde calisacak C C fonksiyonlari gibi dusunebiliriz Kerneller veri paralel veya is paralel olabilirler fakat onemli nokta paralel olmalaridir Is Parcalari Is Obekleri Work item Work group Is parcalari OpenCL paralel calistirma hiyerarsisinde en kucuk parcalardir Bir kernel her bir is parcasi icin calistirilir Her bir is parcasinin kendi hafizasi bulunur ve bu hafiza private sifatiyla ayrilir Is parcalari gruplanarak is obeklerini olustururlar ayni is obegindeki tum is parcalarinin paralelde birlikte calistirilacagi garanti altina alinmistir Her is obeginin is parcalari arasinda paylasilan bir hafizasi vardir ve bu hafiza local sifatiyla ayrilir Farkli is obekleri birbirlerinin local hafizalarina erisemezler Calistirilacak is parcasi sayisina genel is buyuklugu global work size denilir her bir obekteki is parcacigi sayisi ise yerel is buyuklugu local work size ile belirlenir Tahmin edilebilecegi gibi genel is buyuklugu yerel is buyuklugunun tam kati olmalidir global ve constant hafiza alanlari ise tum is parcalari tarafindan erisilebilen hafiza alanlaridir OpenCL Paralel Isleme Mantigi OpenCL calisma prensibi paralelligi daha etkinlestirebilmek icin boyutlu bir yapidadir Tek boyutlu bir diziyi islemek icin tek boyutlu bir is parcacigi mantigi kullanabiliriz fakat resim veya 3 boyutlu texture gibi cok boyutlu bir yapiyi islemek istiyorsak cok boyutlu bir is parcacigi mantigi kullanmaliyiz Ornegin 640 480 buyuklugundeki 5 resmi tek bir kernel uzerinden pixel bazli olarak islemek istersek 1 calisma boyutunu 640 2 calisma boyutunu 480 ve 3 calisma boyutunu 5 olarak atayabiliriz bu durumda 640 480 5 1536000 adet is parcasi calistirilacaktir eger yerel is buyuklugunu 64 olarak secersek 1536000 64 24000 adet is obegi calistirilacaktir OpenCL Calisma Dizi Toplama Ornegi Standart C dilinde 2 diziyi toplama islemini asagidaki gibi kod ile gerceklestirebiliriz void diziTopla int n const float a const float b float result int i for i 0 i lt n i result i a i b i Bu islemi OpenCL ile yapmak icin ise asagidaki gibi paralel calisacak bir kernel yazabiliriz bu kernel her is parcasi icin 1 kere calistirilacak dolayisiyla is parcasi indisi ile o kernel da islenecek dizi elemanlarina ulasiyoruz Bu durumda tek boyutlu bir is buyuklugu kullanabiliriz genel is buyuklugunu dizinin uzunluguna ayarlarsak her bir dizi elemani icin bir is parcasi calistirilmasini saglayabiliriz kernel void diziTopla global const float a global const float b global float result int id get global id 0 is parcasi indisini aliyor result id a id b id Ayrica bakinizDerin ogrenme yazilimlarinin karsilastirilmasiDis baglantilarhttp www khronos org opencl 9 Agustos 2011 tarihinde Wayback Machine sitesinde http www khronos org registry cl 29 Mayis 2012 tarihinde Wayback Machine sitesinde http www opencldev com 24 Haziran 2012 tarihinde Wayback Machine sitesinde http developer nvidia com opencl10 Haziran 2012 tarihinde Wayback Machine sitesinde http developer amd com zones OpenCLZone olu kirik baglanti https developer apple com softwarelicensing agreements opencl html16 Nisan 2012 tarihinde Wayback Machine sitesinde Kaynakca Arsivlenmis kopya 10 Ocak 2017 tarihinde kaynagindan Erisim tarihi 11 Ocak 2017