root / ETSN / MyDFT_3.py @ 274
Historique | Voir | Annoter | Télécharger (2,87 ko)
1 | 270 | equemene | #!/usr/bin/env python3
|
---|---|---|---|
2 | 270 | equemene | |
3 | 270 | equemene | import numpy as np |
4 | 270 | equemene | import pyopencl as cl |
5 | 270 | equemene | from numpy import pi,cos,sin |
6 | 270 | equemene | |
7 | 270 | equemene | # Naive Discrete Fourier Transform
|
8 | 270 | equemene | def MyDFT(x,y): |
9 | 270 | equemene | size=x.shape[0]
|
10 | 270 | equemene | X=np.zeros(size).astype(np.float32) |
11 | 270 | equemene | Y=np.zeros(size).astype(np.float32) |
12 | 270 | equemene | for i in range(size): |
13 | 270 | equemene | for j in range(size): |
14 | 270 | equemene | X[i]=X[i]+x[j]*cos(2.*pi*i*j/size)-y[j]*sin(2.*pi*i*j/size) |
15 | 270 | equemene | Y[i]=Y[i]+x[j]*sin(2.*pi*i*j/size)+y[j]*cos(2.*pi*i*j/size) |
16 | 270 | equemene | return(X,Y)
|
17 | 270 | equemene | |
18 | 270 | equemene | # Numpy Discrete Fourier Transform
|
19 | 270 | equemene | def NumpyDFT(x,y): |
20 | 270 | equemene | size=x.shape[0]
|
21 | 270 | equemene | X=np.zeros(size).astype(np.float32) |
22 | 270 | equemene | Y=np.zeros(size).astype(np.float32) |
23 | 270 | equemene | nj=np.multiply(2.0*np.pi/size,np.arange(size)).astype(np.float32)
|
24 | 270 | equemene | for i in range(size): |
25 | 270 | equemene | X[i]=np.sum(np.subtract(np.multiply(np.cos(i*nj),x),np.multiply(np.sin(i*nj),y))) |
26 | 270 | equemene | Y[i]=np.sum(np.add(np.multiply(np.sin(i*nj),x),np.multiply(np.cos(i*nj),y))) |
27 | 270 | equemene | return(X,Y)
|
28 | 270 | equemene | |
29 | 270 | equemene | # Numba Discrete Fourier Transform
|
30 | 270 | equemene | import numba |
31 | 270 | equemene | @numba.njit(parallel=True) |
32 | 270 | equemene | def NumbaDFT(x,y): |
33 | 270 | equemene | size=x.shape[0]
|
34 | 271 | equemene | X=np.zeros(size).astype(np.float32) |
35 | 271 | equemene | Y=np.zeros(size).astype(np.float32) |
36 | 270 | equemene | nj=np.multiply(2.0*np.pi/size,np.arange(size)).astype(np.float32)
|
37 | 270 | equemene | for i in numba.prange(size): |
38 | 270 | equemene | X[i]=np.sum(np.subtract(np.multiply(np.cos(i*nj),x),np.multiply(np.sin(i*nj),y))) |
39 | 270 | equemene | Y[i]=np.sum(np.add(np.multiply(np.sin(i*nj),x),np.multiply(np.cos(i*nj),y))) |
40 | 270 | equemene | return(X,Y)
|
41 | 270 | equemene | |
42 | 270 | equemene | import sys |
43 | 270 | equemene | import time |
44 | 270 | equemene | |
45 | 270 | equemene | if __name__=='__main__': |
46 | 270 | equemene | |
47 | 270 | equemene | # Size of input vectors definition based on stdin
|
48 | 270 | equemene | import sys |
49 | 270 | equemene | try:
|
50 | 270 | equemene | SIZE=int(sys.argv[1]) |
51 | 270 | equemene | print("Size of vectors set to %i" % SIZE)
|
52 | 270 | equemene | except:
|
53 | 271 | equemene | SIZE=256
|
54 | 270 | equemene | print("Size of vectors set to default size %i" % SIZE)
|
55 | 270 | equemene | |
56 | 270 | equemene | a_np = np.ones(SIZE).astype(np.float32) |
57 | 270 | equemene | b_np = np.ones(SIZE).astype(np.float32) |
58 | 270 | equemene | |
59 | 271 | equemene | C_np = np.zeros(SIZE).astype(np.float32) |
60 | 271 | equemene | D_np = np.zeros(SIZE).astype(np.float32) |
61 | 271 | equemene | C_np[0] = np.float32(SIZE)
|
62 | 271 | equemene | D_np[0] = np.float32(SIZE)
|
63 | 271 | equemene | |
64 | 270 | equemene | # Native & Naive Implementation
|
65 | 270 | equemene | print("Performing naive implementation")
|
66 | 270 | equemene | TimeIn=time.time() |
67 | 270 | equemene | c_np,d_np=MyDFT(a_np,b_np) |
68 | 270 | equemene | NativeElapsed=time.time()-TimeIn |
69 | 270 | equemene | NativeRate=int(SIZE/NativeElapsed)
|
70 | 270 | equemene | print("NativeRate: %i" % NativeRate)
|
71 | 271 | equemene | print("Precision: ",np.linalg.norm(c_np-C_np),np.linalg.norm(d_np-D_np))
|
72 | 271 | equemene | |
73 | 270 | equemene | # Native & Numpy Implementation
|
74 | 270 | equemene | print("Performing Numpy implementation")
|
75 | 270 | equemene | TimeIn=time.time() |
76 | 270 | equemene | e_np,f_np=NumpyDFT(a_np,b_np) |
77 | 270 | equemene | NumpyElapsed=time.time()-TimeIn |
78 | 270 | equemene | NumpyRate=int(SIZE/NumpyElapsed)
|
79 | 270 | equemene | print("NumpyRate: %i" % NumpyRate)
|
80 | 271 | equemene | print("Precision: ",np.linalg.norm(e_np-C_np),np.linalg.norm(f_np-D_np))
|
81 | 270 | equemene | |
82 | 271 | equemene | # Native & Numba Implementation
|
83 | 270 | equemene | print("Performing Numba implementation")
|
84 | 270 | equemene | TimeIn=time.time() |
85 | 270 | equemene | g_np,h_np=NumbaDFT(a_np,b_np) |
86 | 271 | equemene | NumbaElapsed=time.time()-TimeIn |
87 | 271 | equemene | NumbaRate=int(SIZE/NumbaElapsed)
|
88 | 271 | equemene | print("NumbaRate: %i" % NumbaRate)
|
89 | 271 | equemene | print("Precision: ",np.linalg.norm(g_np-C_np),np.linalg.norm(h_np-D_np)) |