DirectX - page 2

 
Rorschach:

https://www.mql5.com/ru/forum/227736

Transféré au shader. Les 15 premières secondes, le code source s'exécute sur le cpu, puis la version gpu s'exécute.

"Vous devez déplacer le tableau m_pixels[] de protected : vers public : dans le fichier Canvas.mqh avant de compiler"

Hmm. Intéressant. Il s'avère que la vitesse est la même. Probablement parce qu'il n'y a pas de conversions en 3D.

Je dois essayer avec ce code.


ZSY utilise ce design pour ne pas avoir à réparer les bibliothèques originales.

#define protected public
#include <Canvas\Canvas.mqh>
#undef protected

SZY

Oh non ! Désolé - j'ai fait une erreur dans le code et je n'ai donc pas remarqué que la partie CPU ne fonctionnait pas du tout. Corrigé.
Résultat - 2,5 fois plus rapide grâce au GPU.

Très agréable à voir. Merci beaucoup pour cette mise en œuvre. Je l'ai juste un peu modifié.

Dossiers :
 
Rorschach:

https://www.mql5.com/ru/forum/227736

Transféré au shader. Les 15 premières secondes exécutent le code source sur le cpu, puis la version sur le gpu.

Il est intéressant de faire la même chose avec ce code et de voir comment le gain de performance change en fonction de la complexité des calculs (augmentation des centres de gravité).

Ce code n'utilise pas un tableau de sinus pour accélérer les choses, il calcule simplement le sinus. Et vous pouvez également modifier le nombre de centres de gravité en rotation.

Dossiers :
Swirl2.mq5  5 kb
 
Nikolai Semko:

Je dois essayer avec ce code.

Je veux faire le calcul des indicateurs complètement sur le gpu, je dois trouver comment envoyer de tels volumes de données.

Nikolai Semko:

Le résultat est 2,5 fois plus rapide via le GPU.

Nikolai Semko:

Ce code n'utilise pas le tableau de sinus pour l'accélérer, il calcule simplement le sinus.

XRGB(uchar(128+127*sin(d*45)),uchar(128+127*sin(d*70)),uchar(128+127*sin(d*25)));

Au fait, j'utilise cette formule dans mon shader, ce qui fait que la vitesse est ~10x.

NikolaiSemko:

Il est intéressant de faire la même chose avec ce code et de voir comment le gain de performance change en fonction de la complexité du calcul (augmentation des centres de gravité).

Je vais essayer de le faire.

 
Rorschach:

Je veux faire le calcul des indicateurs complètement sur le gpu, je dois trouver comment transférer de tels volumes de données.

Au fait, j'utilise cette formule dans le shader, donc l'accélération est de ~10x.

Je vais essayer d'en faire un.

Je pense que les résultats devraient inspirer.

Oui, c'est vraiment un ajout très cool à MQL5 ! Merci à l'équipe MQ pour cela.

En incluant simplement la ressource dans le programme, les performances des calculs mathématiques peuvent être multipliées par l'utilisation des ressources de la carte vidéo. Cela permet de décharger le CPU lui-même. C'est-à-dire une super option pour le marché.

Et si OpenCL nécessite une action de la part de l'utilisateur pour installer le logiciel, le DirectX est déjà installé par défaut dans Windows. Et le plus étonnant : j'ai regardé combien le fichier ex5 augmente lorsqu'on utilise DirectX et je n'ai pas vu d'augmentation du fichier du tout. Très cool ! !! Étudions-la et utilisons-la.

 
Nikolai Semko:

Je pense que les résultats devraient être inspirants.

Oui, c'est vraiment un ajout très cool à MQL5 ! Merci à l'équipe MQ pour cela.

En incluant simplement la ressource dans le programme, les performances des calculs mathématiques peuvent être multipliées par l'utilisation des ressources de la carte vidéo. Cela permet de décharger le CPU lui-même. C'est-à-dire une super option pour le marché.

