Ecco cosa si può fare con OpenCL direttamente in MetaTrader 5 senza alcuna DLL - pagina 5

 
Renat Fatkhullin:

In questo contesto AMD sembra vantaggiosa non solo per i calcoli matematici ovviamente più veloci (le mining farm sono solitamente costruite su AMD), ma anche per la sua strategia di standard aperti (si sono aperti e stanno promuovendo molto al pubblico). L'introduzione di OpenCL 2.0 nelle schede AMD ha portato questa specifica molto vicino alle capacità di CUDA e ora non ha senso gettare le basi per CUDA.

Questa è un'informazione utile, mentre circa 7 anni fa stavo giocando con CUDA e pensavo che fosse ancora il migliore.

Lamia domanda è: e i debugger per OpenCL al giorno d'oggi? Non mi riferisco al terminale MT5 ma al terminale MT5 in generale. Finora, ho visto solo un debugger di Intel come plugin di Visual Studio e un debugger stand-alone (depricato) della stessa azienda. Ma sembra che siano i processori e la grafica incorporata di Intel ad essere destinati a questo scopo. Non capisco bene come fare il debug del codice parallelo - per me è ancora solo una scatola nera.

 

Puoi lavorare con CUDA solo per te stesso o per aree specifiche dove puoi richiedere la presenza esplicita di schede Nvidia.

Sì, CUDA aveva più caratteristiche. Tuttavia, con l'hardware AMD che esce con OpenCL 2.0 e la nuova versione di OpenCL 2.1 non ha senso stare seduti sotto il vendor lock-in. Soprattutto quando quel fornitore sottovaluta anche la funzionalità.

In termini di massima copertura, c'è solo una scelta - OpenCL, che funziona bene anche su processori normali. Cioè, non dovete chiedere la presenza incondizionata della GPU o scrivere due versioni di codice per la GPU e la CPU. Una volta scritto, il codice OpenCL funzionerà su diverse configurazioni.

CUDA/OpenCL può essere debuggato solo in debugger specializzati. Non ci può essere nessun miracolo qui.

 
Renat Fatkhullin:

nell'esempio

if((cl_ctx=CLContextCreate())==INVALID_HANDLE)

Nelle configurazioni con un dispositivo con CPU disponibile, viene visualizzato "OpenCL non trovato".

Altrimenti.

if((cl_ctx=CLContextCreate(CL_USE_ANY))==INVALID_HANDLE)

funziona

*Il problema è la selezione predefinita del dispositivo

 

Possiamo avere tutto questo in una bella forma, senza tutte le virgolette? È imbarazzante per la percezione e la creazione.

E per le reti neurali dovremmo avere classi standard, ed è possibile utilizzare opcl istantaneamente) come wellslab

"#define HL1Count "             + (string)hl1NeuronCount + "                     \r\n"
          "#define HL2Count "             + (string)hl2NeuronCount + "                     \r\n"
          //------------------------------------------------------------------------------------
          "#define NeuronSensitivity  "   + (string)NeuronSensitivity_P + "                \r\n"
          //------------------------------------------------------------------------------------
          "#define sampleCount "          + (string)sampleCount + "                        \r\n"
          //------------------------------------------------------------------------------------
          "#define signalCount "          + (string)signalCount + "                        \r\n"
          //------------------------------------------------------------------------------------
          "#define StrArrSaSize "         + (string)(sizeof(ArrSample) / sizeof(float)) + "\r\n"
          "typedef struct{float C[StrArrSaSize];} ArrSa;                                   \r\n"
          //------------------------------------------------------------------------------------
          "#define StrArrWeSize "         + (string)(sizeof(ArrWe) / sizeof(float)) + "    \r\n"
          "typedef struct{float C[StrArrWeSize];} ArrWe;                                   \r\n"
          //------------------------------------------------------------------------------------
          "#define StrArrCrSize "         + (string)(sizeof(ArrCr) / sizeof(float)) + "    \r\n"
          "typedef struct{float C[StrArrCrSize];}ArrCr;                                    \r\n"
          //------------------------------------------------------------------------------------
          "#define Spread "               + (string)(Spread_P * Point()) + "               \r\n"
          //------------------------------------------------------------------------------------
          "#define Point "                + (string)Point() + "                            \r\n"
          "#define SL "                   + (string)(StopLoss_P * Point()) + "             \r\n"
          "#define TP "                   + (string)(TakeProfit_P * Point()) + "           \r\n"
          //------------------------------------------------------------------------------------
          "                                                                                \r\n"
          "__kernel void Work(__global ArrSa *Sample,                                      \r\n"
          "                   __global ArrWe *Weights,                                     \r\n"
          "                   __global ArrCr *Result)                                      \r\n"
          "{                                                                               \r\n"
          "  int thread       = get_global_id(0);                                          \r\n"
          "                                                                                \r\n"
          "  //------------------Переменные нейронной сети---------------------------------\r\n"
 
Maxim Dmitrievsky:

Possiamo avere tutto questo in una bella forma, senza tutte le virgolette? È imbarazzante per la percezione e la creazione.

E per le reti neurali dovremmo avere classi standard, ed è possibile utilizzare opcl istantaneamente) come wellslab

Beh, perché no? Guarda, non c'è una singola funzione specifica che MQL non conosce. Ho usato MQL per scrivere e fare il debug di questa funzione per OCL e poi ho solo indurito il tutto. Si può anche fare un convertitore di codice in OCL, ma non vedo nessun punto particolare nel farlo per me. Forse MQ lo farà, ma ne dubito.
 
Renat Fatkhullin:

Questa è una dimostrazione non solo dei calcoli della GPU nel codice MQL5, ma anche delle capacità grafiche del terminale:

Il codice sorgente completo come script è allegato. Il bug su OpenCL 1.2 è stato risolto.

So anche ricamare. E su una macchina da scrivere... (c) A cosa serve tutto questo terminale di trading?
 
Andrà nel cloud per gli agenti?
 
GKS:
Andrà nel cloud per gli agenti?
No
 

C'è un grosso problema con OCL e in generale con tutti i mezzi di parallelizzazione - pochissimi algoritmi possono essere effettivamente parallelizzati. Perché negli esempi di calcolo parallelo così popolari sono simulazione di onde, palla che cade su una piramide con la loro distruzione, cioè tutto ciò che può essere rotto in piccoli pezzi e calcolato sul proprio processore.

Per il forum/orso, naturalmente, si tratta di reti neurali, varie trasformate di Fourier, wavelets, filtri, ecc. Ma ci sono algoritmi lineari che non possono essere messi in parallelo. Come regola, è quando il risultato del passo successivo dell'algoritmo è basato sul risultato del passo precedente.

Ho scritto questo per coloro che stanno pensando che comprerò due schede video fighe e tutto funzionerà bene nel mio tester.

Motivazione: