OpenCL:MQL5での内部実装テスト - ページ 18

 
MetaDriver:
私の端末にもインストールしました。 ドライバはアップデートされましたが(インストールはうまくいきました)、ControlCenterがシステムトレイから完全に消え、手動で起動することもできません。 皆さんは大丈夫でしょうか?

Win7からVistaのドライバソフトをダウンロードしたとき、システムトレイにControlCenterが表示され、同じ問題が発生した。

OpenCLエミュレータhttp://developer.amd.com/zones/opensource/pages/ocl-emu.aspx があれば教えてください。 日中ラップトップでコードを変更し、PCで最適化に使用するのに便利です。MT5はOpenCLエミュレータでは動作しないと思いますが?

Home - AMD
  • developer.amd.com
If you want faster apps, you’ll want to use heterogeneous computing technologies. We’re here to make that happen, with plenty of tools and resources. And if you’re thinking about architecture, HSA is going to rock your world—learn more.
 

IgorM:

MT5がOpenCLエミュレータで動作しないこと?


レナート
端末はGPUでのみOpenCLを硬直的に使用しますが、次のビルドでは、GPUがない場合はCPUを自動的に使用する機能を追加する予定です。
 
IgorM:

Win7からVistaのドライバソフトをダウンロードしたら、ControlCenterがトレイに表示されるようになり、同じ問題が発生しました。

教えてください、OpenCLエミュレータがありますhttp://developer.amd.com/zones/opensource/pages/ocl-emu.aspx、 日中ラップトップでコードを変更し、その後最適化のためにPC上で使用するのが便利です、私はMT5がOpenCLエミュレータで動作しないと仮定します?

1.正しいバージョンを持っていると思う。ここから入手しました:http://developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

2.もちろんMT5はエミュレータでは動きません。しかし、デバッグに使用することができ、レディ(デバッグ済み)プログラムをmql5コードに挿入することができます。

私もエミュレータをダウンロードしました。まだ使いこなせていないんです。

 
MetaDriver:

1.正しいバージョンと思われます。ここから入手しました:http://developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

私はここからATIのドライバを探し始めます:http://www.amd.com/ru/Pages/AMDHomePage.aspx
Глобальный поставщик инновационных графических карт, процессоров и решений для мультимедиа | AMD
  • www.amd.com
Advanced Micro Devices (NYSE: AMD) — это инновационная технологическая компания, ориентированная на сотрудничество с заказчиками и партнерами с целью разработки вычислительных и графических решений нового поколения для офиса, дома и игр.
 
MetaDriver:

不具合はあった、そう思います。しかし、再起動すると消えてしまった...。今はアイコンを持っているので、温度や冷房のスピードを確認するのにいつも使っているので、これがないとどこにも行けませんね。

私もIgorMさんと同意見で、いつもhttp://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx( リンク先はHD 6xxx WIN7 x64のページ)からドライバをダウンロードしています。

また、同バージョンのCatalystセンター自体も、http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe

 
WChas:

1.不具合があった、同感です。しかし、再起動すると消えてしまった...。今はアイコンがあり、温度や冷房のスピードを確認するのにいつも使っているので、これがないとどこにも行けません。

2.IgorMさんと同意見で、いつもhttp://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx( HD 6xxx WIN7 x64のページへのリンク)からドライバをダウンロードしています。

3.同バージョンのCatalystセンター本体http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe

1.何も出ない、再起動してもダメ。

幸せになるには、何かDLが足りないようです。 もし、分かるようなら聞いてみます。:)// yandexが助けられない場合。

// クーラーの件ですが、ちゃんと見ていますよ。AI Suite IIは健在で、Catalist Control Centerだけが死んでいます。

2.そちらも全て探しています。 新しいバージョンを移すまでは、全て動作し、Catalistも動作していました。

3.私のドライブに同じファイル、151765KBがありますので、必要であれば、ご覧ください。:)

回答ありがとうございました。

 

Renat!マルチスレッドはどうですか? 異なるチャートでいくつかのテストスクリプトを実行したところ、読み取りが混同され、常に互いのバッファを盗むようになりました。 トラブルが発生しましたが。

// モニターを消したり、システムユニットを蹴飛ばしたりしましたが、何も解決しません。

 
MetaDriver:

Renat、マルチスレッドについてはどうですか? 異なるチャートでいくつかのテストスクリプトを実行したところ、常に互いのバッファを盗んで混乱するようになりました。 トラブルはありますが。

// モニターを消したり、システムユニットを蹴飛ばしたりしても、何も起こりません。

マンデルブロットテストの例で言えば、同じファイルに画像が書き込まれることに注意してください。そのため、異なるスレッドでお互いのBMPファイルをネタバレしているように見えるのです。

このスクリプトを試してみてください。各スレッドが独自の画像で動作し(ランド)、もはや競合することはありません。

