miércoles, 2 de diciembre de 2015
Programa para sumar las columnas de una matriz en CUDA, programación en paralelo. Nsight
Programa para sumar las columnas de una matriz en CUDA
Primero se muestran los resultados y posteriormente el código. Recordar que se utiliza el Nsight de Nvidia sobre linux Ubuntu
PRIMERO
La matriz a inicial es:
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
Los resultados deben ser:
10 10 10 10 10
Depues de compilar y ejecutar SE MUESTRA EL RESULTADO
LUEGO (CÓDIGO)
////////////////////////////////////////////////////////////////////////////////////////////////
// Includes
#include <stdio.h>
#define N 5 //512
#define BLOCK_DIM 5//512
__global__ void colsAdd (int *a, int *b);
int main() {
int a[N][N], b[N];
int *dev_a, *dev_b;
int size_A = N * N * sizeof(int);
int size_B = N * sizeof(int);
int i,j;
// initialize a and b with real values (NOT SHOWN)
for(i=0;i<N;i++){
for(j=0;j<N;j++){
a[i][j]=i;
printf("%d ",a[i][j]);
}
b[i]=0;
printf("b%d \n",b[i]);
}
// Allocate en device
cudaMalloc(&dev_a, size_A);
cudaMalloc(&dev_b, size_B);
// Inicializo matrices en el device
cudaMemcpy(dev_a, a, size_A, cudaMemcpyHostToDevice);
cudaMemset(b ,0, N * sizeof(int));
//cudaMemcpy(dev_b, b, size, cudaMemcpyHostToDevice);
// Invocar el kernel que suma en GPU
//dim3 dimBlock(BLOCK_DIM, BLOCK_DIM);
//dim3 dimGrid((int)ceil(N/dimBlock.x),(int)ceil(N/dimBlock.y));
//colsAdd<<<dimGrid,dimBlock>>>(dev_a,dev_b);
//Lanzamiento de threads con un solo bloque
// configuración de la ejecución
dim3 dimBlock(BLOCK_DIM, BLOCK_DIM);
dim3 dimGrid((int)ceil(N/dimBlock.x),(int)ceil(N/dimBlock.y));
// lanzamiento del kernel
colsAdd<<<dimGrid,dimBlock>>>(dev_a,dev_b);
// Traer resultado
cudaMemcpy(b, dev_b, size_B, cudaMemcpyDeviceToHost);
for(i=0;i<N;i++){
printf("%d ",b[i]);
}
cudaFree(dev_a); cudaFree(dev_b);
}
// Suma por columnas de una matriz
__global__ void colsAdd (int* a, int* b) {
//int col = blockIdx.x * blockDim.x + threadIdx.x;
//int row = blockIdx.y * blockDim.y + threadIdx.y;
int Pvalue=0;
for (int k = 0; k < N; ++k) {
Pvalue = Pvalue + a[threadIdx.y+k*N];
}
b[threadIdx.y] = Pvalue;
}
////////////////////////////////////////////////////////////////////////////////////////////////
REFERENCIAS
Algunas páginas de ayuda
http://www.fing.edu.uy/inco/cursos/gpgpu/clases/P12xh.pdf
http://computacion.cs.cinvestav.mx/~ameneses/pub/notas/cuda_taller.pdf
http://users.wfu.edu/choss/CUDA/docs/Lecture%205.pdf
http://www.3dgep.com/introduction-to-cuda-5-0/
No hay comentarios:
Publicar un comentario