CUDA define alguns parâmetros e não tenho certeza de como o CUDA se comporta, se tenho que respeitá-los ou se não os respeito ele funciona, mas talvez não com o melhor desempenho.
Ao olhar, cudaGetDeviceProperties
posso ver alguns parâmetros (retirados do site da NVidia: https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1g1bf9d625a931d657e08db2b4391170f0 :
concurrentKernels
: O dispositivo pode executar vários kernels simultaneamente
Isso é apenas uma bandeira ou há algum impacto? Acho que kernels simultâneos só fazem sentido se streams forem usados, certo? (veja também asyncEngineCount).
asyncEngineCount
: Número de motores assíncronos
Este é o número de kernels que podem ser executados em paralelo, conforme indicado acima. Também aqui acho que isso só funciona quando são usados streams, certo?
Isso me leva a uma questão mais geral sobre streams . Quantos fluxos podem ser usados ou alocados? Por exemplo, se asyncEngineCount
for 3, faz sentido ter mais de 3 fluxos? Se isso não for verdade, faz sentido alocar mais fluxos do que o arquivo asyncEngineCount
.
O que aconteceria se eu alocasse mais streams do que asyncEngineCount e permitisse que vários kernels fossem executados simultaneamente? Vamos supor que eu aloque 10 streams e execute 10 kernels simultaneamente, mas o asyncEngineCount tem apenas 3. O CUDA executaria apenas 3 kernels por vez e os outros seriam bloqueados até que um stream estivesse livre?
Eu sempre interpretei um fluxo como um objeto de sincronização simples que não é sinalizado quando um método assíncrono CUDA é invocado, para que outros métodos esperem até que o método saia e o fluxo seja definido como sinalizado, mas isso parece uma explicação simplificada da minha parte, talvez ?
Não consegui encontrar uma boa explicação sobre execução e fluxos assíncronos, talvez com uma visão mais profunda. Os documentos CUDA não parecem explicar detalhes. Talvez haja uma boa explicação na web ou em um livro?