Skip to content

Commit ed52b90

Browse files
Dzhelil Rufatpavanky
authored andcommitted
Add numpy benchmarks to fft and blas.
* Add numpy benchmarks to fft and blas. Switch to timeit for benchmark measurements. * Use a more descriptive name for benchmark. * Switch back to using time module for benchmarks to ensure that af.sync() is run only once.
1 parent 1b5a8d3 commit ed52b90

File tree

2 files changed

+88
-29
lines changed

2 files changed

+88
-29
lines changed

examples/benchmarks/bench_blas.py

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,57 @@
1212

1313
import sys
1414
from time import time
15-
from arrayfire import (array, randu, matmul)
1615
import arrayfire as af
1716

18-
def bench(A, iters = 100):
19-
start = time()
20-
for t in range(iters):
21-
B = af.matmul(A, A)
17+
try:
18+
import numpy as np
19+
except:
20+
np = None
21+
22+
23+
def calc_arrayfire(n):
24+
A = af.randu(n, n)
2225
af.sync()
23-
return (time() - start) / iters
26+
27+
def run(iters):
28+
for t in range(iters):
29+
B = af.matmul(A, A)
30+
af.sync()
31+
32+
return run
33+
34+
35+
def calc_numpy(n):
36+
np.random.seed(1)
37+
A = np.random.rand(n, n).astype(np.float32)
38+
39+
def run(iters):
40+
for t in range(iters):
41+
B = np.dot(A, A)
42+
43+
return run
44+
45+
46+
def bench(calc, iters=100, upto=2048):
47+
_, name = calc.__name__.split("_")
48+
print("Benchmark N x N matrix multiply on %s" % name)
49+
50+
for n in range(128, upto + 128, 128):
51+
run = calc(n)
52+
start = time()
53+
run(iters)
54+
t = (time() - start) / iters
55+
gflops = 2.0 * (n ** 3) / (t * 1E9)
56+
print("Time taken for %4d x %4d: %0.4f Gflops" % (n, n, gflops))
57+
2458

2559
if __name__ == "__main__":
2660

2761
if (len(sys.argv) > 1):
2862
af.set_device(int(sys.argv[1]))
2963

3064
af.info()
31-
print("Benchmark N x N matrix multiply")
32-
33-
for n in range(128, 2048 + 128, 128):
34-
A = af.randu(n, n)
35-
af.sync()
3665

37-
t = bench(A)
38-
gflops = 2.0 * (n**3) / (t * 1E9)
39-
print("Time taken for %4d x %4d: %0.4f Gflops" % (n, n, gflops))
66+
bench(calc_arrayfire)
67+
if np:
68+
bench(calc_numpy, upto=512)

examples/benchmarks/bench_fft.py

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,59 @@
1212

1313
import sys
1414
from time import time
15-
from arrayfire import (array, randu, matmul)
1615
import arrayfire as af
1716

18-
def bench(A, iters = 100):
19-
start = time()
20-
for t in range(iters):
21-
B = af.fft2(A)
17+
try:
18+
import numpy as np
19+
except:
20+
np = None
21+
22+
23+
def calc_arrayfire(n):
24+
A = af.randu(n, n)
2225
af.sync()
23-
return (time() - start) / iters
26+
27+
def run(iters):
28+
for t in range(iters):
29+
B = af.fft2(A)
30+
31+
af.sync()
32+
33+
return run
34+
35+
36+
def calc_numpy(n):
37+
np.random.seed(1)
38+
A = np.random.rand(n, n).astype(np.float32)
39+
40+
def run(iters):
41+
for t in range(iters):
42+
B = np.fft.fft2(A)
43+
44+
return run
45+
46+
47+
def bench(calc, iters=100, upto=13):
48+
_, name = calc.__name__.split("_")
49+
print("Benchmark N x N 2D fft on %s" % name)
50+
51+
for M in range(7, upto):
52+
N = 1 << M
53+
run = calc(N)
54+
start = time()
55+
run(iters)
56+
t = (time() - start) / iters
57+
gflops = (10.0 * N * N * M) / (t * 1E9)
58+
print("Time taken for %4d x %4d: %0.4f Gflops" % (N, N, gflops))
59+
2460

2561
if __name__ == "__main__":
2662

2763
if (len(sys.argv) > 1):
2864
af.set_device(int(sys.argv[1]))
2965

3066
af.info()
31-
print("Benchmark N x N 2D fft")
3267

33-
for M in range(7, 13):
34-
N = 1 << M
35-
A = af.randu(N, N)
36-
af.sync()
37-
38-
t = bench(A)
39-
gflops = (10.0 * N * N * M) / (t * 1E9)
40-
print("Time taken for %4d x %4d: %0.4f Gflops" % (N, N, gflops))
68+
bench(calc_arrayfire)
69+
if np:
70+
bench(calc_numpy, upto=10)

0 commit comments

Comments
 (0)