Hello World com Cuda

Criar um Hello World no Cuda não é das tarefas mais simples.

O CUDA é uma arquitetura de computação paralela da NVIDIA e tem como principal função abstrair as especificidades do hardware de suas placas a fim de facilitar o acesso às suas funções de processamento paralelo, trabalhando como um framework que pode ser utilizado em conjunto com várias linguagens. Em cada uma utiliza-se formas diferentes de programar. Aqui, demonstro uma forma utilizando C.

Uma das formas de criar uma aplicação CUDA é criando um projeto, uma outra poderia ser compilando o código diretamente.

Para criar o projeto, o primeiro passo é entrar no Terminal e navegar até a pasta de instalação do SDK CUDA. O quê, no meu caso, está em:

/home/nome_do_usuário/NVIDIA_GPU_Computing_SDK – Pasta padrão da instalação (comentada no post anterior).

Depois copiamos o conteúdo da pasta template para uma outra, onde faremos as modificações no código.

cd /home/nome_do_usuário/NVIDIA_GPU_Computing_SDK/C/src – Entro na pasta projects.

cp -r template nome_do_seu_projeto – Copio todo o conteúdo da pasta template para a pasta com o nome que você escolher.

Depois, é necessário que você troque o nome da aplicação, tanto nos nomes dos arquivos quanto em seus conteúdos. Substitua a palavra template pelo nome adotado para a sua aplicação (nome_do_seu_projeto).

Ex.: mv template.cu nome_do_seu_projeto.cu

mv template_kernel.cu nome_do_seu_projeto_kernel.cu

mv template_gold.cpp nome_do_seu_projeto_gold.cpp

Substitua também o nome template pelo título adotado da aplicação (nome_do_seu_projeto) dentro do arquivo Makefile. editando-o com um editor de texto (o VI, o Nano ou mesmo o GEdit).

# Add source files here
EXECUTABLE	:= nome_do_projeto
# CUDA source files (compiled with cudacc)
CUFILES	        := nome_do_projeto.cu
# CUDA dependency files
CU_DEPS        := \
                  nome_do_projeto_kernel.cu \
# C/C++ source files (compiled with gcc / c++)
CCFILES		:= \
                  nome_do_projeto_gold.cpp \

Após isso, você já estará apto a editar o seu projeto e construí-lo sem precisar compilar os arquivos separadamente.

Vasculhando a internet durante meus estudos, pude verificar várias formas de realizar o HelloWorld, inclusive usando o próprio printf do C. Mas isso não seria correto, assim, estaríamos criando um HelloWorld em C, e não em CUDA.

Portanto, peguei o código do Ingemar Ragnemalm, do ano passado. Nele, passamos o valor “Hello” e exibimos na tela, então passamos ele para o CUDA como um array de offsets. Então, esses offsets são adicionados em paralelo para produzir o “World!“. Copie o código e cole no seu arquivo nome_do_seu_projeto.cu.

#include <stdio.h>

const int N = 16;
const int blocksize = 16; 

__global__
void hello(char *a, int *b)
{
	a[threadIdx.x] += b[threadIdx.x];
}

int main()
{
	char a[N] = "Alô \0\0\0\0\0\0";
	int b[N] = {12, 9, 6, 0, 68, 111, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0};

	char *ad;
	int *bd;
	const int csize = N*sizeof(char);
	const int isize = N*sizeof(int);

	printf("%s", a);

	cudaMalloc( (void**)&ad, csize );
	cudaMalloc( (void**)&bd, isize );
	cudaMemcpy( ad, a, csize, cudaMemcpyHostToDevice );
	cudaMemcpy( bd, b, isize, cudaMemcpyHostToDevice ); 

	dim3 dimBlock( blocksize, 1 );
	dim3 dimGrid( 1, 1 );
	hello<<>>(ad, bd);
	cudaMemcpy( a, ad, csize, cudaMemcpyDeviceToHost );
	cudaFree( ad );

	printf("%s\n", a);
	return EXIT_SUCCESS;
}

Construa o projeto através do comando:

make

Caso você queira utilizar a versão com debug, “make dbg=1“.

Se você não tem uma placa de vídeo compatível com a tecnologia CUDA, utilize a versão emulada com “make emu=1“. Também pode optar por usar as duas em conjunto, assim: “make dbg=1 emu=1“.

Construindo a aplicação!
Construindo a aplicação!

Para rodar a aplicação, entre na pasta dos exemplos, o padrão:

cd /home/andre/NVIDIA_GPU_COMPUTING_SDK/C/bin/linux/releases/

Digite o comando ./nomedaaplicação para rodar a o executável da aplicação que provavelmente, estará nesta pasta.

Gerando o resultado:

Alô mundo!
Alô mundo!

Pronto!

Espero que tenham gostado do tutorial e que consigam executá-lo corretamente.

Quaisquer dúvidas, já sabem, comentários abaixo! =D

Vida longa e próspera!

Referências Bibliográficas:

http://www.nvidia.com.br/object/cuda_home_new_br.html

http://www.nvidia.com/object/cuda_gpus.html

http://www.nvidia.com/object/cuda_get.html

http://forums.nvidia.com/index.php?showtopic=90044

Publicado em CUDA

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

*

*