OpenCL: testes internos de implementação em MQL5 - página 18

 
MetaDriver:
Também o instalei no meu dispositivo. O controlador foi actualizado (a instalação correu bem), mas o ControlCenter está agora completamente ausente da bandeja do sistema e nem sequer pode ser lançado manualmente. Está tudo bem consigo?

tive o mesmo problema quando descarreguei o software de driver Vista do Win7 e o ControlCenter começou a aparecer na bandeja

Pode dizer-me se existe um emulador OpenCL http://developer.amd.com/zones/opensource/pages/ocl-emu.aspx , é conveniente mudar o código no portátil durante um dia e depois utilizá-lo no PC para optimização. Presumo que o MT5 não funcionará com o emulador 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 o MT5 não irá funcionar com o emulador OpenCL ?


Renat:
Enquanto o terminal utiliza rigidamente o OpenCL apenas em GPU, na próxima compilação adicionaremos a utilização automática de CPU se não houver GPU.
 
IgorM:

tive o mesmo problema quando descarreguei o software de driver Vista do Win7 e o ControlCenter começou a aparecer na bandeja

Pode dizer-me, existe um emulador OpenCL http://developer.amd.com/zones/opensource/pages/ocl-emu.aspx, é conveniente alterar o código no portátil durante o dia, e depois usá-lo no PC para fins de optimização, presumo que o MT5 não funcionará com o emulador OpenCL ?

1. Penso que tenho a versão correcta. Consegui-o a partir daqui: http: //developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

2. claro que o MT5 não funcionará com emulador. Mas pode ser usado para depuração e programas prontos (debugged) podem ser inseridos em código mql5.

Também descarreguei o emulador. Ainda não tenho de o utilizar.

 
MetaDriver:

1. Parece ser a versão correcta. Consegui-o a partir daqui: http: //developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

Começo a procurar condutores ATI a partir daqui: http://www.amd.com/ru/Pages/AMDHomePage.aspx
Глобальный поставщик инновационных графических карт, процессоров и решений для мультимедиа | AMD
  • www.amd.com
Advanced Micro Devices (NYSE: AMD) — это инновационная технологическая компания, ориентированная на сотрудничество с заказчиками и партнерами с целью разработки вычислительных и графических решений нового поколения для офиса, дома и игр.
 
MetaDriver:

Houve uma falha, concordo. Mas desapareceu depois de uma reinicialização. Agora tenho o ícone, utilizo-o sempre para verificar a temperatura e a velocidade mais baixa, por isso não posso ir a lado nenhum sem ele.

Concordo com o IgorM que descarrego sempre os condutores a partir de http://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx ( link para a página HD 6xxx WIN7 x64).

E o próprio centro Catalyst para a mesma versão: http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe

 
WChas:

1. houve uma falha, concordo. Mas desapareceu depois de uma reinicialização. Agora tenho o ícone, utilizo-o sempre para verificar a temperatura e a velocidade mais baixa, por isso não posso ir a lado nenhum sem ele.

2. concordo com o IgorM, descarrego sempre os condutores a partir de http://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx ( link para a página do HD 6xxx WIN7 x64).

3. e o próprio centro Catalyst para a mesma versão: http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe

1. não tenho nada. Reiniciar não ajuda.

Parece faltar um pouco de dll para que fique feliz. Vou perguntar-lhe se o consigo descobrir. :) // se o yandex não puder ajudar.

// Sobre os frigoríficos, estou a observá-los bem. O AI Suite II está vivo e em funcionamento, apenas o Centro de Controlo Catalista está morto.

2. também estou à procura de tudo lá. Tudo funciona, e o Catalista também funcionou, até que mudei a nova versão para cima.

3. tenho o mesmo ficheiro. 151765KB no meu disco, se precisar dele. :)

Obrigado pelas respostas.

 

Renat! e que tal multi-tarefas? corri vários guiões de teste em diferentes gráficos e eles começaram a misturar as suas leituras, roubando buffers uns aos outros a toda a hora.

// Limpei o monitor, pontapeei a unidade do sistema - nada ajuda.

 
MetaDriver:

Renat, e a multithreading? Corri vários guiões de teste em diferentes gráficos e eles começaram a ficar confusos, roubando amortecedores uns aos outros a toda a hora. Problemas, no entanto.

// Limpei o monitor, pontapeei a unidade do sistema - nada funciona.

Se estamos a falar do exemplo do teste Mandelbrot, é favor notar que a imagem é escrita no mesmo ficheiro. É por isso que parece que os diferentes fios estragam o ficheiro BMP um do outro.

Experimente este guião - funciona (rand) com todos os fios e já não entra em conflito:

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

Note-se que vários scripts que usam OpenCL ao mesmo tempo podem levar a uma perda não linear do desempenho da GPU.

 
Renat:

1 . se estamos a falar do exemplo do teste Mandelbrot, note que a imagem é escrita no mesmo ficheiro. É por isso que fios diferentes estragam o ficheiro BMP um do outro.

Experimente este guião - funciona com cada fio (rand) com a sua própria imagem e não mais conflitos:

2. mas tenha em mente que scripts múltiplos usando OpenCL ao mesmo tempo resultarão na perda não linear do desempenho da GPU.

1. merda! eu próprio poderia ter adivinhado. desculpem o barulho excessivo.

Olhou para o céptico. É isso mesmo. Apenas melhor.

int fileidx=ChartID();

Para que conste...

2. isso é o que eu queria ver. Só para considerar... :)

 

MetaDriver:

...

3. bem, é o mesmo ficheiro que eu tenho. 151765KB em disco, se alguma coisa. :)

...

O ficheiro superior é um download a partir do meu, o inferior a partir do seu link. Tamanho completamente diferente.... )

Razão: