mi è stato la soluzione di questo "no casuale" problema per ultimi giorni e mi si avvicinò con tre diversi approcci:
Xorshift - ho creato generatore in base a questo. Tutto quello che dovete fare è fornire una uint2
numero (seme) per l'intero kernel e ogni elemento di lavoro calcolerà il proprio numero di rand
// 'randoms' is uint2 passed to kernel
uint seed = randoms.x + globalID;
uint t = seed^(seed << 11);
uint result = randoms.y^(randoms.y >> 19)^(t^(t >> 8));
Java random - ho usato il codice da .next(int bits)
metodo per generare numeri casuali. Questa volta devi fornire un numero ulong
come seme.
// 'randoms' is ulong passed to kernel
ulong seed = randoms + globalID;
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
uint result = seed >> 16;
Basta generare tutto su CPU e passarlo al kernel in un unico grande buffer.
Ho testato tutti e tre gli approcci (generatori) nel calcolo dell'algoritmo di elaborazione. Set minimo di dominazione nei grafici.
Mi piacciono i numeri generati dal primo, ma sembra che il mio algoritmo di sviluppo non lo faccia.
Il secondo generatore genera numeri che hanno qualche schema visibile ma il mio algoritmo di evoluzione piace così in ogni caso e l'intera cosa funziona poco più velocemente rispetto al primo generatore.
Ma il terzo approccio mostra che è assolutamente bene fornire solo tutti i numeri dall'host (cpu). Per prima cosa ho pensato che la generazione (nel mio caso) dei numeri 1536 int32 e il loro passaggio alla GPU in ogni chiamata del kernel sarebbe stata troppo costosa (da calcolare e trasferire in GPU). Ma si scopre, è veloce come i miei precedenti tentativi. E il carico della CPU rimane sotto il 5%.
BTW, ho provato anche MWC64X Random ma dopo aver installato il nuovo driver GPU la funzione mul_hi
inizia a causare errori di compilazione (anche l'intero Kernel Analyer AMD si è bloccato).
si poteva passare un array con alcuni numeri casuali per il kernel, non che essere il più semplice? – eudoxos
È vero, ma poi stai andando avanti e indietro da CPU-> GPU. L'INTERO punto di utilizzo di OpenCL è di rimanere sulla GPU. – user697111
Dipende dall'applicazione e per alcuni tipi di attività (anche all'interno dello stesso problema) la CPU potrebbe essere ancora buona. Dipende da quanto tempo hai a disposizione, generando rande su CPU per lo sviluppo. – eudoxos