Statistiques
| Révision :

root / ETSN / MyDFT_3.py @ 277

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))