Скачать MetaTrader 5

Скрипты: OpenCL Test

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MetaQuotes
Админ
25405
Renat Fatkhullin  

OpenCL Test:

Вот небольшой рабочий пример расчета фрактала Мандельброта в OpenCL, который кардинально ускоряет расчеты по сравнению с софтверной реализацией. Расчет на OpenCL получился в 100 раз быстрее.



Автор: Renat Fatkhullin

Snaf
111
Snaf  
Ну, теперь, по крайней мере за фракталы Мандельброта, я абсолютно спокоен :)
Stanislav
189
Stanislav  
Как это чудо использовать в торговле?
Nikolay Demko
12596
Nikolay Demko  
Svetosha:
Как это чудо использовать в торговле?

Помедитировать, знаете ли расслабляет :)

Это же скрипт демонстрирующий возможности технологии, какое тут применение.

Aleksey Rodionov
4328
Aleksey Rodionov  

Яйцеклетка перед зачатием. До сих пор не понимаю зачем это выкладывать, лучше бы полезное что делали и не доработанное.
Stanislav
189
Stanislav  
Urain:

Помедитировать, знаете ли расслабляет :)

Это же скрипт демонстрирующий возможности технологии, какое тут применение.

А толку от этих возможностей если  они не приносят пользы)))
Nikolay Demko
12596
Nikolay Demko  
Svetosha:
А толку от этих возможностей если  они не приносят пользы)))
Братья Райт пролетели всего 20 метров (так сказать демонстрационный полёт), толк от их изобретения межконтинентальные перелёты (как говорится почувствуйте разницу).
Sceptic Philozoff
Модератор
17841
Sceptic Philozoff  
Zeleniy: Яйцеклетка перед зачатием. До сих пор не понимаю зачем это выкладывать, лучше бы полезное что делали и не доработанное.
Svetosha: А толку от этих возможностей если  они не приносят пользы)))

Нововведения очень часто встречают в штыки вот такие "сермяжные практики", которые судят о вселенских проблемах с точки зрения своего носа, для которого ничего не пахнет.

А потом, когда польза видна всем, они о своих наездах благополучно забывают.

Alexey Volchanskiy
23034
Alexey Volchanskiy  
Mathemat:

Нововведения очень часто встречают в штыки вот такие "сермяжные практики", которые судят о вселенских проблемах с точки зрения своего носа, для которого ничего не пахнет.

А потом, когда польза видна всем, они о своих наездах благополучно забывают.

Да, OpenCL  - это реально круто. Честно говоря, давно не отслеживал ситуацию с пятеркой. А что, взаимопоглощение ордеров так и осталось?
o_o
Модератор
24300
o_o  
VDev:
А что, взаимопоглощение ордеров так и осталось?

оно не то чтоб осталось.

оно по другому и быть не может. 

MetaQuotes
Админ
25405
Renat Fatkhullin  

Со следующего билда будут доступны новые возможности по созданию графических ресурсов на лету с помощью функций ResourceCreate().

Вот переписанный и упрощенный скрипт, который обходится без сброса картинок на диск, работает быстрее и без конфликтов доступа к ресурсам на диске:

//+------------------------------------------------------------------+
//|                                                   OpenCLTest.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//---
#define SIZE_X 512
#define SIZE_Y 512
//+------------------------------------------------------------------+
//| OpenCL function code                                             |
//+------------------------------------------------------------------+
const string cl_src=
                    "__kernel void MFractal(                                    \r\n"
                    "                       float x0,                           \r\n"
                    "                       float y0,                           \r\n"
                    "                       float x1,                           \r\n"
                    "                       float y1,                           \r\n"
                    "                       uint  max,                          \r\n"
                    "              __global uint *out)                          \r\n"
                    "  {                                                        \r\n"
                    "   size_t  w = get_global_size(0);                         \r\n"
                    "   size_t  h = get_global_size(1);                         \r\n"
                    "   size_t gx = get_global_id(0);                           \r\n"
                    "   size_t gy = get_global_id(1);                           \r\n"
                    "   float dx = x0 + gx * (x1-x0) / (float) w;               \r\n"
                    "   float dy = y0 + gy * (y1-y0) / (float)h;                \r\n"
                    "   float x  = 0;                                           \r\n"
                    "   float y  = 0;                                           \r\n"
                    "   float xx = 0;                                           \r\n"
                    "   float yy = 0;                                           \r\n"
                    "   float xy = 0;                                           \r\n"
                    "   uint i = 0;                                             \r\n"
                    "   while ((xx+yy)<4 && i<max)                              \r\n"
                    "     {                                                     \r\n"
                    "      xx = x*x;                                            \r\n"
                    "      yy = y*y;                                            \r\n"
                    "      xy = x*y;                                            \r\n"
                    "      y = xy+xy+dy;                                        \r\n"
                    "      x = xx-yy+dx;                                        \r\n"
                    "      i++;                                                 \r\n"
                    "     }                                                     \r\n"
                    "   if(i==max)                                              \r\n"
                    "      out[w*gy+gx] = 0;                                    \r\n"
                    "   else                                                    \r\n"
                    "      out[w*gy+gx] = (uint)((float)0xFFFFFF/(float)max)*i; \r\n"
                    "  }                                                        \r\n";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int cl_ctx;
   int cl_prg;
   int cl_krn;
   int cl_mem;
