Como fazer um print de uma variável no CUDA?
É... tava procurando tb... Não achei em lugar nenhum.
Posso estar errado mas acho que isso não é possível (fora em modo emulado).
Até onde eu testei e entendi, a placa de vídeo não tem acesso à saída padrão porque isso não existe no contexto dela. Eu ainda acho que deve ser possível de alguma forma porque em computação, tudo dá, mas deve ser bem complicadinho. O jeito mais fácil é copiar o valor da variável para memória da CPU e aí pedir uma impressão a partir do "host", isto é, de uma função que roda na CPU.
Até onde eu testei e entendi, a placa de vídeo não tem acesso à saída padrão porque isso não existe no contexto dela. Eu ainda acho que deve ser possível de alguma forma porque em computação, tudo dá, mas deve ser bem complicadinho. O jeito mais fácil é copiar o valor da variável para memória da CPU e aí pedir uma impressão a partir do "host", isto é, de uma função que roda na CPU.
É possível copiar o valor da variável da GPU para a CPU a partir de um comando fora do host?
Senão, como o host sabe q uma resposta ficou pronta para ele copiar para sua memória de trabalho e imprimir? A solução é elegante? A solução é porca e custosa? Da uma dica =P
Na net só acho coisas relacionadas a copiar texturas pra lá e para cá. Tudo num nível mto complexo pra mim.
Senão, como o host sabe q uma resposta ficou pronta para ele copiar para sua memória de trabalho e imprimir? A solução é elegante? A solução é porca e custosa? Da uma dica =P
Na net só acho coisas relacionadas a copiar texturas pra lá e para cá. Tudo num nível mto complexo pra mim.
Dê uma olhada nos exemplos que vêm com o CUDA.
A maior parte deles faz uso intenso de paralelismo e recupera as informações que foram processadas pelas threads para imprimir no main. Veja o scalarProd e matrixProd que o algoritmo deve ser bem fácil de entender.
A maior parte deles faz uso intenso de paralelismo e recupera as informações que foram processadas pelas threads para imprimir no main. Veja o scalarProd e matrixProd que o algoritmo deve ser bem fácil de entender.
Já olhei eles, Hugo. Foi meu ponto de partida.
Acho que eu não me expliquei direito.
Os exemplos fazem: "Reading back GPU result...\n"
Ou seja, a CPU sabe q tem um resultado pronto e então lê devolta.
Ela sabe disso pq executa um CUDA_SAFE_CALL( cudaThreadSynchronize() ); no caso do scalarProd, certo?
No nosso caso, os resultados vão surgindo aleatoriamente e não podemos armazená-los pois eles potencialmente chegam aos bilhões.
Então pensei que se trata de um problema estilo produtor-consumidor.
As threads produzem respostas e o host consome.
Usando semáforos talvez dê para controlar tudo.
O q vc acha? Mta confusão? É um caminho?
Pq não sei como usar semáforos direito, nem se é possível.
Acho que eu não me expliquei direito.
Os exemplos fazem: "Reading back GPU result...\n"
Ou seja, a CPU sabe q tem um resultado pronto e então lê devolta.
Ela sabe disso pq executa um CUDA_SAFE_CALL( cudaThreadSynchronize() ); no caso do scalarProd, certo?
No nosso caso, os resultados vão surgindo aleatoriamente e não podemos armazená-los pois eles potencialmente chegam aos bilhões.
Então pensei que se trata de um problema estilo produtor-consumidor.
As threads produzem respostas e o host consome.
Usando semáforos talvez dê para controlar tudo.
O q vc acha? Mta confusão? É um caminho?
Pq não sei como usar semáforos direito, nem se é possível.
Ah tá! Certinho em relação ao synchronize.
Beleza, você não pode armazenar todos os resultados mas você pode armazenar um (se você conseguir garantir um acesso restrito para consumo desse resultado).
Acho que você entendeu direitinho o problema
Existem vários jeitos de controlar o consumo de informações, semáforos são uma solução sim. Se vai ficar confuso ou não depende do seu código.
Agora pense como você vai fazer para manter a sua thread consumidora prestando atenção para saber se o resultado está pronto para ser impresso.
Use a solução mais simples que conseguir por enquanto. Depois você pensa em otimizar ela.
Beleza, você não pode armazenar todos os resultados mas você pode armazenar um (se você conseguir garantir um acesso restrito para consumo desse resultado).
Acho que você entendeu direitinho o problema
Existem vários jeitos de controlar o consumo de informações, semáforos são uma solução sim. Se vai ficar confuso ou não depende do seu código.
Agora pense como você vai fazer para manter a sua thread consumidora prestando atenção para saber se o resultado está pronto para ser impresso.
Use a solução mais simples que conseguir por enquanto. Depois você pensa em otimizar ela.
Pelo que eu entendi, você só pode imprimir coisas pelas threads em modo de emulação.
Ops... papagaiei =p
Ops... papagaiei =p
posso fazer a impressão só no modo emulado, ou devo imprimir também no modo não emulado?????
Como vou ter certeza que seu código funciona em modo não emulado? 
Nem venha com análise de corretude porque não vou fazer! hehe
Precisa imprimir de alguma forma para a competição sim. Eu sei que não é fácil, mas afinal, é 10 na média né?
Nem venha com análise de corretude porque não vou fazer! hehe
Precisa imprimir de alguma forma para a competição sim. Eu sei que não é fácil, mas afinal, é 10 na média né?