/* Использование возможностей OpenCL для ускорения расчетов и обсуждение применения в торговле. УРОК ПЕРВЫЙ: Основные принципы запуска программ в ядрах OpenCL. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ЧАСТЬ ПЕРВАЯ: Подготовительные операции настройка ПО и оборудования. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ссылки на русском: OpenCL: Мост в параллельные миры https://www.mql5.com/ru/articles/405 OpenCL: от наивного кодирования - к более осмысленному https://www.mql5.com/ru/articles/407 Как установить и использовать в расчетах OpenCL https://www.mql5.com/ru/articles/690 OpenCl и инструменты для него. Отзывы и впечатления. https://www.mql5.com/ru/forum/137422 Ссылки на английском: Matthew Scarpino "OpenCL in Action. How to accelerate graphics and computations." http://analog.nik.uni-obuda.hu/ParhuzamosProgramozasuHardver/02_GPGPU-Irodalom/03_CUDA-Irodalom_LovasIstvan/OpenCl/Books/%5BMatthew_Scarpino%5D_OpenCL_in_Action_How_to_Accele(Bookos.org).pdf Программы для тестирования OpenCL и настройки: GPU Caps viewer http://www.geeks3d.com/20171031/gpu-caps-viewer-1-37-0-released/ TechPowerUp GPU-Z https://www.techpowerup.com/download/techpowerup-gpu-z/ MSI Afterburner http://download.msi.com/uti_exe/vga/MSIAfterburnerSetup.zip Intel OpenCL SDK https://www.mql5.com/go?link=https://software.intel.com/en-us/intel-opencl Download AMD Drivers & Software for Radeon, FirePro, APU, CPU, desktops, and laptops http://support.amd.com/en-us/download Пример из кодобазы: OpenCL Test - скрипт для MetaTrader 5 https://www.mql5.com/ru/code/825 ШАГ 0. С чего начать? 1. Установить программу для отображения параматров OpenCL (например TechPowerUp GPU-Z) - для контроля правильности установки OpenCL. 2. Установить драйвера для видеокарты и/или процессора. проконтролировать (см. п.1), что OpenCL версии не ниже 1.1 установлен для оборудования. ШАГ 1. Первые эксперименты. Пробуем запускать программы из комплекта поставки МТ5: Wavelet.mq5 MatrixMult.mq5 FFT.mq5 BitonicSort.mq5 Пример из статьи КАК УСТАНОВИТЬ И ИСПОЛЬЗОВАТЬ В РАСЧЕТАХ OPENCL https://www.mql5.com/ru/articles/690 opencl_sample.mq5 Попробуем для разминки решить следующую задачку: Отправить в кернел массив из двух элементов, поменять значения элементов местами и вернуть обратно. Первый вариант решения: ~~~~~~~~~~~~~~~~~~~~~~~ Prog01_01A.mq5 Результат выполнения: 2017.12.11 22:00:59.128 LibreOCL_v1.002 (VTBR-12.17,M1) x[0]=1111.1 x[1]=9999.9 2017.12.11 22:00:59.136 LibreOCL_v1.002 (VTBR-12.17,M1) OpenCL: GPU device 'Pitcairn' selected 2017.12.11 22:00:59.136 LibreOCL_v1.002 (VTBR-12.17,M1) OpenCL found, Хендл на контекст OpenCL:65536 Error:0 2017.12.11 22:00:59.190 LibreOCL_v1.002 (VTBR-12.17,M1) OpenCL program create, Хендл программы OpenCL:65537 Error:0 2017.12.11 22:00:59.191 LibreOCL_v1.002 (VTBR-12.17,M1) OpenCL kernel create, Хендл кернела OpenCL:65538 Error:0 2017.12.11 22:00:59.191 LibreOCL_v1.002 (VTBR-12.17,M1) OpenCL buffer create, Хендл буфера OpenCL:65539 Error:0 2017.12.11 22:00:59.191 LibreOCL_v1.002 (VTBR-12.17,M1) В буфер записано 2 элементов 2017.12.11 22:00:59.191 LibreOCL_v1.002 (VTBR-12.17,M1) OpenCL set buffer, error:0 2017.12.11 22:00:59.191 LibreOCL_v1.002 (VTBR-12.17,M1) OpenCL execute, error:0 2017.12.11 22:00:59.194 LibreOCL_v1.002 (VTBR-12.17,M1) Из буфера прочитано 2 элементов 2017.12.11 22:00:59.194 LibreOCL_v1.002 (VTBR-12.17,M1) x[0]=9999.9 x[1]=1111.1 Обратите внимание на строку использованную при создании программы для кернела и содержащую инструкцию: CLProgramCreate(h_CL_Context,CL_Source,BuildLog) Здесь последний параметр строкового типа BuildLog содержит лог компиляции программы отправленной в кернел, если при компиляции обнаружены ошибки. Например, если мы намеренно внесём ошибку в код функции: //============================================================================================= MQL5 === // Код функций для OpenCL //------------------------------------------------------------------------------------------------------ const string CL_Source= "kernel void Exch(global double *ix) \r\n" "{ \r\n" " double z; XXX \r\n" " z=ix[0]; \r\n" " ix[0]=ix[1]; \r\n" " ix[1]=z; \r\n" "} \r\n"; То получим следующий лог: "C:\Users\User9764\AppData\Local\Temp\OCL82CA.tmp.cl", line 3: error: identifier "XXX" is undefined double z; XXX ^ "C:\Users\User9764\AppData\Local\Temp\OCL82CA.tmp.cl", line 4: error: "z" has already been declared in the current scope z=ix[0]; ^ "C:\Users\User9764\AppData\Local\Temp\OCL82CA.tmp.cl", line 3: warning: variable "z" was declared but never referenced double z; XXX ^ 2 errors detected in the compilation of "C:\Users\User9764\AppData\Local\Temp\OCL82CA.tmp.cl". Frontend phase failed compilation. Второй вариант решения: ~~~~~~~~~~~~~~~~~~~~~~~ Основная программа: Prog01_01B.mq5 Кернел-программа, подключенная к основной программе как ресурс: Prog01_01B.cl