//--- initializing OpenCL objects
   if((cl_ctx=CLContextCreate())==INVALID_HANDLE)
     {
      Print("OpenCL not found");
      return;
     }
   if((cl_prg=CLProgramCreate(cl_ctx,cl_src))==INVALID_HANDLE)
     {
      CLContextFree(cl_ctx);
      Print("OpenCL program create failed");
      return;
     }
   if((cl_krn=CLKernelCreate(cl_prg,"MFractal"))==INVALID_HANDLE)
     {
      CLProgramFree(cl_prg);
      CLContextFree(cl_ctx);
      Print("OpenCL kernel create failed");
      return;
     }
   if((cl_mem=CLBufferCreate(cl_ctx,SIZE_X*SIZE_Y*sizeof(uint),CL_MEM_READ_WRITE))==INVALID_HANDLE)
     {
      CLKernelFree(cl_krn);
      CLProgramFree(cl_prg);
      CLContextFree(cl_ctx);
      Print("OpenCL buffer create failed");
      return;
     }
//--- getting ready for execution
   float x0       =-2;
   float y0       =-0.5;
   float x1       =-1;
   float y1       = 0.5;
   uint  max      = 20000;
   uint  offset[2]={0,0};
   uint  work  [2]={SIZE_X,SIZE_Y};
   string objname ="OpenCL_"+IntegerToString(ChartID());
   string resname ="Mandelbrot_"+IntegerToString(ChartID());
//--- setting unchangeable OpenCL function parameters
   CLSetKernelArg(cl_krn,4,max);
   CLSetKernelArgMem(cl_krn,5,cl_mem);
//--- creating the object for graphics display
   ObjectCreate(0,objname,OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,4);
   ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,26);
//--- create initial empty picture
   uint buf[];

   ArrayResize(buf,SIZE_X*SIZE_Y);
   ResourceCreate(resname,buf,SIZE_X,SIZE_Y,0,0,SIZE_X,COLOR_FORMAT_XRGB_NOALPHA);
   ObjectSetString(0,objname,OBJPROP_BMPFILE,"::"+resname);
//--- rendering, till we are not stopped from the outside
   while(!IsStopped())
     {
      uint x=GetTickCount();
      //--- setting floating parameters
      CLSetKernelArg(cl_krn,0,x0);
      CLSetKernelArg(cl_krn,1,y0);
      CLSetKernelArg(cl_krn,2,x1);
      CLSetKernelArg(cl_krn,3,y1);
      //--- rendering the frame
      CLExecute(cl_krn,2,offset,work);
      //--- taking the frame data
      CLBufferRead(cl_mem,buf);
      //--- outputting the rendering time
      Comment(IntegerToString(GetTickCount()-x)+" msec per frame");
      //--- saving the frame in memory and drawing it
      ResourceCreate(resname,buf,SIZE_X,SIZE_Y,0,0,SIZE_X,COLOR_FORMAT_XRGB_NOALPHA);
      ChartRedraw();
      //--- a small pause and parameters update for the next frame
      Sleep(10);
      x0+=0.001f;
      x1-=0.001f;
      y0+=0.001f;
      y1-=0.001f;
     }
//--- removing OpenCL objects
   CLBufferFree(cl_mem);
   CLKernelFree(cl_krn);
   CLProgramFree(cl_prg);
   CLContextFree(cl_ctx);
//--- remove object
   ObjectDelete(0,objname);
  }
//+------------------------------------------------------------------+


Тем самым можно создавать любые динамические 32 битные изображения с альфа каналами для детальной отрисовки.

Динамически созданные ресурсы попадают в менеджер ресурсов и доступны всем MQL5 программам терминала.


123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий