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

 
tol64 :

아마도 Renat에게 이것으로부터 무엇을 배울 수 있는지 보도록 하십시오. 새로운 사양이 MQL5에서도 더 나은 성능을 제공할 수 있습니까?

C#/C++의 경우 필요한 경우 덤프할 수 있습니다. 가장 중요한 것은 가능한 최대 배기량을 갖는 것입니다. ;)

음디아. 지금까지, 새로운 MT4에 최소한 버전 1.1이 최종적으로 포함될 것이라는 소심한 희망으로 인해 CL 옵티마이저를 샤프용으로 다시 작성하지 못하게 되었습니다. 언어가 동일하고 컴파일러가 동일하며 근본적인 장애물이 없는 것 같습니다(MT4 테스터에서 OpenCL 지원 이 실제로 필요하지는 않지만 거부하지는 않겠습니다). 그들이 그것을 켜지 않으면 나는 왼쪽으로 생각할 것입니다.
 

이러한 시스템에서 이 분기의 일부 스크립트를 테스트했습니다.

CPU-Z


쿠다-Z



필요한 경우 다른 사람들이 결과를 빠르게 찾고 테스트하고 비교할 수 있도록 각 스크립트에 대해 게시된 메시지에 대한 링크를 제공합니다.

테스트 1


테스트 2

 2013.11 . 29 14 : 29 : 13      ParallelOptimazer_00- 02 (EURUSD,H1)     Generation 013 ( 1280 passes, 140 ms) : MaxResult== 116.05191 ; Average Result== 106.7991
2013.11 . 29 14 : 29 : 13      ParallelOptimazer_00- 02 (EURUSD,H1)     Generation 014 ( 1280 passes, 125 ms) : MaxResult== 116.05191 ; Average Result== 106.77599
2013.11 . 29 14 : 29 : 13      ParallelOptimazer_00- 02 (EURUSD,H1)     Generation 015 ( 1280 passes, 125 ms) : MaxResult== 116.05191 ; Average Result== 106.37561
2013.11 . 29 14 : 29 : 13      ParallelOptimazer_00- 02 (EURUSD,H1)     Generation 016 ( 1280 passes, 140 ms) : MaxResult== 116.05191 ; Average Result== 106.64193
2013.11 . 29 14 : 29 : 13      ParallelOptimazer_00- 02 (EURUSD,H1)     Optimization finished. Best result == 116.05191 at 16 generation.
2013.11 . 29 14 : 29 : 13      ParallelOptimazer_00- 02 (EURUSD,H1)     Total time of optimization == 2 sec 122 ms

테스트 3

스케일 = 1000

CPU

GPU


테스트 4

 2013.11 . 29 16 : 02 : 31      Tast_Mand_ (EURUSD,H1)   1872 msec

테스트 5

 2013.11 . 29 16 : 39 : 50      ParallelTester_00- 01 x (EURUSD,H1)       CLGetInfoInteger () returned 2
2013.11 . 29 16 : 39 : 51      ParallelTester_00- 01 x (EURUSD,H1)       OpenCL init OK!
2013.11 . 29 16 : 39 : 51      ParallelTester_00- 01 x (EURUSD,H1)       GPU time = 62 ms
2013.11 . 29 16 : 39 : 51      ParallelTester_00- 01 x (EURUSD,H1)       Соunt indicators = 16 ; Count history bars = 144000 ; Count pass = 1280
2013.11 . 29 16 : 39 : 51      ParallelTester_00- 01 x (EURUSD,H1)       Result on Gpu МахResult== 1.34787 at 699 pass
2013.11 . 29 16 : 40 : 05      ParallelTester_00- 01 x (EURUSD,H1)       CPU time = 14492 ms
2013.11 . 29 16 : 40 : 05      ParallelTester_00- 01 x (EURUSD,H1)       Соunt indicators = 16 ; Count history bars = 144000 ; Count pass = 1280
2013.11 . 29 16 : 40 : 05      ParallelTester_00- 01 x (EURUSD,H1)       Result on Cpu МахResult== 1.34787 at 699 pass
2013.11 . 29 16 : 40 : 05      ParallelTester_00- 01 x (EURUSD,H1)       CpuTime/GpuTime = 233.741935483871

테스트 6

 2013.11 . 29 16 : 45 : 28      ParallelTester_00- 01 x_cycle (EURUSD,H1) OpenCL init OK! Device number = 0
2013.11 . 29 16 : 45 : 28      ParallelTester_00- 01 x_cycle (EURUSD,H1) GPU time = 577 ms
2013.11 . 29 16 : 45 : 28      ParallelTester_00- 01 x_cycle (EURUSD,H1) Соunt indicators = 16 ; Count history bars = 144000 ; Count pass = 12800
2013.11 . 29 16 : 45 : 28      ParallelTester_00- 01 x_cycle (EURUSD,H1) Result on Gpu МахResult== 1.57161 at 7031 pass
2013.11 . 29 16 : 45 : 28      ParallelTester_00- 01 x_cycle (EURUSD,H1) OpenCL init OK! Device number = 1
2013.11 . 29 16 : 45 : 29      ParallelTester_00- 01 x_cycle (EURUSD,H1) GPU time = 546 ms
2013.11 . 29 16 : 45 : 29      ParallelTester_00- 01 x_cycle (EURUSD,H1) Соunt indicators = 16 ; Count history bars = 144000 ; Count pass = 12800
2013.11 . 29 16 : 45 : 29      ParallelTester_00- 01 x_cycle (EURUSD,H1) Result on Gpu МахResult== 1.57161 at 7031 pass
2013.11 . 29 16 : 47 : 54      ParallelTester_00- 01 x_cycle (EURUSD,H1) CPU time = 145144 ms
2013.11 . 29 16 : 47 : 54      ParallelTester_00- 01 x_cycle (EURUSD,H1) Соunt indicators = 16 ; Count history bars = 144000 ; Count pass = 12800
2013.11 . 29 16 : 47 : 54      ParallelTester_00- 01 x_cycle (EURUSD,H1) Result on Cpu МахResult== 1.57161 at 7031 pass
2013.11 . 29 16 : 47 : 54      ParallelTester_00- 01 x_cycle (EURUSD,H1) CpuTime/GpuTime = 265.8315018315018

테스트 7

 2013.11 . 29 16 : 54 : 52      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     ========================================
2013.11 . 29 16 : 57 : 16      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     CPU time = 144691 ms
2013.11 . 29 16 : 57 : 16      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     Соunt indicators = 16 ; Count history bars = 144000 ; Count pass = 12800
2013.11 . 29 16 : 57 : 16      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     Result on Cpu МахResult== 0.91969 at 4641 pass
2013.11 . 29 16 : 57 : 16      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     -------------------------
2013.11 . 29 16 : 57 : 16      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     Device number = 0
2013.11 . 29 16 : 57 : 17      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     GPU time = 593 ms
2013.11 . 29 16 : 57 : 17      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 243.9983136593592
2013.11 . 29 16 : 57 : 17      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult== 0.91969 at 4641 pass
2013.11 . 29 16 : 57 : 17      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     ------------
2013.11 . 29 16 : 57 : 17      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     Device number = 1
2013.11 . 29 16 : 57 : 18      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     GPU time = 546 ms
2013.11 . 29 16 : 57 : 18      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 265.0018315018315
2013.11 . 29 16 : 57 : 18      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult== 0.91969 at 4641 pass
2013.11 . 29 16 : 57 : 18      ParallelTester_00- 01 x_new_cycle (EURUSD,H1)     ------------

테스트 8

 2013.11 . 29 17 : 08 : 08      vect_v2_all_devices (EURUSD,H1) =======================================
2013.11 . 29 17 : 08 : 08      vect_v2_all_devices (EURUSD,H1) OCL martices mul:         ROWS1 = 2000 ; COLSROWS = 2000 ; COLS2 = 2000
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) CPUTime = 64.085
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) ---------------
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) read = 4000000 elements
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) Device = 0 : time = 0.251 sec.
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) CPUTime / GPUTotalTime = 255.319
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 1362 , 1715 ) = - 5.34762192 ;    thirdCPU[ 1362 , 1715 ] = - 5.34762192 ;    buf[ 1362 , 1715 ] = - 5.34761715
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 365 , 218 ) = 1.04545093 ;    thirdCPU[ 365 , 218 ] = 1.04545093 ;    buf[ 365 , 218 ] = 1.04544997
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 1461 , 1678 ) = - 0.26404253 ;    thirdCPU[ 1461 , 1678 ] = - 0.26404253 ;    buf[ 1461 , 1678 ] = - 0.26404306
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 1116 , 1765 ) = 0.61209172 ;    thirdCPU[ 1116 , 1765 ] = 0.61209172 ;    buf[ 1116 , 1765 ] = 0.61209279
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 256 , 499 ) = 2.50011539 ;    thirdCPU[ 256 , 499 ] = 2.50011539 ;    buf[ 256 , 499 ] = 2.50011611
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 528 , 1433 ) = 2.69000340 ;    thirdCPU[ 528 , 1433 ] = 2.69000340 ;    buf[ 528 , 1433 ] = 2.69000053
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 926 , 1280 ) = 4.74232054 ;    thirdCPU[ 926 , 1280 ] = 4.74232054 ;    buf[ 926 , 1280 ] = 4.74231577
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 361 , 1757 ) = 2.25322127 ;    thirdCPU[ 361 , 1757 ] = 2.25322127 ;    buf[ 361 , 1757 ] = 2.25322032
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 1441 , 400 ) = - 1.65504980 ;    thirdCPU[ 1441 , 400 ] = - 1.65504980 ;    buf[ 1441 , 400 ] = - 1.65504801
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) sum( 1617 , 306 ) = - 2.14686131 ;    thirdCPU[ 1617 , 306 ] = - 2.14686131 ;    buf[ 1617 , 306 ] = - 2.14686537
2013.11 . 29 17 : 09 : 12      vect_v2_all_devices (EURUSD,H1) ________________________
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) read = 4000000 elements
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) Device = 1 : time = 0.734 sec.
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) CPUTime / GPUTotalTime = 87.309
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 370 , 1332 ) = 0.78463894 ;    thirdCPU[ 370 , 1332 ] = 0.78463894 ;    buf[ 370 , 1332 ] = 0.78463584
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 1346 , 515 ) = 4.13771629 ;    thirdCPU[ 1346 , 515 ] = 4.13771629 ;    buf[ 1346 , 515 ] = 4.13771629
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 632 , 631 ) = 0.53385985 ;    thirdCPU[ 632 , 631 ] = 0.53385985 ;    buf[ 632 , 631 ] = 0.53386015
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 930 , 102 ) = 6.17934942 ;    thirdCPU[ 930 , 102 ] = 6.17934942 ;    buf[ 930 , 102 ] = 6.17935467
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 507 , 167 ) = 2.76653004 ;    thirdCPU[ 507 , 167 ] = 2.76653004 ;    buf[ 507 , 167 ] = 2.76652718
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 1638 , 1623 ) = - 3.40129304 ;    thirdCPU[ 1638 , 1623 ] = - 3.40129304 ;    buf[ 1638 , 1623 ] = - 3.40129256
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 208 , 649 ) = 8.09206963 ;    thirdCPU[ 208 , 649 ] = 8.09206963 ;    buf[ 208 , 649 ] = 8.09207344
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 298 , 741 ) = - 0.59763604 ;    thirdCPU[ 298 , 741 ] = - 0.59763604 ;    buf[ 298 , 741 ] = - 0.59763324
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 1334 , 521 ) = - 2.74508810 ;    thirdCPU[ 1334 , 521 ] = - 2.74508810 ;    buf[ 1334 , 521 ] = - 2.74508691
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) sum( 858 , 760 ) = - 7.48025274 ;    thirdCPU[ 858 , 760 ] = - 7.48025274 ;    buf[ 858 , 760 ] = - 7.48025846
2013.11 . 29 17 : 09 : 13      vect_v2_all_devices (EURUSD,H1) ________________________



CPU-Z CPUID - System & hardware benchmark, monitoring, reporting
CPU-Z CPUID - System & hardware benchmark, monitoring, reporting
  • www.cpuid.com
CPU-Z is a freeware that gathers information on some of the main devices of your system.
 

또한 MetaDriverqpu_EMA-Rainbow 표시기를 테스트하려고 했습니다.


CPU에서 결과는 때때로 최대 2배 더 좋습니다. 결과는 다음과 같습니다.

2013.12.01 14:12:50     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at CPU, time = 811 ms
2013.12.01 14:12:57     qpu_Future_EMA-Rainbow (EURUSD,M1)      OpenCL: GPU device 'GeForce GTX 650 Ti BOOST' selected
2013.12.01 14:12:58     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at GPU (OpenCL), time = 1295 ms

//---

Volodya( MetaDriver ), 어떤 결과를 얻었는지 보여주세요.

PS 커널 코드의 gpuEMA 함수 매개변수에서 유형을 __global 에서 __local 로 변경했습니다. 조금 빨라졌지만 여전히 CPU보다 느립니다.

2013.12.01 14:29:46     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at CPU, time = 795 ms
2013.12.01 14:29:51     qpu_Future_EMA-Rainbow (EURUSD,M1)      OpenCL: GPU device 'GeForce GTX 650 Ti BOOST' selected
2013.12.01 14:29:52     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at GPU (OpenCL), time = 1061 ms
파일:
 
tol64 :

또한 MetaDriverqpu_EMA-Rainbow 표시기를 테스트하려고 했습니다.

CPU에서 결과는 때때로 최대 2배 더 좋습니다. 결과는 다음과 같습니다.

Volodya( MetaDriver ), 어떤 결과를 얻었는지 보여주세요.

PS 커널 코드의 gpuEMA 함수 매개변수에서 유형을 __global 에서 __local 로 변경했습니다. 조금 빨라졌지만 여전히 CPU보다 느립니다.

비슷한 결과가 있습니다. 이것은 오랫동안 논의되어 왔으며 논리적입니다. 작업이 너무 간단하여 메모리를 비디오 카드로 옮기고 다시 돌려도 효과가 없습니다. GPU의 장점은 더 복잡한 작업에서 나타납니다.
 
MetaDriver :
비슷한 결과가 있습니다. 이것은 오랫동안 논의되어 왔으며 논리적입니다. 작업이 너무 간단하여 메모리를 비디오 카드로 옮기고 다시 돌려도 효과가 없습니다. GPU의 장점은 더 복잡한 작업에서 나타납니다.
알겠습니다. 감사합니다. 좀 더 복잡한 작업을 시도해 보겠습니다.
 

거래(파생상품)에 GPU 가속을 사용하는 예.

금융 수학, 특히 파생 상품 및 페어 옵션 거래에 관한 책으로 유명한 Mark Joshi는 수행한 작업에 대해 다음과 같이 보고했습니다.

http://ssrn.com/abstract=2388415

그는 OOP 스타일의 작업을 CUDA GPU로 옮겼습니다. 2010년에 이 사업을 시작하다가 잠시 쉬다가 2011년부터 2014년 여름까지 워킹 버전 0.3까지 만들었습니다. 그는 100X ... 137X 배 의 가속을 달성했습니다. 이것은 복잡한 알고리즘에 있으며 어렵습니다.

이 작업은 C ++의 QuantLib 라이브러리를 사용했으며, 그 자신도 인정하듯 이 "OOP ->-> 절차적 접근" 경로를 따라 재작업해야 했습니다. 모두 CUDA GPU에서 작동하도록 하기 위해서입니다.

그는 다음과 같이 쓰고 있습니다.

"저는 초기 운동 기능을 위해 최소 제곱을 사용하여 GPU에서 LMM을 사용하여 IRD의 Monte Carlo 가격 책정을 구현했습니다.

C++ 및 CUDA 모두에서 kooderive.sourceforge.net에서 코드를 얻을 수 있습니다. 종이는 .....

이전에 C++에 사용했던 것과는 완전히 다른 코드를 CUDA에 사용했습니다. 본질적으로 저는 데이터를 중심 개념으로 취급하고 코드를 사용하여 데이터를 처리합니다. 스타일은 매우 기능적입니다. 이전의 C++ 구현이 객체 지향적이었기 때문에 많은 작업이 필요했습니다."

자신의 오픈 소스 프로젝트:

http://sourceforge.net/projects/kooderive/