OpenCL: MQL5'te dahili uygulama testleri - sayfa 18

 
MetaDriver :
ben de kendimi ayarladım. Sürücü güncellendi (ve genel olarak kurulum iyi gitti), ancak ControlCenter tepsiden tamamen kayboldu ve manuel olarak bile başlamıyor. Bu konuda iyi misin?

Ayrıca Win7'ye Vista'dan yakacak odun yüklediğimde, ardından Win7 altında indirdiğimde ve ControlCenter tepside görünmeye başladığımda vardı.

söyle bana, bir OpenCL öykünücüsü var http://developer.amd.com/zones/opensource/pages/ocl-emu.aspx , gündüzleri bir dizüstü bilgisayarda kodu düzenlemek ve ardından kullanmak uygun olabilir optimizasyon açısından bir PC, anlıyorum ki MT5 bir OpenCL öykünücüsü ile çalışmayacak mı?

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 bir OpenCL öykünücüsüyle çalışmayacak mı?


Renat :
Terminal kesinlikle yalnızca GPU üzerinde OpenCL kullanırken, bir sonraki derlemede GPU yoksa CPU'nun otomatik kullanımını ekleyeceğiz.
 
IgorM :

Ayrıca Win7'ye Vista'dan yakacak odun yüklediğimde, ardından Win7 altında indirdiğimde ve ControlCenter tepside görünmeye başladığımda vardı.

söyle bana, bir OpenCL öykünücüsü var http://developer.amd.com/zones/opensource/pages/ocl-emu.aspx , gündüzleri bir dizüstü bilgisayarda kodu düzenlemek ve ardından kullanmak uygun olabilir optimizasyon açısından bir PC, anlıyorum ki MT5 bir OpenCL öykünücüsü ile çalışmayacak mı?

1. Evet, doğru sürüm gibi görünüyor. Buradan alınmıştır: http://developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

2. MT5 elbette bir emülatörle çalışmayacaktır. Ancak hata ayıklama için kullanılabilir ve tamamlanmış (hata ayıklanmış) programlar mql5 koduna eklenebilir.

Ben de emülatörü indirdim. Henüz dokunmadım.

 
MetaDriver :

1. Evet, doğru sürüm gibi görünüyor. Buradan alınmıştır: http://developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

ATI altında yakacak odun aramaya buradan başlıyorum: http://www.amd.com/en/Pages/AMDHomePage.aspx
Глобальный поставщик инновационных графических карт, процессоров и решений для мультимедиа | AMD
  • www.amd.com
Advanced Micro Devices (NYSE: AMD) — это инновационная технологическая компания, ориентированная на сотрудничество с заказчиками и партнерами с целью разработки вычислительных и графических решений нового поколения для офиса, дома и игр.
 
MetaDriver :

Bu bir hataydı, katılıyorum. Ama yeniden başlattıktan sonra çatı keçeleri kayboldu... Şimdi simge orada, sürekli üzerindeki soğutucuların sıcaklığına ve hızına bakıyorum, bu yüzden onsuz yapamam.

Ve yakacak odun, IgorM ile aynı fikirdeyim, her zaman http://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx adresinden indiririm (HD 6xxx WIN7 x64 sayfasına bağlantı)

Ve aynı sürüm için katalizör merkezi: http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe

 
WChas :

1. Bir aksaklık oldu, katılıyorum. Ama yeniden başlattıktan sonra çatı keçeleri kayboldu... Şimdi simge orada, sürekli üzerindeki soğutucuların sıcaklığına ve hızına bakıyorum, bu yüzden onsuz yapamam.

2. Ve yakacak odun, IgorM ile aynı fikirdeyim, her zaman http://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx adresinden indiririm (HD 6xxx WIN7 x64 sayfasına bağlantı)

3. Ve aynı sürüm için katalizör merkezi: http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe

1. Ben bile sağırım. Yeniden başlatma yardımcı olmuyor.

Görünüşe göre bazı dll-ki onun mutlu olması için yeterli değil. Öğreneceğim - sana soracağım. :) // Yandex yardımcı olmazsa

// Soğutucu arayın - Onları normal şekilde izlerim. AI Suite II yaşıyor ve çalışıyor, yalnızca Katalist Kontrol Merkezi öldü.

2. Ben de orada her şeyi arıyorum. Her şey çalışıyor ve Catalist, yeni sürümü başkasına taşıyana kadar çalıştı.

3. Aynı dosya bende de var. Varsa, diskte 151765 KB. :)

Cevaplar için teşekkürler.

 

Renat! Peki ya çoklu kullanım? Farklı grafiklerde birkaç test komut dosyası çalıştırdım - hepsi okumalarda karışmaya başladı, arabellekler her zaman birbirinden çalınıyor. Ancak sorun.

// Monitörü sildim, sistem birimini tekmeledim - hiçbir şey yardımcı olmuyor.

 
MetaDriver :

Renat! Peki ya çoklu kullanım? Farklı grafiklerde birkaç test komut dosyası çalıştırdım - hepsi okumalarda karışmaya başladı, arabellekler her zaman birbirinden çalınıyor. Ancak sorun.

// Monitörü sildim, sistem birimini tekmeledim - hiçbir şey yardımcı olmuyor.

Mandelbrot ile bir test örneğinden bahsediyorsak, resmin aynı dosyaya yazıldığını unutmayın. Bu nedenle, farklı akışların birbirinin BMP dosyasını bozduğu ortaya çıkıyor.

Bu betiği deneyin - içinde her iş parçacığı kendi resmiyle çalışır (rand) ve artık çakışmaz:

 //+------------------------------------------------------------------+
//|                                                   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);
  }
//+------------------------------------------------------------------+

Ancak aynı anda OpenCL kullanan birden çok komut dosyasının GPU performansında doğrusal olmayan bir kayıp verdiğini unutmayın.

 
Renat :

1. Mandelbrot ile bir test örneğinden bahsediyorsak, resmin aynı dosyaya yazıldığını unutmayın. Bu nedenle, farklı akışların birbirinin BMP dosyasını bozduğu ortaya çıkıyor.

Bu betiği deneyin - içinde her iş parçacığı kendi resmiyle çalışır (rand) ve artık çakışmaz:

2. Ancak OpenCL kullanan birkaç betiğin aynı anda GPU performansında doğrusal olmayan bir kayıp verdiğini unutmayın.

1. Per, lanet olsun! Kendimi tahmin edebiliyordum. Ekstra gürültü için özür dilerim.

Kayığa baktım. Bu doğru, evet. Sadece daha iyi

 int fileidx= ChartID();

ve bu yeterli değil...

2. Yani görmek istediğim şey buydu. Dikkate almak.. :)

 

MetaDriver :

...

3. Aynı dosya bende de var. Varsa, diskte 151765 KB. :)

...

En üstteki dosya benimkinden, alttaki ise sizin bağlantınızdan indirildi. Tamamen farklı boyutta ....)