CUDA - Multiprocessadores, tamanho de dobra e Máximo de segmentos por bloco: Qual é a relação exata?

Eu sei que existem multiprocessadores em uma GPU CUDA que contém núcleos CUDA neles. No meu local de trabalho eu estou trabalhando com uma GTX 590, que contém 512 núcleos CUDA, 16 multiprocessadores e que tem um tamanho de dobra de 32. Então isso significa que existem 32 núcleos CUDA em cada multiprocessador que funciona exatamente no mesmo código na mesma urdidura . E finalmente os encadeamentos máximos por tamanho de bloco são 1024.

Minha pergunta é como o tamanho do bloco e o número do multiprocessador - o tamanho da dobra estão exatamente relacionados. Deixe-me dizer minha compreensão da situação: Por exemplo, eu aloco N blocos com o tamanho máximo de threadPerBlock de 1024 na GTX 590. Tanto quanto eu entendo do guia de programação CUDA e de outras fontes, os blocos são enumerados primeiramente pelo hardware . Nesse caso, 16 dos N blocos são atribuídos a diferentes multiprocessadores. Cada bloco contém 1024 threads e o agendador de hardware atribui 32 desses threads aos 32 núcleos em um único multiprocessador. Os threads no mesmo multiprocessador (warp) processam a mesma linha do código e usam a memória compartilhada do multiprocessador atual. Se os 32 encadeamentos atuais encontrarem uma operação fora do chip, como as gravações de leitura de memória, elas serão substituídas por outro grupo de 32 encadeamentos do bloco atual. Então, existem 32 threads em um único bloco que sãoexatamente executando em paralelo em um multiprocessador em um determinado momento, não o todo do 1024. Finalmente, se um bloco é completamente processado por um multiprocessador, um novo bloco de segmentos da lista de blocos de segmentos N é conectado ao multiprocessador atual. E finalmente há um total de 512 threads rodando em paralelo na GPU durante a execução do kernel CUDA. (Eu sei que se um bloco usa mais registros do que os disponíveis em um único multiprocessador, então ele é dividido para trabalhar em dois multiprocessadores, mas vamos supor que cada bloco possa caber em um único multiprocessador em nosso caso.)

Então, o meu modelo de execução paralela CUDA está correto? Se não, o que está errado ou faltando? Eu quero afinar o projeto atual no qual estou trabalhando, então eu preciso do modelo de trabalho mais correto da coisa toda.

questionAnswers(1)

yourAnswerToTheQuestion