Ola,
estava olhando o guia do cuda mas nao consegui nem mesmo fazer o primeiro exemplo.
Meu programa deve receber 3 arrays e guardar a soma dos 2 primeiros no terceiro. Primeiro um codigo em C q faz o q eu preciso:
------------------------------------------------------------------------------------------
#include<stdio.h>
void vecAdd (int *a, int *b, int *c, int n)
{
int i;
for(i = 0; i < n; i++) c[i] = a[i] + b[i];
}
int main(void)
{
int i, a[3] = {1, 2, 3}, b[3] = {5, 5, 5}, c[3];
vecAdd(a, b, c, 3);
for(i = 0; i < 3; i++) printf("%d\n", c[i]);
}
---------------------------------------------------------------------------------------------
Agora o mesmo codigo em cuda, mas q nao funciona:
----------------------------------------------------------------------------------------------
#include<stdio.h>
__global__ void vecAdd(int *A, int *B, int *C)
{
int i = threadIdx.x;
C[i] = A[i] + B[i];
}
int main()
{
int A[3] = {1, 2, 3}, B[3] = {5, 5, 5}, C[3];
vecAdd<<<1,3>>>(A, B, C);
for(int i = 0; i < 3; i++) printf("%d\n", C[i]);
}
-----------------------------------------------------------------------------------------------
Alguem poderia apontar o erro no meu codigo CUDA?
Obrigado.
cara, nao estou com o meu ep aqui na rede linux, mas pelo q eu me lembre, seu programa nao esta funcionando pq vc nao ta incluindo a biblioteca do cuda..
da uma olhada nos projetos na pasta projects e verifica os headers q estao faltando.
[]'s
pedro
da uma olhada nos projetos na pasta projects e verifica os headers q estao faltando.
[]'s
pedro
Essa informação não está completa o suficiente para poder apontar um erro.
Explique melhor onde está seu código, quais arquivos existem, como está seu main e qual o erro do CUDA.
Explique melhor onde está seu código, quais arquivos existem, como está seu main e qual o erro do CUDA.
esse é todo o codigo, to apenas testando a linguagem. O erro é na saída, ele nao imprime os valores corretamente.
Ah ta!
Ok! Achei que vocês tavam usando o template que está na pasta projects que tem vários arquivos e coisas do tipo.
Enfim!
Bom, o seu problema está no gerenciamento de memória. Se você rodar o seu programa em modo emulado (make emu=1), verá que a saída fica certinha.
O que acontece é que, em modo emulado, a memória que roda na CPU (a que você alocou com int A[3], etc...) É a mesma da GPU (pois você emula com a CPU e não com a(s) GPU(s)). Então dá tudo certo.
Já quando você roda em modo real, essas memórias são diferentes (a(s) GPU(s) tem suas próprias memórias - uma parte compartilhada entre essas GPUs e outra não). Logo você está somando coisas armazenadas em um espaço da memória das GPUs que você nunca alocou ou inicializou. Veja o exemplo 'scalarProd' na pasta projects do CUDA para ver como ele usa o CudaMalloc e outras funções para alocação de memória na GPU e cópia da CPU para GPU e vice versa.
Ok! Achei que vocês tavam usando o template que está na pasta projects que tem vários arquivos e coisas do tipo.
Enfim!
Bom, o seu problema está no gerenciamento de memória. Se você rodar o seu programa em modo emulado (make emu=1), verá que a saída fica certinha.
O que acontece é que, em modo emulado, a memória que roda na CPU (a que você alocou com int A[3], etc...) É a mesma da GPU (pois você emula com a CPU e não com a(s) GPU(s)). Então dá tudo certo.
Já quando você roda em modo real, essas memórias são diferentes (a(s) GPU(s) tem suas próprias memórias - uma parte compartilhada entre essas GPUs e outra não). Logo você está somando coisas armazenadas em um espaço da memória das GPUs que você nunca alocou ou inicializou. Veja o exemplo 'scalarProd' na pasta projects do CUDA para ver como ele usa o CudaMalloc e outras funções para alocação de memória na GPU e cópia da CPU para GPU e vice versa.