Statistiques
| Révision :

root / ETSN / MyDFT_3.py @ 285

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.subtract(np.multiply(np.cos(i*nj),x),np.multiply(np.sin(i*nj),y)))
26
        Y[i]=np.sum(np.add(np.multiply(np.sin(i*nj),x),np.multiply(np.cos(i*nj),y)))
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.subtract(np.multiply(np.cos(i*nj),x),np.multiply(np.sin(i*nj),y)))
39
        Y[i]=np.sum(np.add(np.multiply(np.sin(i*nj),x),np.multiply(np.cos(i*nj),y)))
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))