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

questionAnswers(3)

yourAnswerToTheQuestion