OpenCL:MQL5での内部実装テスト - ページ 64

 

http://www.ixbt.com/video3/rad2.shtml- OpenCLでプログラムを書くことに「創造性」を発揮するよりも、大規模データセットに最適化されたライブラリを使う のが一番です (否定はしませんが)少量はOpenCLで、大量最適化されたライブラリで 処理するハイブリッド 方式も可能です。特定のプログラミング言語への変換や、このライブラリが含まれる条件の作成が必要になる場合があります。これが実現できれば、素晴らしい結果が得られ、結果的にオペレーションを何倍にも加速させることができるのです。Note to ....

P.S フォーラムの新しいスレッドになるかもしれません。

������������������ AMD Radeon � �������������� �����������. ������������� AMD Core Math Library
  • www.ixbt.com
������� ������� ����������� �� �������, ��������� ����������� � ���� � �� �� �����, �� ������ ��� �� ����� ������. � ������� ������������ ������� �� ����� ����������� �� ����� �������, � �������� GPU ����� ����� ������������� �������� ��������� ������� ��������� ���� � ����� ����� �� ����� �����. � ���� ����� ������ ���������� ��� PC ����� x86...
 
GKS: ライブラリを特定のプログラミング言語に変換し、このライブラリを有効にするための条件を作成する必要がある場合があります。これが実現できれば、感動的な結果が得られ、結果的に動作が何倍にも加速されます。

ユニークとはいえ、極めて特殊な製品のために、開発者がコンパイラを特別に調整するのは技術的に無理がある。

また、今のところ、このような巨大なサイズの乗算行列を必要とするトレーダーのタスクは見当たりません。

 
MetaQuotes:

MetaTrader 5」アップデートの お知らせ

MetaTrader 5プラットフォームのアップデートは、数日中に公開される予定です。アップデートが公開された後、最終的な変更点のリストとビルド 番号を含む追加のニュースリリースが行われます。 以下の変更を予定しています。

MetaTrader 5 クライアントターミナル ビルド 648

MetaTester: テストエージェントでOpenCLプログラムを使用するためのサポートを追加しました。

OpenCLを理解している人は、Cloud+OpenCLでタスクテストを用意してください。数学的な視点が非常に面白い。
 
hrenfx: OpenCLを理解し、Cloud+OpenCLのタスクテストを用意する。数学的な視点が非常に面白い。
これはどちらかというとMetaDriver 向けです。彼はここのOpenCLの大御所で、テストをエミュレートしようとしているようなものです。
 
hrenfx:
OpenCLを理解し、Cloud+OpenCLのタスクテストを用意する。数学的な視点が非常に面白い。
数学
それはMetaDriverの ためです
具体的にどのような計算が 必要なのか、アイデアを出してほしい。
 

ビデオドライバを最近更新しました(NVIDIA301.42)。

興味本位で昔のテスト(ParallelTester_00-01x)をやってみたら、目を疑った。

24ページで テストをしていて29あったのが、メモリを2chモードにしたら39になったんです。

今は~306です。

2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       OpenCL init OK!
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       GPU time = 141 ms
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       Result on Gpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       CPU time = 43259 ms
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       Result on Cpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       CpuTime/GpuTime = 306.8014184397163
2012.05.31 21:41:04     OpenCL  GPU: NVIDIA Corporation GeForce GT 440 with OpenCL 1.1 (2 units, 1660 MHz, 1023 Mb, version 301.42)
2012.05.31 21:41:04     OpenCL  CPU: AuthenticAMD AMD Athlon(tm) II X4 630 Processor with OpenCL 1.1 (4 units, 2948 MHz, 2048 Mb, version 2.0)
驚きです。NVIDIAが人力でドライバをいじっているようです。
 

fyords さん、以前のイベントをログの上位に表示させるにはどうしたらいいのでしょうか?

そして、一般的にそれは素晴らしいです、私はあなたを理解しています。HD4870を安く買って、その威力を目の当たりにしたときと同じように嬉しかったですね。

1 つ小さな推奨事項を挙げると、GPU の実行時間が 1 秒に匹敵するようなパラメー タを選択することです。そうすれば、時間比もより正確になります。GteTickCount()関数の平均誤差は数十ミリ秒を下回ることはない。だから、GPUで120msとか170msとか、簡単に出せるんですよ。そして、加速度の値はこれに大きく左右されます。

このスクリプトを少し微調整して、利用可能なすべてのデバイスで実行できるようにしました(下から順に、1)IntelプラットフォームのCPU、次に2)AMDプラットフォームのHD 4870、そして3)AMDプラットフォームのCPU)。

2012.05.31 15:48:35     OpenCL  CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.2 (2 units, 2793 MHz, 8040 Mb, version 2.0 (sse2))
2012.05.31 15:48:35     OpenCL  GPU: Advanced Micro Devices, Inc. ATI RV770 with OpenCL 1.0 (10 units, 780 MHz, 512 Mb, version CAL 1.4.1720)
2012.05.31 15:48:35     OpenCL  CPU: Intel(R) Corporation  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.1 (2 units, 2800 MHz, 8040 Mb, version 1.1)

スクリプトの結果は、ボトムアップで!

2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 24.76943755169562
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 9672 ms
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 2
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 204.7606837606838
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 1170 ms
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 1
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 77.55584331498866
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 3089 ms
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 0
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     -------------------------
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Cpu МахResult==0.87527 at 10902 pass
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CPU time = 239570 ms
2012.06.01 01:01:58     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ========================================
10倍少ない後者のパラメータでは、私のカードはあなたのカードほど高速ではありません。おそらく、きちんとオーバークロックする時間がないのでしょう :)
ファイル:
 
ちなみに、GetTickCountの エラーレートは16msを大きく下回っており、Windows95を使用しているわけではなさそうです。
 
Mathemat:

fyords さん、以前のイベントをログの上位に表示させるにはどうしたらいいのでしょうか?

レポートでは、右ボタン「表示」、新規ウィンドウ「クエリ」ボタンでログが時間別に正しく構築され、読みやすくなりました(私にとっては)。

スクリプトについては、ありがとうございます、明日にでも試してみます、特に Count pass = 12800では 完成までが長いですね。

とりあえず、Count Pass = 12800 の古いスクリプトを以下に示します。

2012.06.01 01:05:53     ParallelTester_00-01 x (EURUSD,D1)       OpenCL init OK!
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       GPU time = 999 ms
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       Result on Gpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       CPU time = 434167 ms
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       Result on Cpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       CpuTime/GpuTime = 434.6016016016016
得るものはさらに大きくなりました。
 
Renat: 参考:GetTickCountが16msよりはるかに小さいエラーを持っている場合、あなたはWindows 95を使用していない。

誤差は実はあまりないんです。はい、それに近いですが、平均値から外れて、32、48、さらにそれ以上に集まっています。彼らは珍しい、私は議論しない、彼らは無視することができます。

しかし、人がスクリプトを実行するとき、必ずしもコンピュータ上で何かをするわけではありません。そして、システムは独自のタスクを実行することもでき、実行速度が遅くなることもあります。

技術的には、標準偏差は 確かに6〜7程度と小さく、実行時間自体への依存性も弱い。しかし、それは本当のばらつきをうまく反映していない。同じ計算をしたときに記録された時間のヒストグラムを示します。

隣り合うバーの間隔は16msです。小さい列はかなり可能性が高く、32ms程度の差で互いに異なる。真ん中の列(「真の実行時間」)を140ミリ秒とすると、左は124ミリ秒、右は156ミリ秒となります。

そのため、低いGPUの実行時間で割ったときの実質的な変動はかなり大きくなる可能性があります。

20秒/124ms〜161

20秒/156ms ~ 128.

実行時間の「真の比率」は、一番大きな棒グラフにほぼ一致する。

20秒/140ms ~ 143.

GPUでの実行時間を長くとれば、このエラーの影響はかなり少なくなります。せめて500msにしとけよ。

シミュレーションのためのスクリプトです。

#define BIG       10000000
#define SMALL     1000

void OnStart( )
{
   Print( "Script started..." );
   double k;
   int times[ SMALL ];
   MathSrand( TimeCurrent( ) );
   for( int ii = 0; ii < SMALL; ii ++ )
   {
      Comment( ii );
      int st = GetTickCount( );
      for( int i = 0; i < BIG; i ++ )   k = sin( i );
      int timeTotal = GetTickCount( ) - st;
      times[ ii ] = timeTotal;
   }

   int h = FileOpen( "gtc_times.txt", FILE_WRITE, "\r\n"  );
   for( int ii = 0; ii < SMALL; ii ++ )
      FileWrite( h, times[ ii ] );   
   FileClose( h ); 
   Print("Script unloaded");
}
//+------------------------------------------------------------------+