UADY
              
CIMAT Unidad Merida        

conacyt 

TÓPICOS SELECTOS DE CÓMPUTO PARALELO
ENERO-JULIO 2018

PROGRAMACIÓN EN CUDA


Profr: Dr. Francisco Javier Hernández López
Enviar tareas al correo: curso_cuda@hotmail.com  (nombre_tarea_# , ej.: FranciscoHernandez_tarea_1)


Temario


Sesión
Tarea
1. Introducción a la programación en CUDA

2. Ejemplos usando CUDA
Tarea_1_VectoresMatrices.pdf
3. Procesamiento de Imágenes

4. Procesamiento de Imágenes usando CUDA
Tarea_2_CambiarColorImagen.pdf
Tarea_3_CombinacionImagenes.pdf
Tarea_4_DeteccionBordes.pdf




Calificaciones:
             
Num. Ctrl.
T1
Comentarios
T2
Comentarios
T3
Comentarios
T4
Comentarios
Prom. Tareas
Examen
Proyecto
Calif. Final (0% - 100%)
Prog. en CUDA
15216336
10

8
T2_1
10
T3_1
9.5
T4_1, T4_2
9.375
6.0
10
92.5
9003089 9
T1_14, T1_15 10

10
T3_1
10

9.75
7.5
10
98.5
15216330
8.5
T1_4, T1_12
10

10
T3_1
6
T4_3,T4_4,T4_5
8.625
7.0
7
83.5
1234567
9
T1_13
10

10
T3_1
10

9.75
8.0
10
100
    
                                                                          

Comentarios:

          Sum_Vec<<<1,N-1>>>(v_d,s_d);
          Se ejecutan N-1 hilos, entonces dentro de la función kernel, los indices de threadIdx.x van de [0,N-2]
          El detalle en tu codigo es que estas leyendo la información de tu vector V en la localidad 0, pero ahí no pusiste información, entonces este valor puede ser basura o en el mejor caso 0.

            cudaMemcpy(B_dev,B,(N-1)*sizeof(float),cudaMemcpyHostToDevice);
            cudaMemcpy(C1_dev,C1,N*N*sizeof(float),cudaMemcpyHostToDevice);
            cudaMemcpy(C2_dev,C2,N*N*sizeof(float),cudaMemcpyHostToDevice);
            cudaMemcpy(C_dev,C,(N-2)*sizeof(float),cudaMemcpyHostToDevice);
            cudaMemcpy(A,A_dev,N*sizeof(float),cudaMemcpyDeviceToHost);
            cudaMemcpy(A,A_dev,N*N*sizeof(float),cudaMemcpyDeviceToHost);
            cudaMemcpy(B,B_dev,N*N*sizeof(float),cudaMemcpyDeviceToHost);
            dim3 block(N,M,1) ;
            int x = blockIdx.x*blockDim.x+threadIdx.x;
            int y = blockIdx.y*blockDim.y+threadIdx.y;
            Entonces "x" va sobre las filas desde 0 hasta N-1, y "y" va sobre las columnas desde 0 hasta M-1. Por lo tanto, el indice global int idxA=x*N+y; está mal calculado.
            cudaMemcpy(S1_dev,S1,size_S1,cudaMemcpyHostToDevice);
            cudaMemcpy(S2_dev,S2,size_S2,cudaMemcpyHostToDevice);
            cudaMemcpy(C1_dev,C1,size_C,cudaMemcpyHostToDevice);
            cudaMemcpy(C2_dev,C2,size_C,cudaMemcpyHostToDevice);

           dim3 threads(512, 1, 1);
           int N = imageW * imageH;
           dim3 grid(N / threads.x + (N%threads.x == 0 ? 0 : 1), 1, 1);
           No debes usar los índices de los hilos de forma bidimensional dentro de tus funciones Kernel (filtroX y filtroY):
           const int ix= blockDim.x * blockIdx.x + threadIdx.x;
           const int iy= blockDim.y * blockIdx.y + threadIdx.y;




Bibliografía: