Scripts: OpenCL Test - página 2

 
Svetosha:
E qual é a utilidade dessas possibilidades se elas não forem úteis? )))))))
Os irmãos Wright voaram apenas 20 metros (por assim dizer, um voo de demonstração), a utilidade de sua invenção são os voos intercontinentais (como dizem, sinta a diferença).
 
Zeleniy: O óvulo antes da concepção. Ainda não entendo por que divulgá-lo, seria melhor fazer algo útil e não finalizado.
Svetosha: E o uso dessas oportunidades, se elas não forem úteis))))))

As inovações são frequentemente enfrentadas com baioneta por esses "profissionais sermyazhnye", que julgam os problemas universais do ponto de vista de seu nariz, para o qual nada cheira.

E então, quando o benefício é visível para todos, eles se esquecem com segurança de seus ataques.

 
Mathemat:

As inovações são frequentemente enfrentadas por esses "praticantes cinzentos", que julgam os problemas universais do ponto de vista de seu nariz, para o qual nada cheira.

E então, quando todos veem o benefício, eles esquecem com segurança seus ataques.

Sim, o OpenCL é muito legal. Para ser sincero, não acompanho a situação do 5 há muito tempo. A inter-absorção de ordens ainda existe?
 
VDev:
A absorção de pedidos ainda está lá?

Não é que ela ainda esteja lá.

Não pode ser de outra forma.

 

A partir da próxima compilação, novos recursos estarão disponíveis para criar recursos gráficos em tempo real usando as funções ResourceCreate().

Aqui está um script reescrito e simplificado que dispensa o despejo de imagens no disco, funciona mais rápido e sem conflitos de acesso a recursos no disco:

//+------------------------------------------------------------------+
//|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"
//---
#define SIZE_X 512
#define SIZE_Y 512
//+------------------------------------------------------------------+
//| Código de função 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";
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
   int cl_ctx;
   int cl_prg;
   int cl_krn;
   int cl_mem;
//--- inicialização de objetos 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;
     }
//--- preparando-se para a execução
   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());
//--- configuração de parâmetros de função OpenCL imutáveis
   CLSetKernelArg(cl_krn,4,max);
   CLSetKernelArgMem(cl_krn,5,cl_mem);
//--- criando o objeto para exibição de gráficos
   ObjectCreate(0,objname,OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,4);
   ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,26);
//--- criar imagem inicial vazia
   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);
//--- renderização, até que não sejamos impedidos por fora
   while(!IsStopped())
     {
      uint x=GetTickCount();
      //--- configuração de parâmetros flutuantes
      CLSetKernelArg(cl_krn,0,x0);
      CLSetKernelArg(cl_krn,1,y0);
      CLSetKernelArg(cl_krn,2,x1);
      CLSetKernelArg(cl_krn,3,y1);
      //--- renderizando o quadro
      CLExecute(cl_krn,2,offset,work);
      //--- pegando os dados do quadro
      CLBufferRead(cl_mem,buf);
      //--- gerando o tempo de renderização
      Comment(IntegerToString(GetTickCount()-x)+" msec per frame");
      //--- salvando o quadro na memória e desenhando-o
      ResourceCreate(resname,buf,SIZE_X,SIZE_Y,0,0,SIZE_X,COLOR_FORMAT_XRGB_NOALPHA);
      ChartRedraw();
      //--- uma pequena pausa e atualização dos parâmetros para o próximo quadro
      Sleep(10);
      x0+=0.001 f;
      x1-=0.001 f;
      y0+=0.001 f;
      y1-=0.001 f;
     }
//--- removendo objetos OpenCL
   CLBufferFree(cl_mem);
   CLKernelFree(cl_krn);
   CLProgramFree(cl_prg);
   CLContextFree(cl_ctx);
//--- remover objeto
   ObjectDelete(0,objname);
  }
//+------------------------------------------------------------------+


Assim, você pode criar qualquer imagem dinâmica de 32 bits com canais alfa para renderização detalhada.

Os recursos criados dinamicamente entram no gerenciador de recursos e ficam disponíveis para todos os programas MQL5 do terminal.


 
Renat novas possibilidades de criar recursos gráficos em tempo real usando as funções ResourceCreate() estarão disponíveis.
Será anunciada apenas a função ResourceCreate() ou será preparada uma classe para trabalhar com objetos gráficos/primitivos?
 
IgorM:
Será anunciada apenas a função ResourceCreate() ou será preparada uma classe para trabalhar com objetos gráficos/primitivos?

Essa função já estará disponível.

Com a ajuda dela, você já pode criar suas próprias bibliotecas para desenhar em seu próprio buffer e depois vinculá-las a objetos. Assim, você pode se livrar completamente das bibliotecas de desenho externas em arquivos BMP externos.

Aqui está um pequeno exemplo: você pode desenhar diretamente no buffer buf e, em seguida, criar um recurso com base nele e atribuí-lo a um objeto.

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


Um pouco mais tarde, criaremos uma biblioteca de primitivos para desenhar nos mesmos buffers usando funções de aceleração 2D nativas. Isso permitirá desenhar com muito mais rapidez.

 
Renat:

Esse recurso já estará disponível.

Com a ajuda dele, você já pode criar suas próprias bibliotecas para desenhar em seu próprio buffer e, em seguida, vinculá-las a objetos. Assim, você pode se livrar completamente das bibliotecas de desenho externas em arquivos BMP externos.


Essa função estará disponível para todos os MQL, e não apenas para trabalhar com OpenCL?

E qual é a situação do canal alfa nos recursos BMP criados?

 
Um pouco mais tarde, criaremos uma biblioteca de primitivos para desenhar nos mesmos buffers usando funções de aceleração 2D nativas.

Entendo, mas, na minha opinião, é melhor que os desenvolvedores anunciem de uma só vez a nova função e a classe base para trabalhar com gráficos, caso contrário, começarão novamente a "gritar do corredor" sobre as dificuldades de programação no mql5.

SZY: Será que é só eu que o link "responder" não funciona? em vez de citar uma postagem, aparece a janela "Novo comentário".

 

sergeev 2012.03.19 17:25 #

E qual é a situação do canal alfa nos recursos BMP criados?
Parece que está funcionando