Komut dosyaları: OpenCL Testi - sayfa 2

 
Svetosha:
Ve eğer yararlı değillerse)))))) bu fırsatların ne faydası var?
Wright Kardeşler sadece 20 metre uçtular (yani bir gösteri uçuşu), icatlarının kullanımı kıtalararası uçuşlardır (dedikleri gibi farkı hissedin).
 
Zeleniy: Gebe kalmadan önceki yumurta. Bunu neden ortaya koyduğumuzu hala anlamış değilim, faydalı ve kesinleşmemiş bir şey yapmak daha iyi olurdu.
Svetosha: Ve eğer yararlı değillerse)))))) bu fırsatların kullanımı

Yenilikler, evrensel sorunlar hakkında hiçbir şeyin kokmadığı burunlarının bakış açısıyla karar veren bu tür "sermyazhnye uygulayıcıları" tarafından sıklıkla süngüyle karşılanır.

Ve sonra, fayda herkes tarafından görüldüğünde, saldırılarını güvenle unuturlar.

 
Mathemat:

Yenilikler, evrensel sorunları hiçbir şeyin kokmadığı burunlarının bakış açısıyla değerlendiren bu tür "gri uygulayıcılar" tarafından sıklıkla ters karşılanmaktadır.

Ve sonra, herkes faydasını gördüğünde, saldırılarını güvenle unuturlar.

Evet, OpenCL gerçekten harika. Dürüst olmak gerekirse, 5 ile ilgili durumu uzun süredir takip etmedim. Emirlerin birbirini emmesi hala aynı mı?
 
VDev:
Sipariş emilimi hala orada mı?

Hala orada olduğundan değil.

Başka türlü olamaz.

 

Bir sonraki derlemeden itibaren, ResourceCreate() işlevlerini kullanarak anında grafik kaynakları oluşturmak için yeni özellikler mevcut olacak.

İşte görüntüleri diske dökmeden, daha hızlı ve diskte kaynak erişim çakışmaları olmadan çalışan yeniden yazılmış ve basitleştirilmiş bir komut dosyası:

//+------------------------------------------------------------------+
//|OpenCLTest.mq5 |
//| Telif Hakkı 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
//+------------------------------------------------------------------+
//| OpenCL fonksiyon kodu|
//+------------------------------------------------------------------+
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";
//+------------------------------------------------------------------+
//| Betik program başlatma işlevi|
//+------------------------------------------------------------------+
void OnStart()
  {
   int cl_ctx;
   int cl_prg;
   int cl_krn;
   int cl_mem;
//--- OpenCL nesnelerini başlatma
   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;
     }
//--- yürütme için hazırlanıyor
   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());
//--- değiştirilemez OpenCL fonksiyon parametrelerinin ayarlanması
   CLSetKernelArg(cl_krn,4,max);
   CLSetKernelArgMem(cl_krn,5,cl_mem);
//--- grafik görüntüleme için nesne oluşturma
   ObjectCreate(0,objname,OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,4);
   ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,26);
//--- ilk boş resmi oluşturun
   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);
//--- render, dışarıdan durdurulmayana kadar
   while(!IsStopped())
     {
      uint x=GetTickCount();
      //--- kayan parametrelerin ayarlanması
      CLSetKernelArg(cl_krn,0,x0);
      CLSetKernelArg(cl_krn,1,y0);
      CLSetKernelArg(cl_krn,2,x1);
      CLSetKernelArg(cl_krn,3,y1);
      //--- çerçeveyi oluşturma
      CLExecute(cl_krn,2,offset,work);
      //--- çerçeve verilerini almak
      CLBufferRead(cl_mem,buf);
      //--- işleme süresinin çıktısını alma
      Comment(IntegerToString(GetTickCount()-x)+" msec per frame");
      //--- çerçeveyi belleğe kaydetme ve çizme
      ResourceCreate(resname,buf,SIZE_X,SIZE_Y,0,0,SIZE_X,COLOR_FORMAT_XRGB_NOALPHA);
      ChartRedraw();
      //--- küçük bir duraklama ve bir sonraki kare için parametrelerin güncellenmesi
      Sleep(10);
      x0+=0.001 f;
      x1-=0.001 f;
      y0+=0.001 f;
      y1-=0.001 f;
     }
//--- OpenCL nesnelerini kaldırma
   CLBufferFree(cl_mem);
   CLKernelFree(cl_krn);
   CLProgramFree(cl_prg);
   CLContextFree(cl_ctx);
//--- nesneyi kaldır
   ObjectDelete(0,objname);
  }
//+------------------------------------------------------------------+


Böylece ayrıntılı işleme için alfa kanallarına sahip herhangi bir dinamik 32 bit görüntü oluşturabilirsiniz.

Dinamik olarak oluşturulan kaynaklar kaynak yöneticisine girer ve terminaldeki tüm MQL5 programları tarafından kullanılabilir.


 
Renat ResourceCreate() fonksiyonlarını kullanarak anında grafik kaynakları oluşturmak için yeni olanaklar mevcut olacak.
Sadece ResourceCreate() fonksiyonu mu duyurulacak yoksa grafiksel nesneler/ilkeller ile çalışmak için bir sınıf hazırlanacak mı?
 
IgorM:
Sadece ResourceCreate() fonksiyonu mu duyurulacak yoksa grafiksel nesneler/ilkeller ile çalışmak için bir sınıf mı hazırlanacak?

Bu fonksiyon zaten mevcut olacak.

Onun yardımıyla kendi tamponunuzda çizim yapmak için kendi kütüphanelerinizi oluşturabilir ve daha sonra bunları nesnelere bağlayabilirsiniz. Böylece harici BMP dosyalarındaki harici çizim kütüphanelerinden tamamen kurtulabilirsiniz.

İşte küçük bir örnek - doğrudan buf tamponuna çizim yapabilir ve ardından buna dayalı bir kaynak oluşturabilir ve bunu bir nesneye atayabilirsiniz.

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


Bir süre sonra, yerel 2D hızlandırma işlevlerini kullanarak aynı tamponlarda çizim yapmak için bir ilkel kütüphane oluşturacağız. Bu çok daha hızlı çizim yapılmasını sağlayacaktır.

 
Renat:

Bu özellik zaten mevcut olacaktır.

Yardımı ile kendi tamponunuzda çizim yapmak için kendi kitaplıklarınızı oluşturabilir ve ardından bunları nesnelere bağlayabilirsiniz. Böylece harici BMP dosyalarındaki harici çizim kütüphanelerinden tamamen kurtulabilirsiniz.


bu işlev sadece OpenCL ile çalışmak için değil, tüm MQL için mevcut olacak mı?

ve oluşturulan BMP kaynaklarındaki alfa kanalı ile ilgili durum nedir?

 
Bir süre sonra, yerel 2D hızlandırma fonksiyonlarını kullanarak aynı tamponlarda çizim yapmak için bir ilkel kütüphane oluşturacağız.

Anlıyorum, ama bence, geliştiricilerin grafiklerle çalışmak için hem yeni işlevi hem de temel sınıfı bir kerede duyurmaları daha iyidir, aksi takdirde yine mql5'te programlamanın zorlukları hakkında "salondan bağırmaya" başlayacaktır.

ZY: "yanıtla" bağlantısı çalışmayan sadece ben miyim? Bir gönderiyi alıntılamak yerine "Yeni yorum" penceresi beliriyor.

 

sergeev 2012.03.19 17:25 #

ve oluşturulan BMP kaynaklarında alfa kanalı ile ilgili durum nedir?
bu yüzden çalışıyor gibi görünüyor