Commit 040df464 authored by Theo Serralta's avatar Theo Serralta

Adding final comments

parent e98c0cf8
......@@ -7,11 +7,12 @@ b_np = np.random.rand(50000).astype(np.float32)
ctx = cl.create_some_context()#C'est la "table de jeu". Permet aux devices de recevoir les kernels et de transferer les données
queue = cl.CommandQueue(ctx)#Permet de créer la queue de commandes dans le context
mf = cl.mem_flags
print(mf.to_string(1))
a_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_np)
mf = cl.mem_flags #specifie comment la mémoire doit être gérée et utilisée
#print(mf.to_string(1))
a_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_np)#espace de mémoire temporaire. Ce sera une allocation de mémoire sur un periph (gpu) pour stocker les données qui seront utilisées dans des calculs parallèles
b_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b_np)
#creation du programme
prg = cl.Program(ctx, """
__kernel void sum(
__global const float *a_g, __global const float *b_g, __global float *res_g)
......@@ -21,14 +22,14 @@ __kernel void sum(
}
""").build()
res_g = cl.Buffer(ctx, mf.WRITE_ONLY, a_np.nbytes)
knl = prg.sum # Use this Kernel object for repeated calls
knl(queue, a_np.shape, None, a_g, b_g, res_g)
res_g = cl.Buffer(ctx, mf.WRITE_ONLY, a_np.nbytes)#Crée un buffer dans le contexte allouant de la mémoire sur le gpu pour stocker les resultats du calcul. Comme "WRITE-ONLY", il est destiné à stocker les données de sortie du noyau OpenCl
knl = prg.sum#On defini knl afin d'appeler le noyau sum du programme qu'on a créé précédement
knl(queue, a_np.shape, None, a_g, b_g, res_g)#execute le noyau sum sur le GPU à l'aide de la queue
res_np = np.empty_like(a_np)
cl.enqueue_copy(queue, res_np, res_g)
res_np = np.empty_like(a_np)#Crée un tableau numpy de même dimension que a_np mais vide afin de stocker les résultats du calcul
cl.enqueue_copy(queue, res_np, res_g)#Copie les données depuis le buffer sur le petipherique (GPU) vers le tableau res_np
# Check on CPU with Numpy:
print(res_np - (a_np + b_np))
print(np.linalg.norm(res_np - (a_np + b_np)))
assert np.allclose(res_np, a_np + b_np)
print(res_np - (a_np + b_np))#Permet de voir si les donées ont été exportées correctement dans le tableau res_np en checkant la difference entre le tableau et les deux variables du départ. Ca doit etre egal à 0.
print(np.linalg.norm(res_np - (a_np + b_np)))#Calcul la norme L2 de la difference entre res_np et (a_np + b_np). Si les deux vecteurs sont identique, ça devrait etre egal à 0. Ca nous donne une mesure de l'erreur entre les resultats du noyau OpenCl et les resultats attendus
assert np.allclose(res_np, a_np + b_np)#Compare les tableaux et verifie s'ils sont suffisament proches les uns des autres. S'ils le sont, le programme tourne normalement sinon, l'assertion renvoie un message d'echec.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment