OpenCL : tests de l'implémentation interne dans MQL5 - page 18

 
MetaDriver:
J'ai mis à jour le pilote (l'installation s'est bien déroulée) mais ControlCenter est maintenant complètement absent de la barre d'état système et ne peut même pas être lancé manuellement. Tout va bien chez vous ?

J'ai eu le même problème lorsque j'ai téléchargé le logiciel du pilote Vista depuis Win7 et que ControlCenter a commencé à apparaître dans la barre des tâches.

Pouvez-vous me dire s'il existe un émulateur OpenCL http://developer.amd.com/zones/opensource/pages/ocl-emu.aspx , il est pratique de modifier le code sur l'ordinateur portable pendant la journée et de l'utiliser ensuite sur le PC pour l'optimisation. Je suppose que MT5 ne fonctionnera pas avec l'émulateur 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:

que MT5 ne fonctionnera pas avec l'émulateur OpenCL ?


Renat:
Alors que le terminal utilise rigidement OpenCL uniquement sur le GPU, dans la prochaine version nous ajouterons l'utilisation automatique du CPU s'il n'y a pas de GPU.
 
IgorM:

J'ai eu le même problème lorsque j'ai installé le logiciel du pilote de Vista sur Win7, puis je l'ai téléchargé pour Win7 et ControlCenter est apparu dans ma zone de notification.

Pouvez-vous me dire s'il existe un émulateur OpenCL http://developer.amd.com/zones/opensource/pages/ocl-emu.aspx, il est pratique de modifier le code sur l'ordinateur portable pendant la journée, puis de l'utiliser sur le PC à des fins d'optimisation, je suppose que MT5 ne fonctionnera pas avec l'émulateur OpenCL ?

1. Je pense que j'ai la bonne version. Je l'ai trouvé ici : http://developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

2) Bien sûr, MT5 ne fonctionnera pas avec l'émulateur. Mais il peut être utilisé pour le débogage et les programmes prêts (débogués) peuvent être insérés dans le code mql5.

J'ai aussi téléchargé l'émulateur. Je n'ai pas encore eu l'occasion de l'utiliser.

 
MetaDriver:

1. Il semble que ce soit la bonne version. Je l'ai trouvé ici : http://developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

Je commence à chercher les pilotes ATI à partir d'ici : http://www.amd.com/ru/Pages/AMDHomePage.aspx
Глобальный поставщик инновационных графических карт, процессоров и решений для мультимедиа | AMD
  • www.amd.com
Advanced Micro Devices (NYSE: AMD) — это инновационная технологическая компания, ориентированная на сотрудничество с заказчиками и партнерами с целью разработки вычислительных и графических решений нового поколения для офиса, дома и игр.
 
MetaDriver:

Il y a eu un pépin, je suis d'accord. Mais il a disparu après un redémarrage... Maintenant que j'ai l'icône, je l'utilise toujours pour vérifier la température et la vitesse de refroidissement, je ne peux plus aller nulle part sans elle.

Je suis d'accord avec IgorM, je télécharge toujours les pilotes depuis http://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx ( lien vers la page HD 6xxx WIN7 x64).

Et le centre Catalyst lui-même pour la même version : http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe.

 
WChas:

1. Il y a eu un pépin, je suis d'accord. Mais il a disparu après un redémarrage... Maintenant que j'ai l'icône, je l'utilise toujours pour vérifier la température et la vitesse de refroidissement, je ne peux plus aller nulle part sans elle.

2. Je suis d'accord avec IgorM, je télécharge toujours les pilotes depuis http://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx ( lien vers la page pour HD 6xxx WIN7 x64).

3. et le centre Catalyst lui-même pour la même version : http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe.

1. Je n'ai rien. Le redémarrage n'aide pas.

Il semble qu'il lui manque quelque chose pour être heureux. Je vais vous demander si je peux le découvrir. :) // si Yandex ne peut pas aider.

// A propos des glacières, je les surveille bien. AI Suite II est en vie et fonctionne, seul le centre de contrôle Catalist est mort.

2. Je cherche tout là aussi. Tout fonctionne, et Catalist fonctionnait aussi, jusqu'à ce que je déplace la nouvelle version.

3. J'ai le même fichier. 151765KB sur mon disque, si vous en avez besoin. :)

Merci pour les réponses.

 

Renat ! Qu'en est-il du multithreading ? J'ai exécuté plusieurs scripts de test sur différents graphiques et ils ont commencé à mélanger leurs lectures, en volant des tampons les uns des autres tout le temps. Un problème, cependant.

// J'ai nettoyé le moniteur, j'ai donné un coup de pied à l'unité du système, rien n'y fait.

 
MetaDriver:

Renat, qu'en est-il du multithreading ? J'ai exécuté plusieurs scripts de test sur différents graphiques et ils ont commencé à mélanger leurs lectures, en volant des tampons les uns des autres tout le temps. Un problème, cependant.

// J'ai effacé l'écran, j'ai cassé l'unité du système, rien ne fonctionne.

Si nous parlons de l'exemple du test de Mandelbrot, veuillez noter que l'image est écrite dans le même fichier. C'est pourquoi il semble que des fils différents gâchent le fichier BMP des autres.

Essayez ce script - il fonctionne (rand) avec chaque fil avec sa propre image et n'entre plus en conflit :

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

Veuillez noter que plusieurs scripts utilisant OpenCL en même temps entraînent une perte non linéaire des performances du GPU.

 
Renat:

1) Si nous parlons de l'exemple du test de Mandelbrot, notez que l'image est écrite dans le même fichier. C'est pourquoi différents fils de discussion gâchent le fichier BMP des autres.

Essayez ce script - il fonctionne avec chaque fil (rand) avec sa propre image et n'entre plus en conflit :

2 . mais n'oubliez pas que plusieurs scripts utilisant OpenCL en même temps entraînent une perte non linéaire des performances du GPU.

1. Merde ! J'aurais pu le deviner moi-même. Désolé pour le bruit excessif.

Il a regardé le sceptique. C'est ça, oui. Seulement mieux.

int fileidx=ChartID();

Pour ce que ça vaut...

2. C'est ce que je voulais voir. Juste pour réfléchir... :)

 

MetaDriver:

...

3. Eh bien, c'est le même fichier que j'ai. 151765KB sur le disque, s'il y a lieu. :)

...

Le fichier du haut est un téléchargement du mien, celui du bas provient de votre lien. Taille complètement différente.... )

Raison: