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