Ho esaminato la guida alla programmazione e alle best practice e ho menzionato che l'accesso alla memoria globale richiede 400-600 cicli. Non ho visto molto sugli altri tipi di memoria come la cache delle texture, la cache costante, la memoria condivisa. I registri hanno 0 latenza di memoria.Quanti cicli di latenza della memoria per tipo di accesso alla memoria in OpenCL/CUDA?
Penso che la cache costante sia la stessa dei registri se tutti i thread utilizzano lo stesso indirizzo nella cache costante. Nel peggiore dei casi non ne sono così sicuro.
La memoria condivisa è uguale a quella dei registri purché non vi siano conflitti bancari? Se ci sono allora come si svolge la latenza?
E per quanto riguarda la cache delle texture?
Vale ancora la pena utilizzare la cache costante se, ad esempio, tutti i thread accedono a 1000 float? Sarebbe come un 1000 legge da un registro? La guida dice che l'uso della cache costante in questo modo scala linearmente giusto? – smuggledPancakes
Se tutti i thread accedono allo stesso * valore * in una determinata iterazione di un ciclo, è possibile utilizzare la cache costante. La cache costante fornirà alcuni vantaggi a causa della località spaziale (su Fermi la cache L1 può ottenere la stessa cosa ma lascia L1 libera per altri dati). Detto questo, bersaglio principalmente Fermi e non uso mai '__constant__', uso solo const molto e lascia che sia il compilatore a capirlo! Per esempio nel tuo caso io passerei il kernel arg come 'const float * const myfloatarray'. Suggerirei sempre di eseguire Visual Profiler per verificare la presenza di serializzazioni nel caso in cui vi siate persi qualcosa. – Tom
Si potrebbe aggiungere che le linee di cache sono 128byte (32byte) per L1 (L2), quindi stiamo parlando di indirizzi che cadono nelle stesse linee (non necessariamente gli stessi indirizzi). Alcuni numeri su altre latenze possono essere trovati [qui] (http://stackoverflow.com/questions/6744101/fermi-l2-cache-hit-latency). –