-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdace-dft.py
More file actions
63 lines (45 loc) · 1.53 KB
/
dace-dft.py
File metadata and controls
63 lines (45 loc) · 1.53 KB
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python
from __future__ import print_function
import dace
import mkl
import numpy as np
import os
import scipy.linalg as linalg
import csv
from numpy.fft import fft
#####################################
N = dace.symbol('N')
@dace.program(dace.complex128[N], dace.complex128[N])
def DFT(X, Y):
# Generate DFT matrix
dft_mat = dace.define_local([N, N], dtype=dace.complex128)
@dace.map(_[0:N, 0:N])
def dft_mat_gen(i, j):
omega >> dft_mat[i, j]
omega = exp(-dace.complex128(0, 2 * 3.14159265359 * i * j) / dace.complex128(N))
# Matrix multiply input vector with DFT matrix
tmp = dace.define_local([N, N], dtype=dace.complex128)
@dace.map(_[0:N, 0:N])
def dft_tasklet(k, n):
x << X[n]
omega << dft_mat[k, n]
out >> tmp[k, n]
out = x * omega
dace.reduce(lambda a, b: a + b, tmp, Y, axis=1, identity=0)
#####################################
def scipy_dft(X, size):
dft_mat = linalg.dft(size)
return np.dot(dft_mat, X)
if __name__ == "__main__":
print("==== Program start ====")
os.environ["OMP_PROC_BIND"] = "true"
dace.Config.set('profiling', value=True)
dace.Config.set('treps', value=100)
size = 128
N.set(size)
print('\nDFT on real vector of length %d' % (N.get()))
# Initialize arrays: Randomize A and B, zero C
X = np.random.rand(N.get()).astype(np.complex128)
Y_dace = np.zeros_like(X, dtype=np.complex128)
Y_np = fft(X)
DFT(X, Y_dace)