Bonjour à tous,
C'est mon 1er message sur le forum.
J'ai développé dans le cadre de mon travail un code de traitement d'hologrammes en C++/CUDA.
Comme mes collègues et étudiant de mon laboratoire ne sont pas à l'aise avec le C++, je recode toute mon application en Python + cupy.
Je m'en sort plutôt bien sauf dans un cas particulier: celui où je dois faire du calcul complex dans un raw kernel.
Voici mon raw kernel ainsi que la fonction qui l'appel et après voici mon code d'erreur (j'ai souligné la ligne qui provoque mon erreur):
d_plan_cplx est un cupy ndarray de complex64 2 dimensions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 @jit.rawkernel() def clean_plan_cplx_device(d_plan_cplx, size_x, size_y, posX, posY, clean_radius_pix, replace_cplx_value): index = jit.blockIdx.x * jit.blockDim.x + jit.threadIdx.x sizeXY = size_x * size_y jj = cp.int32(index) // cp.int32(size_x) ii = cp.int32(index) - cp.int32(jj * size_x) if (ii < size_x and jj < size_y): #calcul distance distance = cp.sqrt((posX - ii)**2 + (posY - jj)**2) cplx = cp.complex64(d_plan_cplx[ii, jj]) mod = cp.sqrt(cp.real(cplx)**2 + cp.imag(cplx)**2) if (distance < clean_radius_pix): d_plan_cplx[ii, jj] = 0.0+0j else: d_plan_cplx[ii, jj] = mod + 0j def clean_plan_cplx(d_plan_cplx, size_x, size_y, posX, posY, clean_radius_pix, replace_value): nthread = 1024 nBlock = math.ceil(size_x * size_y // nthread) clean_plan_cplx_device[nBlock, nthread](d_plan_cplx, size_x, size_y, posX, posY, clean_radius_pix, replace_value)
En fait je ne sais pas comment accéder à la partie imaginaire et réelle des valeurs.
Pourtant cela marche bien de cette façon en dehors de mon rawkernel.
Y aurait-il quelqu'un qui saurait m'aider?
Merci d'avance
Simon Becker
Partager