スクリプト: OpenCLテスト - ページ 2

 
Svetosha:
そして、このような機会が役に立たなければ何になるのだろう))))))
ライト兄弟はたった20メートルしか飛ばなかったが(いわばデモンストレーション飛行)、彼らの発明の用途は大陸間飛行である(彼らはその違いを感じると言う)。
 
Zeleniy: 受胎前の卵子。私はまだ、なぜそれを出すのか理解できない。何か有用なことをしたほうがいいし、最終決定ではないだろう。
Svetosha そして、彼らは有用でない場合、これらの機会の利用)))))))。

イノベーションは、そのような「sermyazhnye実践者」によって銃剣で撃たれることが非常に多く、彼らは鼻の観点から普遍的な問題について判断する。

そして、その恩恵が誰の目にも明らかなものになると、彼らは安心してその攻撃のことを忘れてしまう。

 
Mathemat:

このような "グレーな実践者 "は、普遍的な問題を鼻で判断し、何も匂わない。

そして、誰もがその恩恵に気付くと、彼らは自分の攻撃など忘れてしまうのだ。

そう、OpenCLは本当にクールだ。正直なところ、私は長い間5の状況を追っていなかった。オーダーの相互吸収はまだあるのだろうか?
 
VDev:
オーダー吸収はまだありますか?

まだあるんじゃない。

それ以外にはあり得ない。

 

次のビルドから、ResourceCreate()関数を使用してグラフィックリソースをオンザフライで作成する新機能が利用可能になります。

ここでは、イメージをディスクにダンプすることなく、より高速に動作し、ディスク上でのリソースアクセスの競合が発生しない、書き換えられた簡略化されたスクリプトを紹介します:

//+------------------------------------------------------------------+
//|OpenCLTest.mq5
//| Copyright 2011, MetaQuotes Software Corp.
//|http://mql5.commql5.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関数コード|
//+------------------------------------------------------------------+
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";
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
   int cl_ctx;
   int cl_prg;
   int cl_krn;
   int cl_mem;
//--- OpenCL オブジェクトの初期化
   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;
     }
//--- 実行準備
   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());
//--- 変更不可能なOpenCL関数パラメータの設定
   CLSetKernelArg(cl_krn,4,max);
   CLSetKernelArgMem(cl_krn,5,cl_mem);
//--- グラフィックス表示用のオブジェクトを作成する
   ObjectCreate(0,objname,OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,4);
   ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,26);
//--- 最初の空の画像を作成する
   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);
//--- 外から止められなくなるまで、レンダリングする。
   while(!IsStopped())
     {
      uint x=GetTickCount();
      //--- 浮動パラメーターの設定
      CLSetKernelArg(cl_krn,0,x0);
      CLSetKernelArg(cl_krn,1,y0);
      CLSetKernelArg(cl_krn,2,x1);
      CLSetKernelArg(cl_krn,3,y1);
      //--- フレームのレンダリング
      CLExecute(cl_krn,2,offset,work);
      //--- フレームデータの取得
      CLBufferRead(cl_mem,buf);
      //--- レンダリング時間を出力する
      Comment(IntegerToString(GetTickCount()-x)+" msec per frame");
      //--- メモリにフレームを保存して描画する
      ResourceCreate(resname,buf,SIZE_X,SIZE_Y,0,0,SIZE_X,COLOR_FORMAT_XRGB_NOALPHA);
      ChartRedraw();
      //--- 次のフレームのために、少し間を置いてパラメータを更新する。
      Sleep(10);
      x0+=0.001 f;
      x1-=0.001 f;
      y0+=0.001 f;
      y1-=0.001 f;
     }
//--- OpenCL オブジェクトの削除
   CLBufferFree(cl_mem);
   CLKernelFree(cl_krn);
   CLProgramFree(cl_prg);
   CLContextFree(cl_ctx);
//--- オブジェクトを削除する
   ObjectDelete(0,objname);
  }
//+------------------------------------------------------------------+


このように、詳細なレンダリングのためのアルファチャンネルを持つ動的な32ビット画像を作成することができます。

動的に作成されたリソースはリソースマネージャに取り込まれ、ターミナルのすべてのMQL5 プログラムから利用できます。


 
Renat ResourceCreate()関数を使用してグラフィカル・リソースをその場で作成する新しい可能性が利用可能になります。
ResourceCreate()関数だけが発表されるのでしょうか、それともグラフィカル・オブジェクト/プリミティブを扱うクラスが用意されるのでしょうか?
 
IgorM:
ResourceCreate()関数のみが発表されるのでしょうか、それともグラフィカル・オブジェクト/プリミティブを扱う クラスが用意されるのでしょうか?

この関数はすでに利用可能です。

この関数の助けを借りて、独自のバッファに描画するための独自のライブラリを作成し、それをオブジェクトにバインドすることができます。このようにして、外部BMPファイル内の外部描画ライブラリを完全に取り除くことができます。

バッファに直接描画し、それに基づいてリソースを作成してオブジェクトに割り当てることができます。

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


少し後に、ネイティブの2Dアクセラレーション関数を使用して、同じバッファに描画するためのプリミティブのライブラリを作成する予定です。これによって、より高速な描画が可能になる。

 
Renat:

この機能はすでに利用できる。

この機能を使えば、独自のバッファで描画するための独自のライブラリを作成し、それをオブジェクトにバインドすることができます。したがって、外部BMPファイル内の外部描画ライブラリを完全に取り除くことができる。


この機能は、OpenCLでの作業だけ でなく、すべてのMQLで利用できるのですか?

また、作成されたBMPリソースのアルファチャンネルはどうなりますか?

 
もう少ししたら、ネイティブの2Dアクセラレーション関数を使って同じバッファに描画するためのプリミティブのライブラリを作る予定です。

そうでないと、またmql5でのプログラミングの難しさについて「会場から叫ぶ」ことになるでしょう。

SZY:「返信」リンクが機能しないのは私だけでしょうか?投稿を引用する代わりに「新しいコメント」ウィンドウが表示されます。

 

セルゲイエフ 2012.03.19 17:25 #

作成されたBMPリソースのアルファチャンネルはどうなっていますか?
動作するようです