Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Clase 1
Mnica Denham CONICET - UNRN
Ejemplo: suma de vectores
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
Suma de vectores
A
a
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
C
c
+
=
Suma de vectores
A
a
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
C
c
c
!
+ +
=
Suma de vectores
A
a
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
C
c
c
!
c
"
+ + +
=
Suma de vectores
A
a
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
C
c
c
!
c
"
c
#
c
N$!
+ + + +
=
Suma de vectores solucin &
/*
Suma de vectores secuencial
*/
vector'ops.cu
/* Suma de vectores (inplace) */
int vector_ops_suma_sec(float *v1, float *v2, int dim)
{
for (int i = 0; i < dim; i++) {
v1[i = v1[i + v2[i;
!
return 1;
!
vectorops!c"
Suma de vectores solucin &
/*
Suma de vectores secuencial
*/
vector'ops.cu
/* Suma de vectores (inplace) */
int vector_ops_suma_sec(float *v1, float *v2, int dim)
{
for (int i = 0; i < dim; i++) {
v1[i = v1[i + v2[i;
!
return 1;
!
Complejidad computacional lineal: ()N* donde N es la dimensin de los arre+los.
vectorops!c"
Suma de vectores solucin &
,iene orden de complejidad lineal, al aumentar el n-mero de
elementos aumenta linealmente la cantidad de operaciones.
Suma de vectores solucin &
,iene orden de complejidad lineal, al aumentar el n-mero de
elementos aumenta linealmente la cantidad de operaciones.
.ara vectores pe/ue0os la solucin
es correcta.
Suma de vectores solucin &
,iene orden de complejidad lineal, al aumentar el n-mero de
elementos aumenta linealmente la cantidad de operaciones.
.ara vectores pe/ue0os la solucin
es correcta.
.ara vectores muy +randes este
tipo de solucin puede ocasionar
penali1aciones en el tiempo de
cmputo.
Suma de vectores
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
6
6
Suma de vectores
A
a
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
6
6
Si en ve1 de un -nico procesador tenemos
. procesadores, dividimos los c5lculos
entre los . procesadores.
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
6
6
C
c
c
!
c
"
c
#
c
N$!
=
6
Si contamos con N procesadores,
reali1amos todos los c5lculos
al mismo tiempo.
# # # # # # #
c
!
c
"
c
#
c
N$!
6
=
Suma de vectores
A
a
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
6
6
C
c
c
!
c
"
c
#
c
N$!
6
Si contamos con N procesadores,
reali1amos todos los c5lculos
al mismo tiempo.
# # # # # # #
7e orden lineal a orden constante
Se pueden sincroni1ar.
C:7A
Aemorias:
C5lculo en 9.:.
Gernel !:
dim# dim9rid)#,"*
dim# dimBloc>)H,#*
Gernel ":
dim# dim9rid)I,#*
7im# dimBloc>)4,4,4*
Suma de vectores
/*
Funcin se ejecuta en C!"$ que invoca al kernel se ejecuta en #!"$
*/
?an1amiento
del >ernel
/* Suma de vectores. %esultado queda en el &rimer argumento */
int vector_ops_suma_parfloat *v'( float *v)( int dim$
*
dim+ n,hreads-')$.
dim+ n/locksdim / n,hreads.0$ 1 dim 2 n,hreads.0 3 ' : 4$$.
kernel5suma666n/locks( n,hreads777v'( v)( dim$.
cuda8eviceS9nchroni:e$.
return '.
}
vector'ops.c
Suma de vectores
/*
Funcin se ejecuta en C!"$ que invoca al kernel se ejecuta en #!"$
*/
?an1amiento
del >ernel
/* Suma de vectores. %esultado queda en el &rimer argumento */
int vector_ops_suma_parfloat *v'( float *v)( int dim$
*
dim+ n,hreads-')$.
dim+ n/locksdim / n,hreads.0$ 1 dim 2 n,hreads.0 3 ' : 4$$.
kernel5suma666n/locks( n,hreads777v'( v)( dim$.
cuda8eviceS9nchroni:e$.
return '.
}
vector'ops.c
nom(re_)erne&***n+mero de (&o$ues, t,reads por (&o$ue---(par.metros actua&es)J
Suma de vectores
/*
Funcin se ejecuta en C!"$ que invoca al kernel se ejecuta en #!"$
*/
Gernel
/* Suma de vectores. %esultado queda en el &rimer argumento */
int vector_ops_suma_parfloat *v'( float *v)( int dim$
*
dim+ n,hreads-')$.
dim+ n/locksdim / n,hreads.0$ 1 dim 2 n,hreads.0 3 ' : 4$$.
kernel5suma666n/locks( n,hreads777v'( v)( dim$.
cuda8eviceS9nchroni:e$.
return '.
}
/* suma !e ca!a element# !el )ect#r */
__"l#-al__ )#i! 1ernel_suma(fl#at *)2, fl#at *)3, int !im)
4
int i! 5 threa!6!&7& 8 (-l#c16!&7& * -l#c1(im7&);
if (i! 9 !im)
4
)2:i!; 5 )2:i!; 8 )3:i!;;
0
0
vector'ops.c
Suma de vectores
/*
Main.cu: continuacin del cdigo.
*/
/* Suma de vectores. %esultado queda en el &rimer argumento */
int vector_ops_suma_parfloat *v'( float *v)( int dim$
*
dim+ n,hreads-')$.
dim+ n/locksdim / n,hreads.0$ 1 dim 2 n,hreads.0 3 ' : 4$$.
kernel5suma666n/locks( n,hreads777v'( v)( dim$.
cuda8eviceS9nchroni:e$.
return '.
}
/* suma !e ca!a element# !el )ect#r */
__"l#-al__ )#i! 1ernel_suma(fl#at *)2, fl#at *)3, int !im)
4
int i! 5 threa!6!&7& 8 (-l#c16!&7& * -l#c1(im7&);
if (i! 9 !im)
4
)2:i!; 5 )2:i!; 8 )3:i!;;
0
0
vector'ops.c
__g&o(a&__: calificador de funcin
Calificadores de funciones:
''+lo%al'': determina /ue es una funcin >ernel, se ejecuta en el
dispositivo y slo puede ser invocada desde el ;ost.
Su invocacin +enera un +rid de %lo/ues con n-mero fijo
e i+ual de t;reads.
''device'' : es una funcin del dispositivo, se ejecuta en <l y slo
puede ser invocada desde un >ernel u otra funcin del
dispositivo.
'';ost'' : determina /ue es una funcin del ;ost, o simplemente
una funcin de C tradicional a ejecutarse en ;ost y /ue
puede ser invocada desde ;ost. .or omisin.
Suma de vectores
/*
Main.cu: continuacin del cdigo.
*/
vector'ops.c
/* Suma de vectores. %esultado queda en el &rimer argumento */
int vector_ops_suma_parfloat *v'( float *v)( int dim$
*
dim+ n,hreads-')$.
dim+ n/locksdim / n,hreads.0$ 1 dim 2 n,hreads.0 3 ' : 4$$.
kernel5suma666n/locks( n,hreads777v'( v)( dim$.
cuda8eviceS9nchroni:e$.
return '.
}
/* suma !e ca!a element# !el )ect#r */
__"l#-al__ )#i! 1ernel_suma(fl#at *)2, fl#at *)3, int !im)
4
int i! 5 threa!6!&7& 8 (-l#c16!&7& * -l#c1(im7&);
if (i! 9 !im)
4
)2:i!; 5 )2:i!; 8 )3:i!;;
0
0
Faria%les reservadas:
gridDim: contiene las dimensiones del +rid.
(&oc/Id0 : contiene el identificador del %lo/ue en un +rid.
(&oc/Dim: contiene las dimensiones del %lo/ue.
t,readId0: contiene el identificador del t;read dentro del %lo/ue.
1odas tienen componentes 0,y,z2
3rids y (&o$ues de 4, 5 o dimensiones2
Suma de vectores
/*
Main.cu: continuacin del cdigo.
*/
vector'ops.c
/* Suma de vectores. %esultado queda en el &rimer argumento */
int vector_ops_suma_parfloat *v'( float *v)( int dim$
*
dim+ n,hreads-')$.
dim+ n/locksdim / n,hreads.0$ 1 dim 2 n,hreads.0 3 ' : 4$$.
kernel5suma666n/locks( n,hreads777v'( v)( dim$.
cuda8eviceS9nchroni:e$.
return '.
}
/* suma !e ca!a element# !el )ect#r */
__"l#-al__ )#i! 1ernel_suma(fl#at *)2, fl#at *)3, int !im)
4
int i! 5 threa!6!&7& 8 (-l#c16!&7& * -l#c1(im7&);
if (i! 9 !im)
4
)2:i!; 5 )2:i!; 8 )3:i!;;
0
0
Suma de vectores
/*
Main.cu: continuacin del cdigo.
*/
vector'ops.c
/* Suma de vectores. %esultado queda en el &rimer argumento */
int vector_ops_suma_parfloat *v'( float *v)( int dim$
*
dim+ n,hreads-')$.
dim+ n/locksdim / n,hreads.0$ 1 dim 2 n,hreads.0 3 ' : 4$$.
kernel5suma666n/locks( n,hreads777v'( v)( dim$.
cuda8eviceS9nchroni:e$.
return '.
}
/* suma !e ca!a element# !el )ect#r */
__"l#-al__ )#i! 1ernel_suma(fl#at *)2, fl#at *)3, int !im)
4
int i! 5 threa!6!&7& 8 (-l#c16!&7& * -l#c1(im7&);
if (i! 9 !im)
4
)2:i!; 5 )2:i!; 8 )3:i!;;
0
0
Cada t;read resuelve
un -nico elemento del
vector.
Suma de vectores
/*
Main.cu: continuacin del cdigo.
*/
main.cu
/* suma secuencial */
print-(.Suma secuencial (;<=)0n.);
suma#secuencial("#$, "#&, %);
/* suma paralela */
print-(.Suma paralela (><=) 0n.);
suma#paralela(d#$, d#&, %);
/* trai7o los datos desde ><= a ;<= para testear la suma */
cuda(emcp8("#au', d#$, sizeof(float) * %, cuda(emcp85evice:o9ost);
if(vector#ops#i7uales("#au', "#$, %))
print-(.:est pasado+ 0n.);
else
print-(.:est no pasado+ 0n.);
/* li?eracion de memoria */
-ree("#$);
-ree("#&);
-ree("#au');
cuda@ree(d#$);
cuda@ree(d#&);
return 0;
!
Suma de vectores
/*
Main.cu: continuacin del cdigo.
*/
main.cu
/* suma secuencial */
print-(.Suma secuencial (;<=)0n.);
suma#secuencial("#$, "#&, %);
/* suma paralela */
print-(.Suma paralela (><=) 0n.);
suma#paralela(d#$, d#&, %);
/* trai7o los datos desde ><= a ;<= para testear la suma */
cuda(emcp8("#au', d#$, sizeof(float) * %, cuda(emcp85evice:o9ost);
if(vector#ops#i7uales("#au', "#$, %))
print-(.:est pasado+ 0n.);
else
print-(.:est no pasado+ 0n.);
/* li?eracion de memoria */
-ree("#$);
-ree("#&);
-ree("#au');
cuda@ree(d#$);
cuda@ree(d#&);
return 0;
!
Suma de vectores
/*
Main.cu: continuacin del cdigo.
*/
main.cu
/* suma secuencial */
print-(.Suma secuencial (;<=)0n.);
suma#secuencial("#$, "#&, %);
/* suma paralela */
print-(.Suma paralela (><=) 0n.);
suma#paralela(d#$, d#&, %);
/* trai7o los datos desde ><= a ;<= para testear la suma */
cuda(emcp8("#au', d#$, sizeof(float) * %, cuda(emcp85evice:o9ost);
if(vector#ops#i7uales("#au', "#$, %))
print-(.:est pasado+ 0n.);
else
print-(.:est no pasado+ 0n.);
/* li?eracion de memoria */
-ree("#$);
-ree("#&);
-ree("#au');
cuda@ree(d#$);
cuda@ree(d#&);
return 0;
!
Suma de vectores
/*
Main.cu: continuacin del cdigo.
*/
main.cu
/* suma secuencial */
print-(.Suma secuencial (;<=)0n.);
suma#secuencial("#$, "#&, %);
/* suma paralela */
print-(.Suma paralela (><=) 0n.);
suma#paralela(d#$, d#&, %);
/* trai7o los datos desde ><= a ;<= para testear la suma */
cuda(emcp8("#au', d#$, sizeof(float) * %, cuda(emcp85evice:o9ost);
if(vector#ops#i7uales("#au', "#$, %))
print-(.:est pasado+ 0n.);
else
print-(.:est no pasado+ 0n.);
/* li?eracion de memoria */
-ree("#$);
-ree("#&);
-ree("#au');
cuda@ree(d#$);
cuda@ree(d#&);
return 0;
!
Suma de vectores
A
a
a
!
a
"
a
#
a
N$!
B
%
%
!
%
"
%
#
%
N$!
6
6
C
c
c
!
c
"
c
#
c
N$!
6
# # # # # # #
7e orden lineal a orden constanteKK
=
8 se resuelve en paralelo todos los
resultados del vector.
t;
t;
!
t;
"
t;
#
t;
N$!
6
Cesumen
Demos visto:
$ Alocacin de memoria en device.
$ ,ransferencia de memoria ;ost device. $
$ Confi+uracin de +rid.
$ ?an1amiento de >ernels.
,odas estas operaciones las ofrece C:7A como una li%rer3a /ue eBtiende
al len+uaje C )en este caso*.
.roducto escalar
El modelo de ejecucin C:7A es ;3%rido: el mismo pro+rama contiene: