Скрипты: OpenCL Test

 

OpenCL Test:

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



Автор: Renat Fatkhullin

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

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

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

 

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

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

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

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

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

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

 
Mathemat:

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

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

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

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

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

 

Со следующего билда будут доступны новые возможности по созданию графических ресурсов на лету с помощью функций 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 программам терминала.


Причина обращения: