Skripte: OpenCL Test - Seite 2

 
Svetosha:
Und was nützen diese Möglichkeiten, wenn sie nicht nützlich sind)))))))
Die Gebrüder Wright flogen nur 20 Meter weit (sozusagen ein Demonstrationsflug), der Nutzen ihrer Erfindung liegt in Interkontinentalflügen (wie man sagt, den Unterschied spüren).
 
Zeleniy: Die Eizelle vor der Empfängnis. Ich verstehe immer noch nicht, warum man es löschen sollte, es wäre besser, etwas Nützliches zu tun, das noch nicht abgeschlossen ist.
Svetosha: Und die Nutzung dieser Möglichkeiten, wenn sie nicht nützlich sind))))))

Innovationen werden sehr oft im Bajonett von solchen "sermyazhnye Praktikern" getroffen, die über universelle Probleme aus der Sicht ihrer Nase urteilen, für die nichts riecht.

Und dann, wenn der Nutzen für alle sichtbar ist, vergessen sie getrost ihre Angriffe.

 
Mathemat:

Die Neuerungen werden sehr oft von solchen "grauen Praktikern" in den Wind geschlagen, die universelle Probleme aus der Sicht ihrer Nase beurteilen, für die nichts riecht.

Und dann, wenn alle den Nutzen sehen, vergessen sie ihre Angriffe getrost.

Ja, OpenCL ist wirklich cool. Um ehrlich zu sein, habe ich die Situation mit 5 schon lange nicht mehr verfolgt. Ist das mit der Zwischenabsorption von Aufträgen immer noch dasselbe?
 
VDev:
Ist die Auftragsabwicklung noch vorhanden?

Es geht nicht darum, dass sie noch da ist.

Es kann auch gar nicht anders sein.

 

Ab dem nächsten Build werden neue Funktionen zur Verfügung stehen, um Grafik-Ressourcen mit ResourceCreate()-Funktionen im laufenden Betrieb zu erstellen.

Hier ist ein umgeschriebenes und vereinfachtes Skript, das ohne Dumping von Bildern auf die Festplatte auskommt, schneller arbeitet und ohne Ressourcenzugriffskonflikte auf der Festplatte:

//+------------------------------------------------------------------+
//|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-Funktionscode|
//+------------------------------------------------------------------+
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";
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
   int cl_ctx;
   int cl_prg;
   int cl_krn;
   int cl_mem;
//--- Initialisierung von OpenCL-Objekten
   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;
     }
//--- Vorbereitung auf die Ausführung
   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());
//--- Einstellung unveränderlicher OpenCL-Funktionsparameter
   CLSetKernelArg(cl_krn,4,max);
   CLSetKernelArgMem(cl_krn,5,cl_mem);
//--- Erstellen des Objekts für die Grafikanzeige
   ObjectCreate(0,objname,OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,4);
   ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,26);
//--- anfänglich leeres Bild erstellen
   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, bis wir nicht mehr von außen aufgehalten werden
   while(!IsStopped())
     {
      uint x=GetTickCount();
      //--- Einstellen von gleitenden Parametern
      CLSetKernelArg(cl_krn,0,x0);
      CLSetKernelArg(cl_krn,1,y0);
      CLSetKernelArg(cl_krn,2,x1);
      CLSetKernelArg(cl_krn,3,y1);
      //--- Rendering des Rahmens
      CLExecute(cl_krn,2,offset,work);
      //--- Übernahme der Rahmendaten
      CLBufferRead(cl_mem,buf);
      //--- Ausgabe der Rendering-Zeit
      Comment(IntegerToString(GetTickCount()-x)+" msec per frame");
      //--- Speichern des Rahmens im Speicher und Zeichnen des Rahmens
      ResourceCreate(resname,buf,SIZE_X,SIZE_Y,0,0,SIZE_X,COLOR_FORMAT_XRGB_NOALPHA);
      ChartRedraw();
      //--- eine kleine Pause und Aktualisierung der Parameter für das nächste Bild
      Sleep(10);
      x0+=0.001 f;
      x1-=0.001 f;
      y0+=0.001 f;
      y1-=0.001 f;
     }
//--- Entfernen von OpenCL-Objekten
   CLBufferFree(cl_mem);
   CLKernelFree(cl_krn);
   CLProgramFree(cl_prg);
   CLContextFree(cl_ctx);
//--- Objekt entfernen
   ObjectDelete(0,objname);
  }
//+------------------------------------------------------------------+


So können Sie beliebige dynamische 32-Bit-Bilder mit Alphakanälen für detailliertes Rendering erstellen.

Dynamisch erzeugte Ressourcen gelangen in den Ressourcenmanager und stehen allen MQL5-Programmen des Terminals zur Verfügung.


 
Renat Es wird neue Möglichkeiten geben, grafische Ressourcen mit Hilfe von ResourceCreate()-Funktionen im laufenden Betrieb zu erstellen.
Wird nur die Funktion ResourceCreate() angekündigt oder wird auch eine Klasse für die Arbeit mit grafischen Objekten/Primitiven vorbereitet?
 
IgorM:
wird nur die Funktion ResourceCreate() angekündigt oder wird eine Klasse für die Arbeit mit grafischen Objekten/Primitiven vorbereitet?

Diese Funktion wird bereits verfügbar sein.

Mit ihrer Hilfe können Sie bereits Ihre eigenen Bibliotheken zum Zeichnen in Ihrem eigenen Puffer erstellen und sie dann an Objekte binden. Auf diese Weise können Sie auf externe Zeichenbibliotheken in externen BMP-Dateien vollständig verzichten.

Hier ein kleines Beispiel: Sie können direkt in den Buf-Puffer zeichnen und dann eine darauf basierende Ressource erstellen und diese einem Objekt zuweisen.

   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);


Etwas später werden wir eine Bibliothek von Primitiven zum Zeichnen in denselben Puffern unter Verwendung nativer 2D-Beschleunigungsfunktionen erstellen. Dies wird ein viel schnelleres Zeichnen ermöglichen.

 
Renat:

Diese Funktion wird bereits verfügbar sein.

Mit ihrer Hilfe können Sie bereits Ihre eigenen Bibliotheken zum Zeichnen in Ihrem eigenen Puffer erstellen und sie dann an Objekte binden. Auf diese Weise können Sie externe Zeichenbibliotheken in externen BMP-Dateien vollständig loswerden.


Wird diese Funktion für alle MQL verfügbar sein, und nicht nur für die Arbeit mit OpenCL?

und wie sieht es mit dem Alphakanal in den erstellten BMP-Ressourcen aus?

 
Ein wenig später werden wir eine Bibliothek von Primitiven für das Zeichnen in den gleichen Puffern mit nativen 2D-Beschleunigungsfunktionen machen.

Verstehe, aber imho ist es besser für die Entwickler, sowohl die neue Funktion als auch die Basisklasse für die Arbeit mit Grafiken auf einmal anzukündigen, sonst fangen sie wieder an, "vom Flur aus" über die Schwierigkeiten bei der Programmierung auf mql5 zu schreien.

SZY: geht es nur mir so, dass der Link "Antworten" nicht funktioniert? statt einen Beitrag zu zitieren, erscheint das Fenster "Neuer Kommentar".

 

sergeev 2012.03.19 17:25 #

und wie sieht es mit dem Alphakanal in den erstellten BMP-Ressourcen aus?
es scheint also zu funktionieren