Por que não estou conseguindo sobrepor transferências de dados e computação com GTX 480 e CUDA 5?
Eu tentei sobrepor execuções kernel com memcpyasync mas não funciona. Eu sigo todas as recomendações no guia de programação, usando a memória fixada, diferentes fluxos, etc. Eu vejo a execução do kernel se sobrepondo, mas isso não acontece com as transferências mem. Eu sei que meu cartão tem apenas um mecanismo de cópia e um mecanismo de execução, mas a execução e as transferências devem se sobrepor, certo?
Parece que o "mecanismo de cópia" e o "mecanismo de execução" sempre impõem a ordem que eu chamo de funções. O trabalho consiste em 4 fluxos realizando [HtoD x2, Kernel, DtoH]. Se eu emitir a série HtoDx2, Kernel, DtoH em cada fluxo, vejo no profiler como a primeira operação HtoD do stream2 não iniciará até que a primeira operação DtoH termine. Se eu emitir primeiro o HtoD em cada fluxo, depois o segundo HtoD, depois o kernel e depois DtoH (amplitude) não vejo nenhuma sobreposição e a ordem de emissão também é imposta pela GPU.
Eu tentei com o exemplo simpleStreams dado em CUDA SDK e também vejo o mesmo comportamento.
Anexo algumas capturas de tela mostrando o problema em ambos, o Visual Profiler e o Nsight para VS2008.
ps. Eu não defini o env CUDA_LAUNCH_BLOCKING
Perfilador Visual de Fluxos Simples
Largura da linha do tempo MyApp Nsight primeiro
Profundidade da linha do tempo do MyApp Nsight primeiro
editar:
colocando kernels extra x4 (total de 2HtoD, 5 kernel, 1DtoH por stream) -> Se eu executar o nvprof com e sem - kernel-off-concomitante, o tempo decorrido é o mesmo. Se eu definir o env CUDA_LAUNCH_BLOCKING = 1, então vejo uma melhoria de desempenho (a partir da linha de comando) de 7,5%!
Especificação do sistema:
Windows 7NVIDIA 6800 VGA no primeiro slot PCI-EGTX480 no segundo slot PCI-EDriver NVIDIA: 306,94Estúdio Visual 2008CUDA v5.0Visual Profiler 5.0Nsight 3.0