OpenCL ile Çalışma

OpenCL programları, OpenCL 1.1 (veya daha üstünü) destekleyen ekran kartları üzerinde hesaplamalar yapma amacıyla kullanılır. Modern ekran kartları, gelen veri akışıyla ilgi basit matematiksel işlemleri eş-anlı olarak gerçekleştirebilecek, özelleştirilmiş yüzlerce küçük işlemci içerir. OpenCL dili bu işlemcileri kullanmak amacıyla paralel hesaplamayı düzenler. Böylece bazı görevler için daha üstün bir işlem hızı elde etmemizi sağlar.

Bazı ekran kartlarında double tipli sayılar varsayılan olarak devre dışı bırakılmıştır. Bu 5105 kodlu derleme hatasına yol açabilir. double tipli sayı desteğini etkinleştirmek için, şu direktifi OpenCL programına ekleyin: #pragma OPENCL EXTENSION cl_khr_fp64 : enable. Ekran kartınız double tipini desteklemiyorsa bu direktif işe yaramaz.

OpenCL kaynak kodunun ayrı CL dosyalarına yazılması tavsiye edilir. Bunlar daha sonra kaynak değişkenleri yardımıyla MQL5 programına eklenebilir.

OpenCL programlarında hata işleme

Bir OpenCL programındaki son hata hakkında bilgi almak için, son hatanın kodunu ve açıklamasını geri döndüren CLGetInfoInteger ve CLGetInfoString fonksiyonlarını kullanın.

Son OpenCL hatasının kodu: Son OpenCL hatasının kodunu almak için, handle parametresini göz ardı ederek (sıfır belirtilebilir) CLGetInfoInteger'ı çağırın. Hataların açıklamaları: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS.

Bilinmeyen bir hata kodu için "Bilinmeyen OpenCL hatası: N" dizgesi geri döndürülür, burada N hata kodudur. Örnek:

//--- son hatanın kodu alınırken handle parametresi göz ardı edilir
intcode= (int)CLGetInfoInteger(0,CL_LAST_ERROR);

Son OpenCL hatasının açıklaması: Son OpenCL hatasının açıklamasını almak için CLGetInfoString'i çağırın. Son OpenCL hatasının kodu handle parametresi olarak iletilmelidir.

Hataların açıklamaları: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Hata kodu yerine CL_LAST_ERROR iletilirse, fonksiyon yine son hatanın açıklamasını geri döndürecektir. Örnek:

//--- son OpenCL hatasının kodunu al
int   code= (int)CLGetInfoInteger(0,CL_LAST_ERROR);
stringdesc;// hata açıklamasını almak için
 
//--- hata açıklamasını almak için hata kodunu kullan
if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
 desc="OpenCL hatasının açıklaması alınamıyor,"+ (string)GetLastError();
Print(desc);
 
//--- son OpenCL hatasının açıklamasını, son OpenCL hatasının kodu olmadan almak için CL_LAST_ERROR'u ilet  
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION,desc))
 desc="OpenCL hatasının açıklaması alınamıyor,"+ (string)GetLastError();
Print(desc);;

Hata açıklaması olarak dahili numaralandırmanın adı geri döndürülür. Ayrıntılı açıklamaları buradan bulabilirsiniz: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Örneğin, CL_INVALID_KERNEL_ARGS değeri, "Bazı çekirdek argümanları ayarlanmadığında veya geçersiz olduğunda çekirdeği kuyruğa alırken geri döndürülür" anlamına gelir.

OpenCL ile çalışan programlar için fonksiyonlar:

Fonksiyon

Eylem

CLHandleType

Bir OpenCL tanıtıcı değerinin (handle) tipine, ENUM_OPENCL_HANDLE_TYPE sayımının değerlerinden biri şeklinde dönüş yapar

CLGetInfoInteger

Bir OpenCL aygıtı veya nesnesi için bir tamsayı özelliğinin değerine dönüş yapar

CLContextCreate

Bir OpenCL bağlamı oluşturur

CLContextFree

Bir OpenCL bağlamını siler

CLGetDeviceInfo

OpenCL sürücüsünden aygıtın özelliğini alır

CLProgramCreate

Bir kaynak kodundan OpenCL programı oluşturur

CLProgramFree

Bir OpenCL programını siler

CLKernelCreate

Bir OpenCL başlatma fonksiyonu oluşturur

CLKernelFree

OpenCL başlatma fonksiyonunu siler

CLSetKernelArg

OpenCL fonksiyonu için parametre ayarlar

CLSetKernelArgMem

Bir OpenCL tamponunu OpenCL fonksiyonunun parametresi olarak ayarlar

CLSetKernelArgMemLocal

Yerel tamponu kernel fonksiyonunun bir argümanı olarak ayarlar

CLBufferCreate

Bir OpenCL tamponu oluşturur

CLBufferFree

Bir OpenCL tamponunu siler

CLBufferWrite

Bir diziyi OpenCL tamponuna yazar

CLBufferRead

OpenCL tamponunu bir diziye okur

CLExecute

Bir OpenCL programını çalıştırır

CLExecutionStatus

OpenCL programının çalışma durumuna dönüş yapar

Ayrıca Bakınız

OpenCL, Kaynaklar