Et si OpenCL nécessite une action de la part de l'utilisateur pour installer le logiciel, le DirectX est déjà installé par défaut dans Windows. Et le plus étonnant : j'ai regardé combien le fichier ex5 augmente lorsqu'on utilise DirectX et je n'ai pas vu d'augmentation du fichier du tout. Très cool ! !! Étudions-la et utilisons-la.

Au fait, oui, le DX est plus polyvalent que l'OCL. Mêmes capacités + 3D. Il existe un mode CPU et vous n'avez pas besoin de mettre un pilote sur le CPU pour cela.

 
Rorschach:

Au fait, j'utilise cette formule dans le shader, donc l'accélération est de ~10x.

Il faut encore compter 2,5 fois. Le processeur a été affecté par l'optimisation, mais pas le processeur graphique.

Nikolai Semko:

Il est intéressant de faire de même avec ce code et de voir comment le gain de performance évolue en fonction de la complexité des calculs (augmentation des centres de gravité).

Ce code n'utilise pas un tableau de sinus pour accélérer les choses, il calcule simplement le sinus. Et vous pouvez également modifier le nombre de centres de gravité en rotation.

J'ai activé l'optimisation. Le code a été réorganisé en 3 cycles pour faciliter son transfert. La limite est de 512 centres. Par défaut, il fonctionne directement sur le gpu.

Dossiers :
pixel.zip  1 kb
 
Rorschach:

Vous devez toujours compter 2,5 fois. Le CPU a été affecté par l'optimisation, mais pas le GPU.

J'ai activé l'optimisation. J'ai réécrit le code en 3 cycles pour le rendre plus facile à porter. Le code est limité à 512 centres. Par défaut, il s'exécute directement sur le GPU.

Merci beaucoup !
2,5x sur la base de calculs simples est également un très bon résultat. En 3D, je pense que le résultat sera encore plus abrupt.

 
Rorschach:

Vous devez toujours compter 2,5 fois. Le CPU a été affecté par l'optimisation, mais pas le GPU.

J'ai activé l'optimisation. J'ai réarrangé le code en 3 boucles pour le rendre plus facile à porter. Nous l'avons limité à 512 centres. Par défaut, il s'exécute directement sur le GPU.

Vous avez demandé l'implémentation d'OpenCl. Quelque chose s'est avéré. Pardon pour le code, je n'ai pas eu le temps de le nettoyer. L'essentiel est que cela fonctionne.

__kernel void Func(int N, __global double *XP, __global double *YP, __global uchar *h, __global uint *buf)
{
   size_t X = get_global_id(0);
   size_t Width = get_global_size(0);
   size_t Y = get_global_id(1);
   
   float2 p;
   double D=0,S1=0,S2=0;
   
   for(int w=0;w<N;w++){ 
      p.x = XP[w]-X;
      p.y = YP[w]-Y;
      D = fast_length(p);
      S2+=D;
      if(w<N/2)
         S1+=D;
   }   
   //
   double d=S1/S2;
   buf[Y*Width+X] = upsample(upsample((uchar)0xFF,(uchar)h[(int)(d*11520)]),upsample((uchar)h[(int)(d*17920)],(uchar)h[(int)(d*6400)]));
}
Dossiers :
Swirl2_OCL.mq5  14 kb
test_002.zip  1 kb
 
Serhii Shevchuk:

Vous avez demandé une implémentation d'OpenCl. Quelque chose est sorti. Pardonnez le code, je n'ai pas eu le temps de le brosser. L'essentiel est que cela fonctionne.

WOW ! Wow ! Inattendu pour moi, pour être honnête. Un gain de plus de 10x avec ma modeste carte vidéo.
Merci beaucoup !

 
Serhii Shevchuk:

Vous avez demandé une implémentation d'OpenCl. Quelque chose est sorti. Pardonnez le code, je n'ai pas eu le temps de le brosser. L'essentiel est que cela fonctionne.

Merci beaucoup !

Vos calculs sont-ils dans le double ? Le résultat est alors particulièrement impressionnant.