LibreOCL/Lesson01/Part01/Book01_01/Book01_01.txt
super.admin 10c769ed25 convert
2025-05-30 15:03:43 +02:00

119 lines
5.4 KiB
Text

/*
Использование возможностей 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