OpenCL: MQL5의 내부 구현 테스트 - 페이지 18

 
MetaDriver :
나도 정했다. 드라이버가 업데이트되었지만(일반적으로 설치가 잘됨) ControlCenter가 트레이에서 완전히 사라지고 수동으로 시작하지도 않습니다. 괜찮으세요?

Win7에서 Vista의 장작을 설치한 다음 Win7에서 다운로드하고 ControlCenter가 트레이에 나타나기 시작했을 때도 있었습니다.

OpenCL 에뮬레이터 http://developer.amd.com/zones/opensource/pages/ocl-emu.aspx 가 있습니다. 낮에는 랩톱에서 코드를 편집한 다음 사용하는 것이 편리할 수 있습니다. 최적화 측면에서 PC에서 MT5가 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 :

MT5는 OpenCL 에뮬레이터에서 작동하지 않습니까?


레나트 :
터미널은 GPU에서만 OpenCL을 엄격하게 사용하지만 다음 빌드에서는 GPU가 없는 경우 CPU 자동 사용을 추가합니다.
 
IgorM :

Win7에서 Vista의 장작을 설치한 다음 Win7에서 다운로드하고 ControlCenter가 트레이에 나타나기 시작했을 때도 있었습니다.

OpenCL 에뮬레이터 http://developer.amd.com/zones/opensource/pages/ocl-emu.aspx 가 있습니다. 낮에는 랩톱에서 코드를 편집한 다음 사용하는 것이 편리할 수 있습니다. 최적화 측면에서 PC에서 MT5가 OpenCL 에뮬레이터와 작동하지 않는다는 것을 이해합니까?

1. 네, 버전이 맞는 것 같습니다. 여기에서 가져옴: http://developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

2. MT5는 물론 에뮬레이터에서 작동하지 않습니다. 그러나 디버깅에 사용할 수 있으며 완료된(디버깅된) 프로그램을 mql5 코드에 삽입할 수 있습니다.

에뮬레이터도 다운받았습니다. 아직 만지지 않았습니다.

 
MetaDriver :

1. 네, 버전이 맞는 것 같습니다. 여기에서 가져옴: http://developer.amd.com/Downloads/AMD-APP-SDK-v2.6-Windows-64.exe

여기에서 ATI에서 장작을 찾기 시작했습니다. http://www.amd.com/ru/Pages/AMDHomePage.aspx
Глобальный поставщик инновационных графических карт, процессоров и решений для мультимедиа | AMD
  • www.amd.com
Advanced Micro Devices (NYSE: AMD) — это инновационная технологическая компания, ориентированная на сотрудничество с заказчиками и партнерами с целью разработки вычислительных и графических решений нового поколения для офиса, дома и игр.
 
MetaDriver :

버그였습니다. 동의합니다. 근데 재부팅 후 루핑펠트가 사라졌는데... 이제 아이콘이 생겼는데 거기에 붙어있는 쿨러의 온도와 속도를 계속 쳐다보는데 이거 없으면 안되네요.

그리고 장작, 나는 IgorM에 동의합니다. 저는 항상 http://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx 에서 다운로드합니다(HD 6xxx WIN7 x64용 페이지 링크).

그리고 같은 버전의 촉매 센터: http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe

 
WChas :

1. 오류가 있었습니다. 동의합니다. 근데 재부팅 후 루핑펠트가 사라졌는데... 이제 아이콘이 생겼는데 거기에 붙어있는 쿨러의 온도와 속도를 계속 쳐다보는데 이거 없으면 안되네요.

2. 그리고 장작, IgorM에 동의합니다. 저는 항상 http://sites.amd.com/us/game/downloads/Pages/radeon_win7-64.aspx 에서 다운로드합니다(HD 6xxx WIN7 x64용 페이지 링크).

3. 동일한 버전의 촉매 센터: http://www2.ati.com/drivers/12-1_vista_win7_64_dd_ccc.exe

1. 나도 귀머거리다. 재부팅은 도움이 되지 않습니다.

약간의 dll-ki가 그를 행복하게 하기에 충분하지 않은 것 같습니다. 내가 알아볼게 - 내가 당신에게 물어볼게. :) // Yandex가 도움이 되지 않는 경우

// 쿨러를 찾으십시오 - 저는 일반적으로 쿨러를 봅니다. AI Suite II는 살아 있고 작동하며 Catalist Control Center만 사망했습니다.

2. 나는 또한 거기에서 모든 것을 찾고 있습니다. 모든 것이 작동하고 Catalist는 새 버전을 옮길 때까지 작동했습니다.

3. 같은 파일이 있습니다. 그렇다면 디스크에 151765KB가 있습니다. :)

답변 감사합니다.

 

레나트! 그리고 멀티스레딩은 어떻습니까? 다른 차트에서 여러 테스트 스크립트를 실행했습니다. 모두 판독값에서 혼란스러워지기 시작했고 버퍼는 항상 서로에게서 도난당했습니다. 그러나 문제.

// 모니터를 닦고 시스템 장치를 걷어찼습니다. 아무 것도 도움이 되지 않습니다.

 
MetaDriver :

레나트! 그리고 멀티스레딩은 어떻습니까? 다른 차트에서 여러 테스트 스크립트를 실행했습니다. 모두 판독값에서 혼란스러워지기 시작했고 버퍼는 항상 서로에게서 도난당했습니다. 그러나 문제.

// 모니터를 닦고 시스템 장치를 걷어찼습니다. 아무 것도 도움이 되지 않습니다.

Mandelbrot을 사용한 테스트 예제에 대해 이야기하는 경우 그림이 동일한 파일에 기록된다는 점에 유의하십시오. 따라서 서로 다른 스트림이 서로의 BMP 파일을 손상시키는 것으로 나타났습니다.

이 스크립트를 시도하십시오 - 각 스레드가 자체 그림으로 작동하고 더 이상 충돌하지 않습니다.

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

그러나 동시에 OpenCL을 사용하는 여러 스크립트는 GPU 성능에 비선형 손실을 줍니다.

 
Renat :

1. Mandelbrot를 사용한 테스트 예제에 대해 이야기하는 경우 그림이 동일한 파일에 기록된다는 점에 유의하십시오. 따라서 서로 다른 스트림이 서로의 BMP 파일을 손상시키는 것으로 나타났습니다.

이 스크립트를 시도하십시오 - 각 스레드가 자체 그림으로 작동하고 더 이상 충돌하지 않습니다.

2. 그러나 동시에 OpenCL을 사용하는 여러 스크립트는 GPU 성능에 비선형 손실을 줍니다.

1. 젠장! 나는 나 자신을 추측할 수 있었다. 추가 소음 죄송합니다.

나는 스킵을 보았다. 네, 맞습니다. 더 나은

 int fileidx= ChartID();

그리고 그것은 충분하지 않습니다 ...

2. 이것이 내가 보고 싶었던 것입니다. 참고해서.. :)

 

MetaDriver :

...

3. 같은 파일이 있습니다. 그렇다면 디스크에 151765KB가 있습니다. :)

...

맨 위 파일은 내 링크에서, 맨 아래 파일은 링크에서 다운로드했습니다. 전혀 다른 크기....)

사유: