OpenCL : tests de l'implémentation interne dans MQL5 - page 64

 

http://www.ixbt.com/video3/rad2.shtml- Il est préférable d'utiliser des bibliothèques optimisées pour le big data plutôt que de faire preuve de "créativité" en écrivant des programmes en OpenCL (je ne l'exclus pas). Vous pouvez utiliser un système hybride, où les petites quantités sont traitées à l'aide d'OpenCL et les grandes quantités à l'aide de bibliothèques optimisées. Vous devrez peut-être convertir la bibliothèque dans un langage de programmation spécifique et créer des conditions pour l'inclusion de cette bibliothèque. Si cela peut être mis en œuvre, cela donnera un résultat impressionnant et accélérera donc l'opération de plusieurs fois. Note à .....

P.S. Ceci peut être un nouveau fil dans le forum

������������������ AMD Radeon � �������������� �����������. ������������� AMD Core Math Library
  • www.ixbt.com
������� ������� ����������� �� �������, ��������� ����������� � ���� � �� �� �����, �� ������ ��� �� ����� ������. � ������� ������������ ������� �� ����� ����������� �� ����� �������, � �������� GPU ����� ����� ������������� �������� ��������� ������� ��������� ���� � ����� ����� �� ����� �����. � ���� ����� ������ ���������� ��� PC ����� x86...
 
GKS: Il peut s'avérer nécessaire de convertir les bibliothèques en un langage de programmation spécifique et de créer les conditions nécessaires à l'activation de cette bibliothèque. Si cela peut être mis en œuvre, vous obtiendrez un résultat impressionnant et, par conséquent, l'opération sera accélérée plusieurs fois.

Il n'est pas technologique pour les développeurs de mettre au point le compilateur spécifiquement pour un produit extrêmement spécifique, bien qu'unique.

Et jusqu'à présent, je ne vois aucune tâche de trader qui nécessite une taille aussi importante de matrices multipliées.

 
MetaQuotes:

Annonce de la mise à jour de MetaTrader 5

Une mise à jour de la plateforme MetaTrader 5 sera publiée dans les prochains jours. Une fois la mise à jour publiée, il y aura un communiqué de presse supplémentaire contenant la liste finale des modifications et les numéros de version. Les changements suivants sont prévus :

MetaTrader 5 Client Terminal build 648

MetaTester : Ajout de la prise en charge de l'utilisation de programmes OpenCL dans les agents de test.

Ceux qui comprennent OpenCL peuvent préparer un test de tâches sous Cloud+OpenCL. Perspectives mathématiques très intéressantes.
 
hrenfx: Comprendre OpenCL, préparer un test de tâches pour Cloud+OpenCL. Perspectives mathématiques très intéressantes.
C'est plutôt pour MetaDriver. C'est un grand spécialiste d'OpenCL ici et il essaie en quelque sorte d'émuler les tests.
 
hrenfx:
Comprendre OpenCL, préparer un test de tâches pour Cloud+OpenCL. Perspectives mathématiques très intéressantes.
Mathemat:
C'est plutôt pour MetaDriver........................
Je vais y réfléchir. J'ai besoin d'idées sur ce qui doit être calculé exactement.
 

Pilote vidéo récemment mis à jour (NVIDIA301.42).

J'ai fait un des anciens tests par intérêt (ParallelTester_00-01x) et je n'en croyais pas mes yeux.

Sur la page 24, je faisais un test, et il y avait 29, puis j'ai mis la mémoire en mode 2 canaux et c'est passé à 39.

Maintenant, c'est ~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)
Incroyable. Il semble que NVIDIA ait modifié les pilotes de manière humaine.
 

fyords, comment avez-vous fait pour que les événements antérieurs apparaissent plus haut dans le journal ?

Mais en général, c'est génial, je vous comprends. J'étais tout aussi heureux lorsque j'ai acheté ma HD 4870 à bas prix et que j'ai vu sa puissance.

Une petite recommandation : choisissez les paramètres de façon à ce que le temps d'exécution du GPU soit comparable à 1 seconde. Alors le rapport de temps sera également plus précis. L'erreur moyenne de la fonction GteTickCount() n'est pas inférieure à quelques dizaines de millisecondes. Vous pourriez donc facilement obtenir 120 ms ou 170 ms sur le GPU. Et la valeur de l'accélération en dépend grandement.

J'ai un peu affiné ce script pour qu'il fonctionne sur tous les périphériques disponibles (regardez de bas en haut : 1) CPU sur plateforme Intel, puis 2) HD 4870 sur plateforme AMD, et 3) CPU sur plateforme AMD) :

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)

Les résultats de l'écriture se font de bas en haut !

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)     ========================================
Avec ce dernier paramètre, qui est 10 fois moins élevé, ma carte n'est pas aussi rapide que la vôtre. Il n'a probablement pas le temps d'overclocker correctement :)
 
Pour information, GetTickCount a un taux d'erreur bien inférieur à 16 ms, ce n'est pas comme sous Windows 95.
 
Mathemat:

fyords, comment avez-vous fait pour que les événements antérieurs apparaissent plus haut dans le journal ?

Dans les rapports, bouton droit "View", nouvelle fenêtre bouton "Query" et le journal est construit par temps correctement, et c'est plus pratique à lire (pour moi).

Quant au script, merci, je l'essaierai demain, c'est une longue attente pour sa réalisation, surtout avec Count pass = 12800.

Pour l'instant, voici un ancien script avec le nombre de passages = 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
Le gain est devenu encore plus important.
 
Renat: Pour information : GetTickCount a une erreur bien inférieure à 16 ms, ce n'est pas comme si vous utilisiez Windows 95.

L'erreur n'est en fait pas beaucoup moins importante. Oui, presque, mais il y a des valeurs aberrantes par rapport à la moyenne, regroupées autour de 32, 48 et même plus. Ils sont rares, je ne discute pas, ils peuvent être ignorés.

Mais lorsqu'une personne exécute un script, elle ne fait pas nécessairement quelque chose sur l'ordinateur. Et le système peut également exécuter ses propres tâches, ce qui peut ralentir l'exécution.

Techniquement, l'écart-type est effectivement faible, autour de 6-7, et dépend faiblement du temps d'exécution lui-même. Mais elle reflète mal la véritable variation. Voici un histogramme des temps enregistrés lors de l'exécution des mêmes calculs :

La distance entre les barres adjacentes est de 16ms. Des colonnes plus petites sont tout à fait probables, et elles ne diffèrent les unes des autres que de 32 ms. Si la colonne du milieu ("temps d'exécution réel") est de 140 millisecondes, alors celle de gauche est de 124 ms et celle de droite de 156 ms.

Ainsi, la variation réelle, divisée par le faible temps d'exécution du GPU, peut être assez importante :

20 secondes/124 ms ~ 161

20 secondes/156 ms ~ 128.

Le "vrai rapport" des temps d'exécution correspond approximativement à la barre la plus grande :

20 sec/140ms ~ 143.

Si nous prenons un temps d'exécution plus long sur le GPU, l'impact de cette erreur sera bien moindre. Laissez au moins 500 ms.

Script pour la simulation :

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