//+------------------------------------------------------------------+
//|                                                   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"
//+------------------------------------------------------------------+
//| Код функции 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";
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#define SIZE_X 512
#define SIZE_Y 512
//+------------------------------------------------------------------+
//| Заголовок BMP файла                                              |
//+------------------------------------------------------------------+
struct BitmapHeader
  {
   ushort            type;
   uint              size;
   uint              reserv;
   uint              offbits;
   uint              imgSSize;
   uint              imgWidth;
   uint              imgHeight;
   ushort            imgPlanes;
   ushort            imgBitCount;
   uint              imgCompression;
   uint              imgSizeImage;
   uint              imgXPelsPerMeter;
   uint              imgYPelsPerMeter;
   uint              imgClrUsed;
   uint              imgClrImportant;
  };
//+------------------------------------------------------------------+
//| Запись битмапа в файл                                            |
//+------------------------------------------------------------------+
bool SaveBitmapToFile(const string filename,uint &bitmap[],const BitmapHeader &info)
  {
//--- откроем файл
   int file=FileOpen(filename,FILE_WRITE|FILE_BIN);
   if(file==INVALID_HANDLE)
     {
      Print(__FUNCTION__," error opening '",filename,"'");
      return(false);
     }
//--- запишем заголовок и само тело
   if(FileWriteStruct(file,info)==sizeof(info))
     {
      if(FileWriteArray(file,bitmap)==ArraySize(bitmap))
        {
         FileClose(file);
         return(true);
        }
     }
//--- неудачно получилось, удалим файл от греха подальше
   FileClose(file);
   FileDelete(filename);
   Print(__FUNCTION__," error writting '",filename,"'");
//--- вернем ошибку
   return(false);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int cl_ctx;
   int cl_prg;
   int cl_krn;
   int cl_mem;
   int fileidx=MathRand()&255;
//--- инициализируем OpenCL объекты
   if((cl_ctx=CLContextCreate())==0)
     {
      Print("OpenCL not found");
      return;
     }
   if((cl_prg=CLProgramCreate(cl_ctx,cl_src))==0)
     {
      CLContextFree(cl_ctx);
      Print("OpenCL program create failed");
      return;
     }
   if((cl_krn=CLKernelCreate(cl_prg,"MFractal"))==0)
     {
      CLProgramFree(cl_prg);
      CLContextFree(cl_ctx);
      Print("OpenCL kernel create failed");
      return;
     }
   if((cl_mem=CLBufferCreate(cl_ctx,SIZE_X*SIZE_Y*sizeof(float),CL_MEM_READ_WRITE))==0)
     {
      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};
//--- выставляем неизменяемые параметры функции OpenCL
   CLSetKernelArg(cl_krn,4,max);
   CLSetKernelArgMem(cl_krn,5,cl_mem);
//--- подготовим буфер для вывода пикселей
   uint buf[];
   ArrayResize(buf,SIZE_X*SIZE_Y);
//--- подготовим заголовок
   BitmapHeader info;
   ZeroMemory(info);
   info.type          =0x4d42;
   info.size          =sizeof(info)+SIZE_X*SIZE_Y*4;
   info.offbits       =sizeof(info);
   info.imgSSize      =40;
   info.imgWidth      =SIZE_X;
   info.imgHeight     =SIZE_Y;
   info.imgPlanes     =1;
   info.imgBitCount   =32;
   info.imgCompression=0;                // BI_RGB
   info.imgSizeImage  =SIZE_X*SIZE_Y*4;
//--- создаём объект для вывода графики
   ObjectCreate(0,"x",OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,"x",OBJPROP_XDISTANCE,4);
   ObjectSetInteger(0,"x",OBJPROP_YDISTANCE,26);
//--- рендерим пока не остоновят снаружи
   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");
      //--- сохраняем кадр в памяти и рисуем его
      SaveBitmapToFile("Mandelbrot"+IntegerToString(fileidx)+".bmp",buf,info);
      ObjectSetString(0,"x",OBJPROP_BMPFILE,NULL);
      ObjectSetString(0,"x",OBJPROP_BMPFILE,"\\Files\\Mandelbrot"+IntegerToString(fileidx)+".bmp");
      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);
  }
//+------------------------------------------------------------------+

OpenCLを使用した複数のスクリプトを同時に実行すると、GPUの性能が非線形に低下することにご注意ください。

 
Renat:

1. マンデルブロットテストの例で言えば、同じファイルに絵が書き込まれていることに注意してください。そのため、スレッドによってBMPファイルのネタばらしをするのです。

このスクリプトを試してみてください。各スレッド(rand)が独自のイメージで動作し、もはや競合することはありません。

2. ただし、OpenCLを使用する複数のスクリプトを同時に使用すると、GPUの性能が非線形に低下することに留意してください。

1.しまった!自分でも予想がついたのに、騒ぎすぎで申し訳ない。

懐疑的な人を見た。そうなんです、そうなんです。より良いものだけを。

int fileidx=ChartID();

参考までに...

2.それが見たかったんです。 ただ、検討するために... :)

 

MetaDriver:

...

3.まあ、私の持っているファイルと同じですね。何しろディスクに151765KB。:)

...

上のファイルは私のところから、下のファイルはあなたのリンクからダウンロードしたものです。サイズが全く違う...。)