exemplo inicial

exemplo inicial

por Luiz Henrique -
Número de respostas: 4
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.
Em resposta à Luiz Henrique

Re: exemplo inicial

por Pedro P. de S. B. Silva -
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
Em resposta à Luiz Henrique

Re: exemplo inicial

por Hugo Corbucci -
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.
Em resposta à Hugo Corbucci

Re: exemplo inicial

por Luiz Henrique -
esse é todo o codigo, to apenas testando a linguagem. O erro é na saída, ele nao imprime os valores corretamente.
Em resposta à Luiz Henrique

Re: exemplo inicial

por Hugo Corbucci -
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.