Penso che dovresti dare un'occhiata più approfondita alla programmazione dei kernel in cuda.
Ci sono due dimensioni importanti: blocchi e thread per blocco
Ogni blocco è prevista su un SM e c'è quindi tagliati a orditi. Quindi i blocchi hanno una memoria condivisa accessibile solo all'interno del blocco, perché si trova sulla memoria SM. Il numero di blocchi per SM dipende dal limite del dispositivo e dal calcolo dell'occupazione. I blocchi massimi per SM sono 8 per CC 1.0-2.xe 16 per CC 3.x.
Ogni blocco ha un determinato numero di thread per blocco. I fili sono divisi in in orditi e gli orditi possono essere eseguiti in un ordine arbitrario determinato solo dallo schedulatore di ordito e dal SM.
Ora la scheda ha un numero totale di 384 core su 2 SM con 192 core ciascuno. Il core count CUDA rappresenta il numero totale di istruzioni di thread in virgola mobile o intero intero che possono essere eseguite per ciclo. Non considerare i nuclei CUDA in alcun calcolo.
Il numero massimo di thread varia a seconda della capacità di calcolo. CC2.0-3.x supporta un massimo di 1024 thread per blocco a fronte di registri e spazi di curvatura sufficienti. I warps sono assegnati staticamente agli scheduler di warp. Il numero di schedulatori di ordito per SM è 1 per CC 1.x, 2 per CC 2.xe 4 per CC 3.x.
Se l'applicazione non esegue i kernel simultanei, quindi per utilizzare ogni SM la grigliaDim dovrebbe avere> = numero di blocchi SM.
Per GTX650m per utilizzare completamente la potenza del computer, è necessario disporre di almeno due blocchi (altrimenti con un blocco è possibile utilizzare solo un SM). D'altra parte, se si desidera pianificare 10240 thread, è possibile pianificare facilmente 10 blocchi di 1024 thread ciascuno.
Grazie. La programmazione del distorsione era ciò che mi mancava, penso. –