Discussione sull’articolo "OpenCL: da semplice verso una programmazione più perspicace" - pagina 2

 
denkir: Si potrebbe aggiungere, ad esempio, qualche calcolo statistico.

Ho già intenzione di farlo, (molto probabilmente) sarà solo la raccolta di statistiche su una grande storia. Niente a che fare con i muves però. Odio i muves - ho il diritto di farlo :)

Sincronizzare le quotazioni.

Questo è un compito per la CPU piuttosto che per la GPU. Non tutte le operazioni sono adatte alla GPU, non è vero? È meglio sceglierne uno adatto, perché è a questo che serve la GPU.

Questo sarà un array bidimensionale.

Presumo che nel futuro articolo sarà tridimensionale. Allo stesso tempo, diventerà chiaro come lavorare con il buffer della GPU che visualizza un array di qualsiasi dimensione.

 
Mathemat:

Già in procinto di farlo, (molto probabilmente) si tratterà solo di raccogliere statistiche su una grande storia....

Presumo che in un futuro articolo sarà tridimensionale. Allo stesso tempo diventerà chiaro come scrivere un array di qualsiasi dimensionalità nel buffer della GPU e come lavorare con esso.

fantastico! Aspettiamo...

 
denkir: Prendere la cronologia delle quotazioni di tutti gli strumenti nel terminale. Diciamo un minuto. Sincronizzate le quotazioni.

È necessario sincronizzare anche le quotazioni?

P.S. Ho letto la guida, vedo che è necessario.

 

Ho ricalcolato i risultati dell'articolo tenendo conto dell'aggiornamento hardware.

Un anno fa: CPU Intel Pentium G840 (2 core @ 2,8 GHz) + scheda video AMD HD4870.

Recentemente: CPU Intel Xeon E3-1230v2 (4 core/8 thread @ 3,3 GHz; leggermente inferiore all'i7-3770) + scheda video AMD HD.6 870.

I risultati dei calcoli in OpenCL sono mostrati nel grafico (in orizzontale - il numero di ottimizzazioni applicate nell'articolo):


Il tempo di calcolo è mostrato verticalmente in secondi. Il tempo di esecuzione dello script "in un colpo solo sulla CPU" (su un core, senza OpenCL) variava a seconda delle modifiche dell'algoritmo entro 95 più o meno 25 secondi.

Come possiamo vedere, tutto sembra chiaro, ma ancora non molto evidente.

L'ovvio outsider è il G840 dual-core. Beh, c'era da aspettarselo. Ulteriori ottimizzazioni non hanno modificato troppo il tempo di esecuzione, che è variato da 4 a 5,5 secondi. Si noti che anche in questo caso l'accelerazione dell'esecuzione degli script ha raggiunto valori superiori a 20 volte.

Nella competizione tra due schede video di generazioni diverse - la vecchia HD4870 e la più moderna HD6870 - possiamo quasi considerare la 6870 come la vincitrice. Tranne che nell'ultima fase di ottimizzazione, dove il mostro antico 4870 ha comunque strappato una vittoria nominale (anche se è rimasto indietro per quasi tutto il tempo). I motivi, francamente, non sono chiari: gli shader sono più piccoli e la loro frequenza è inferiore, ma ha comunque vinto.

Supponiamo che si tratti dei capricci dello sviluppo delle generazioni di schede video. O di un errore nel mio algoritmo :)

Sono stato francamente soddisfatto dello Xeon, che è riuscito a essere migliore dell'antica 4870 con tutte le ottimizzazioni, e ha combattuto con la 6870 quasi alla pari, e alla fine è riuscito persino a batterli tutti. Non sto dicendo che sarà sempre così per qualsiasi compito. Ma il compito era computazionalmente molto difficile: dopo tutto, si trattava della moltiplicazione di due matrici di dimensioni 2000 x 2000!

La conclusione è semplice: se si dispone già di una CPU decente come l'i7, e le computazioni OpenCL non sono troppo lunghe, allora forse non è necessario un riscaldatore potente aggiuntivo (scheda video). D'altra parte, caricare la pietra al 100% per decine di secondi (durante i calcoli lunghi) non è molto piacevole, perché il computer "perde reattività" per questo tempo.

 

Ciao a tutti,

Puoi fornire un esempio di come OpenCL possa accelerare il backtesting di un EA in modalità EveryTick? Attualmente mi ci vogliono 18 minuti per eseguire 14 anni di dati in modalità EveryTick. Credo che molti trader saranno interessati se OpenCL può ridurre il tempo di test del 50%.

 

Ottimo articolo, ma non ho capito come lo spostamento del trasferimento della riga dall'interno del ciclo all'esterno della memoria privata lo velocizzi.

La stessa operazione di trasferimento avviene comunque, ho un impatto nullo sul mio codice ma ovviamente ogni caso è diverso. (ma d'altra parte 0 impatto dopo l'aggiunta di qualcosa significa che qualcosa si è velocizzato ma senza alcun guadagno).

Questa parte è nel sorgente OpenCL:

      "  REALTYPE rowbuf[ COLSROWS ];                                               \r\n"
      "  for( int col = 0; col < COLSROWS; col ++ )                                 \r\n"
      "     rowbuf[ col ] = in1[ r * COLSROWS + col ];                              \r\n"

Dove si sposta al di fuori del ciclo di crunch

Grazie

 
Grazie per l'articolo, è stato un grande apprendimento, non vedo l'ora di metterlo in pratica.