OpenCL:MQL5中的内部实现测试 - 页 64

 

http://www.ixbt.com/video3/rad2.shtml- 最好使用针对大数据的优化库 ,而不是 "创造性 "地在OpenCL中编写程序(我并不排除这种可能性)。你可以使用一个混合系统,即使用OpenCL处理小量使用优化库处理大量你可能需要将该库转换为特定的编程语言,并为该库的加入创造条件。如果这一点能够实现,它将带来令人印象深刻的结果,并因此而使行动加快许多倍。请注意:.....

P.S 这可能是论坛中的一个新主题

������������������ AMD Radeon � �������������� �����������. ������������� AMD Core Math Library
  • www.ixbt.com
������� ������� ����������� �� �������, ��������� ����������� � ���� � �� �� �����, �� ������ ��� �� ����� ������. � ������� ������������ ������� �� ����� ����������� �� ����� �������, � �������� GPU ����� ����� ������������� �������� ��������� ������� ��������� ���� � ����� ����� �� ����� �����. � ���� ����� ������ ���������� ��� PC ����� x86...
 
GKS: 可能有必要将库转换为特定的编程语言,并创造条件启用这个库。如果能实现这一点,你会得到一个令人印象深刻的结果,从而使操作速度加快许多倍。

对于开发人员来说,为一个极其特殊的、尽管是独特的产品专门调整编译器是没有技术含量的。

到目前为止,我没有看到任何交易员的任务需要这么大的乘法矩阵。

 
MetaQuotes:

关于MetaTrader 5更新的公告

MetaTrader 5平台的更新将在未来几天公布。一旦更新发布,将有一个额外的新闻发布,包含最终的变化清单和构建号。 计划进行以下改革。

MetaTrader 5客户终端build 648

MetaTester:增加了对测试代理中使用OpenCL程序的支持。

了解OpenCL的人,可以在Cloud+OpenCL下准备一个任务测试。非常有趣的数学观点。
 
hrenfx: 了解OpenCL,为Cloud+OpenCL准备一个任务测试。非常有趣的数学观点。
这更多是为了MetaDriver。他是这里的一个大的OpenCL专家,有点想模仿测试的意思。
 
hrenfx:
了解OpenCL,准备一个Cloud+OpenCL的任务测试。非常有趣的数学观点。
数学
这更适合MetaDriver。.......................
我会考虑的。 我需要在 具体需要计算的内容 方面有一些想法。
 

最近更新了视频驱动(NVIDIA301.42)。

我为了兴趣做了一个旧的测试(ParallelTester_00-01x),无法相信自己的眼睛。

在24页,我正在做测试,有29个,然后我把内存设置为2通道模式,它变成了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,看到它的威力时,我也一样高兴。

一个小建议:选择参数,使GPU的执行时间与1秒相当。那么时间比例也会更准确。GteTickCount()函数的平均误差不低于几十毫秒。因此,你可以很容易地在GPU上得到120毫秒或170毫秒。而加速的价值在很大程度上取决于此。

我对这个脚本进行了一些微调,使其在所有可用的设备上运行(从底部往上看:1)英特尔平台的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 的错误率远低于16毫秒,这不像是你在使用Windows 95。
 
Mathemat:

fyords,你是如何让早期的事件在日志中显示得更高?

在报告中,右键 "查看",新窗口 "查询 "按钮,日志按时间正确建立,阅读起来更方便(对我来说)。

至于脚本,谢谢你,我明天会试一下,它的完成需要等待很长时间,特别是在 Count pass = 12800 的情况下。

现在,这里有一个旧的脚本,其计数通道=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秒/124毫秒 ~ 161

20秒/156毫秒~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");
}
//+------------------------------------------------------------------+