Original_NNB/MQL5/Include/NeuroNetworksBook/realization/opencl.mqh
super.admin e81e22b7b8 convert
2025-05-30 16:15:14 +02:00

68 lines
No EOL
5.8 KiB
MQL5

//+------------------------------------------------------------------+
//| opencl.mqh |
//| Copyright 2021, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link "https://www.mql5.com"
//+------------------------------------------------------------------+
//| Подключаем библиотеки |
//+------------------------------------------------------------------+
#include <OpenCL\OpenCL.mqh>
//+------------------------------------------------------------------+
//| Class CMyOpenCL |
//| Назначение: Класс организации работы с контекстом OpenCL |
//+------------------------------------------------------------------+
class CMyOpenCL : public COpenCL
{
public:
CMyOpenCL(void) {};
~CMyOpenCL(void) {};
template<typename T>
int AddBufferFromArray(T &data[],const uint data_array_offset,const uint data_array_count,const uint flags);
bool CheckBuffer(const int index);
};
//+------------------------------------------------------------------+
//| Метод создания буфера в контексте OpenCL |
//+------------------------------------------------------------------+
template<typename T>
int CMyOpenCL::AddBufferFromArray(T &data[],const uint data_array_offset,const uint data_array_count,const uint flags)
{
//--- Поисе свободного элемента в динамическом массиве указателей
int result=-1;
for(int i=0; i<m_buffers_total; i++)
{
if(m_buffers[i]!=INVALID_HANDLE)
continue;
result=i;
break;
}
//--- Если всободный элементне найден добавляем новый элемен в массив
if(result<0)
{
if(ArrayResize(m_buffers,m_buffers_total+1)>0)
{
m_buffers_total=ArraySize(m_buffers);
result=m_buffers_total-1;
m_buffers[result]=INVALID_HANDLE;
}
else
return result;
}
//--- Создаём буфер в контексте OpenCL
if(!BufferFromArray(result,data,data_array_offset,data_array_count,flags))
return -1;
//---
return result;
}
//+------------------------------------------------------------------+
//| Метод проверки действительности указателя на буфер по индексу |
//| в динамическом массиве |
//+------------------------------------------------------------------+
bool CMyOpenCL::CheckBuffer(const int index)
{
if(index<0 || index>m_buffers_total)
return false;
return m_buffers[index]!=INVALID_HANDLE;
}
//+------------------------------------------------------------------+