Il Distributore Compute lavoro sarà pianificare un blocco di filettatura (CTA) su un SM solo se la SM ha risorse sufficienti per il blocco filo (memoria condivisa, fili di ordito, i registri, le barriere, ...). Le risorse a livello del blocco di thread vengono allocate come memoria condivisa. L'allocazione crea warping sufficienti per tutti i thread nel blocco thread. Il gestore risorse assegna il round robin warps alle sotto-partizioni SM. Ciascuna partizione SM contiene uno scheduler di warp, un file di registro e unità di esecuzione. Una volta assegnata una distorsione a una sottopartizione, rimarrà nella sottopartizione finché non viene completata o viene anticipata da un interruttore di contesto (architettura Pascal). Sul commutatore di contesto, il warp verrà ripristinato sullo stesso ID di warp stesso.
Quando tutte le discussioni in ordito hanno completato le attese ordito scheduler per tutte le istruzioni in circolazione emesse dalla ordito per completare e poi i Resource Manager rilascia le risorse a livello di ordito che comprendono ordito-id e registrare file.
Quando tutti gli orditi in un blocco di thread sono completi, le risorse a livello di blocco vengono rilasciate e SM comunica al Distributore di lavoro di calcolo che il blocco è stato completato.
Una volta assegnata una distorsione a una sottopartizione e assegnate tutte le risorse, l'ordito è considerato attivo, il che significa che lo scheduler di ordito sta attivamente monitorando lo stato del curvatura. Ad ogni ciclo, lo scheduler di ordito determina quali deformazioni attive sono bloccate e quali sono idonee a emettere un'istruzione. Lo scheduler del warp seleziona la warp idonea con la priorità più alta e rilascia 1-2 istruzioni consecutive dal warp. Le regole per la duplicazione sono specifiche per ogni architettura. Se un ordito emette un carico di memoria, può continuare a eseguire istruzioni indipendenti fino a quando non raggiunge un'istruzione dipendente. Il warp riporterà quindi in stallo fino al completamento del caricamento. Lo stesso vale per le istruzioni matematiche dipendenti. L'architettura SM è progettata per nascondere sia l'ALU che la latenza della memoria passando per ciclo tra gli orditi.
Questa risposta non utilizza il termine nucleo CUDA in quanto introduce un modello mentale errato. I core CUDA sono unità di precisione in virgola mobile/intero con pipeline a precisione singola. La frequenza di emissione e la latenza delle dipendenze sono specifiche per ogni architettura. Ciascuna SM subpartition e SM ha altre unità di esecuzione comprese unità load/store, unità a virgola mobile a precisione doppia, unità a virgola mobile di precisione, unità di derivazione, ecc.
Al fine di ottimizzare le prestazioni lo sviluppatore deve capire il trade off di blocchi contro deformazioni vs registri/thread.
Il termine occupazione è il rapporto tra gli orditi attivi e gli orditi massimi su una SM. Kepler - L'architettura Pascal (eccetto GP100) ha 4 programmatori di ordito per SM. Il numero minimo di orditi per SM dovrebbe essere almeno uguale al numero di schedulatori di ordito. Se l'architettura ha una latenza di esecuzione dipendente di 6 cicli (Maxwell e Pascal), allora occorrono almeno 6 warps per scheduler che sono 24 per SM (24/64 = 37,5% di occupazione) per coprire la latenza. Se i thread hanno parallelismo a livello di istruzioni, questo potrebbe essere ridotto. Quasi tutti i kernel emettono istruzioni di latenza variabile come carichi di memoria che possono richiedere 80-1000 cicli. Ciò richiede più warps attivi per lo scheduler di warp per nascondere la latenza. Per ogni kernel esiste un trade off point tra il numero di warp e altre risorse come la memoria condivisa oi registri, quindi l'ottimizzazione per il 100% di occupazione non è consigliata in quanto probabilmente verranno fatti altri sacrifici.Il profiler CUDA può aiutare a identificare il tasso di emissione delle istruzioni, l'occupazione e le ragioni di stallo al fine di aiutare lo sviluppatore a determinare tale equilibrio.
Le dimensioni di un blocco di filettatura possono influire sulle prestazioni. Se il kernel ha blocchi di grandi dimensioni e utilizza le barriere di sincronizzazione, le bancarelle di barriera possono essere un motivo di stallo. Questo può essere alleviato riducendo gli orditi per blocco di thread.
Una sola aggiunta: sui dispositivi più recenti ci sono 32 (Compute Capability 2.0) o 48 (2.1) core CUDA per SM. Il numero effettivo non fa molta differenza per la programmazione, la dimensione del warp è 32 e ha lo stesso significato (cioè esecuzione in lock-step). – Tom
E infatti Compute Capability 3.0 (Kepler) ora aumenta enormemente i core/SM - a 192! – Edric
Ancora non capisco. Quindi è sempre 1 warp per core e il numero di warp per SM è uguale al numero di core per SM? E in che modo i blocchi di thread vengono mappati in orditi? I blocchi consistono sempre in un numero intero di orditi? Se per esempio ogni blocco contiene 3 warp, vuol dire che sto usando 3 core su un dato SM? –