Skip to content

Commit b2c7ede

Browse files
committed
renaming, refactoring
1 parent 8283f28 commit b2c7ede

10 files changed

+483
-175
lines changed

doc/api.rst

+19-5
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,26 @@ Tutorial
2323

2424
.. autofunction:: td3a_cpp.tutorial.dot_cython.dot_product
2525

26-
.. autofunction:: td3a_cpp.tutorial.dot_cython.dot_cython_array
26+
For **float32**:
2727

28-
.. autofunction:: td3a_cpp.tutorial.dot_cython.dot_cython_array_optim
28+
.. autofunction:: td3a_cpp.tutorial.dot_cython.sdot_cython_array
2929

30-
.. autofunction:: td3a_cpp.tutorial.dot_cython.dot_array
30+
.. autofunction:: td3a_cpp.tutorial.dot_cython.sdot_cython_array_optim
3131

32-
.. autofunction:: td3a_cpp.tutorial.dot_cython.dot_array_16
32+
.. autofunction:: td3a_cpp.tutorial.dot_cython.sdot_array
3333

34-
.. autofunction:: td3a_cpp.tutorial.dot_cython.dot_array_16_sse
34+
.. autofunction:: td3a_cpp.tutorial.dot_cython.sdot_array_16
35+
36+
.. autofunction:: td3a_cpp.tutorial.dot_cython.sdot_array_16_sse
37+
38+
For **double**:
39+
40+
.. autofunction:: td3a_cpp.tutorial.dot_cython.ddot_cython_array
41+
42+
.. autofunction:: td3a_cpp.tutorial.dot_cython.ddot_cython_array_optim
43+
44+
.. autofunction:: td3a_cpp.tutorial.dot_cython.ddot_array
45+
46+
.. autofunction:: td3a_cpp.tutorial.dot_cython.ddot_array_16
47+
48+
.. autofunction:: td3a_cpp.tutorial.dot_cython.ddot_array_16_sse

examples/plot_benchmark_dot.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,10 @@
8383
cc['N'] = cc['x_name']
8484

8585
fig, ax = plt.subplots(1, 2, figsize=(10, 4))
86-
cc[cc.N <= 1100].pivot('N', 'fct', 'average').plot(logy=True, ax=ax[0])
87-
cc[cc.fct != 'pydot'].pivot('N', 'fct', 'average').plot(logy=True, ax=ax[1])
86+
cc[cc.N <= 1100].pivot('N', 'fct', 'average').plot(
87+
logy=True, logx=True, ax=ax[0])
88+
cc[cc.fct != 'pydot'].pivot('N', 'fct', 'average').plot(
89+
logy=True, logx=True, ax=ax[1])
8890
ax[0].set_title("Comparison of dot implementations")
8991
ax[1].set_title("Comparison of dot implementations\nwithout python")
9092

examples/plot_benchmark_dot_cython.py

+61-23
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
the following:
1313
1414
* :func:`dot_product <td3a_cpp.tutorial.dot_cython.dot_product>`
15-
* :func:`dot_cython_array <td3a_cpp.tutorial.dot_cython.dot_cython_array>`
16-
* :func:`dot_cython_array_optim
17-
<td3a_cpp.tutorial.dot_cython.dot_cython_array_optim>`
18-
* :func:`dot_array <td3a_cpp.tutorial.dot_cython.dot_array>`
19-
* :func:`dot_array_16 <td3a_cpp.tutorial.dot_cython.dot_array_16>`
20-
* :func:`dot_array_16_sse <td3a_cpp.tutorial.dot_cython.dot_array_16_sse>`
15+
* :func:`ddot_cython_array <td3a_cpp.tutorial.dot_cython.dot_cython_array>`
16+
* :func:`ddot_cython_array_optim
17+
<td3a_cpp.tutorial.dot_cython.ddot_cython_array_optim>`
18+
* :func:`ddot_array <td3a_cpp.tutorial.dot_cython.ddot_array>`
19+
* :func:`ddot_array_16 <td3a_cpp.tutorial.dot_cython.ddot_array_16>`
20+
* :func:`ddot_array_16_sse <td3a_cpp.tutorial.dot_cython.ddot_array_16_sse>`
2121
2222
.. contents::
2323
:local:
@@ -27,16 +27,21 @@
2727
import matplotlib.pyplot as plt
2828
from pandas import DataFrame, concat
2929
from td3a_cpp.tutorial.dot_cython import (
30-
dot_product, dot_cython_array,
31-
dot_cython_array_optim, dot_array,
32-
dot_array_16, dot_array_16_sse
30+
dot_product, ddot_cython_array,
31+
ddot_cython_array_optim, ddot_array,
32+
ddot_array_16, ddot_array_16_sse
33+
)
34+
from td3a_cpp.tutorial.dot_cython import (
35+
sdot_cython_array,
36+
sdot_cython_array_optim, sdot_array,
37+
sdot_array_16, sdot_array_16_sse
3338
)
3439
from td3a_cpp.tools import measure_time_dim
3540

3641

37-
def get_vectors(fct, n, h=100):
38-
ctxs = [dict(va=numpy.random.randn(n).astype(numpy.float64),
39-
vb=numpy.random.randn(n).astype(numpy.float64),
42+
def get_vectors(fct, n, h=100, dtype=numpy.float64):
43+
ctxs = [dict(va=numpy.random.randn(n).astype(dtype),
44+
vb=numpy.random.randn(n).astype(dtype),
4045
dot=fct,
4146
x_name=n)
4247
for n in range(10, n, h)]
@@ -59,9 +64,9 @@ def get_vectors(fct, n, h=100):
5964
# ++++++++++++++++++
6065
#
6166

62-
for fct in [dot_product, dot_cython_array,
63-
dot_cython_array_optim, dot_array,
64-
dot_array_16, dot_array_16_sse]:
67+
for fct in [dot_product, ddot_cython_array,
68+
ddot_cython_array_optim, ddot_array,
69+
ddot_array_16, ddot_array_16_sse]:
6570
ctxs = get_vectors(fct, 10000 if fct.__name__ != 'dot_product' else 1000)
6671

6772
df = DataFrame(list(measure_time_dim('dot(va, vb)', ctxs, verbose=1)))
@@ -76,15 +81,48 @@ def get_vectors(fct, n, h=100):
7681
cc = concat(dfs)
7782
cc['N'] = cc['x_name']
7883

79-
fig, ax = plt.subplots(1, 2, figsize=(10, 4))
80-
cc[cc.N <= 1100].pivot('N', 'fct', 'average').plot(logy=True, ax=ax[0])
81-
cc[cc.fct != 'dot_product'].pivot(
82-
'N', 'fct', 'average').plot(logy=True, ax=ax[1])
83-
ax[0].set_title("Comparison of cython dot implementations")
84-
ax[1].set_title("Comparison of cython dot implementations"
85-
"\nwithout dot_product")
84+
fig, ax = plt.subplots(2, 2, figsize=(10, 10))
85+
cc[cc.N <= 1100].pivot('N', 'fct', 'average').plot(
86+
logy=True, logx=True, ax=ax[0, 0])
87+
cc[cc.fct != 'dot_product'].pivot('N', 'fct', 'average').plot(
88+
logy=True, ax=ax[0, 1])
89+
cc[cc.fct != 'dot_product'].pivot('N', 'fct', 'average').plot(
90+
logy=True, logx=True, ax=ax[1, 1])
91+
ax[0, 0].set_title("Comparison of cython ddot implementations")
92+
ax[0, 1].set_title("Comparison of cython ddot implementations"
93+
"\nwithout dot_product")
8694

8795
###################
88-
# :epkg:`numpy` is cleary faster.
96+
# :epkg:`numpy` is faster but we are able to catch up.
97+
98+
###################################
99+
# Same for floats
100+
# +++++++++++++++
101+
#
102+
# Let's for single floats.
103+
104+
dfs = []
105+
for fct in [numpy.dot, sdot_cython_array,
106+
sdot_cython_array_optim, sdot_array,
107+
sdot_array_16, sdot_array_16_sse]:
108+
ctxs = get_vectors(fct, 10000 if fct.__name__ != 'dot_product' else 1000,
109+
dtype=numpy.float32)
110+
111+
df = DataFrame(list(measure_time_dim('dot(va, vb)', ctxs, verbose=1)))
112+
df['fct'] = fct.__name__
113+
dfs.append(df)
114+
print(df.tail(n=3))
115+
116+
117+
cc = concat(dfs)
118+
cc['N'] = cc['x_name']
119+
120+
fig, ax = plt.subplots(1, 2, figsize=(10, 4))
121+
cc.pivot('N', 'fct', 'average').plot(
122+
logy=True, ax=ax[0])
123+
cc.pivot('N', 'fct', 'average').plot(
124+
logy=True, logx=True, ax=ax[1])
125+
ax[0].set_title("Comparison of cython sdot implementations")
126+
ax[1].set_title("Comparison of cython sdot implementations")
89127

90128
plt.show()

examples/plot_long_parallel_process_joblib.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def parallel_dot_joblib(va, vb, max_workers=2):
6161

6262
df = DataFrame(res).set_index('N')
6363
print(df)
64-
df.plot(logy=True)
64+
df.plot(logy=True, logx=True)
6565
plt.title("Parallel / numpy dot")
6666

6767
#######################################

td3a_cpp/__init__.py

+54-15
Original file line numberDiff line numberDiff line change
@@ -17,38 +17,77 @@ def check(verbose=1):
1717
"""
1818
import pprint
1919
import numpy
20-
from .tutorial import pydot, cblas_ddot
20+
from .tutorial import pydot, cblas_ddot, cblas_sdot
2121
from .tutorial.dot_cython import (
22-
dot_product, dot_cython_array,
23-
dot_cython_array_optim, dot_array,
24-
dot_array_16, dot_array_16_sse
22+
dot_product, ddot_cython_array,
23+
ddot_cython_array_optim, ddot_array,
24+
ddot_array_16, ddot_array_16_sse
25+
)
26+
from .tutorial.dot_cython import (
27+
sdot_cython_array,
28+
sdot_cython_array_optim, sdot_array,
29+
sdot_array_16, sdot_array_16_sse
2530
)
2631
from .tools import measure_time
32+
rows = []
2733

28-
va = numpy.arange(0, 10000).astype(numpy.float64)
29-
vb = numpy.arange(0, 10000).astype(numpy.float64) - 5
34+
# double
35+
if verbose > 0:
36+
print("\ndouble\n")
37+
38+
va = numpy.random.randn(100).astype(numpy.float64)
39+
vb = numpy.random.randn(100).astype(numpy.float64)
3040
fcts = [
3141
('pydot', pydot, 1),
3242
('numpy.dot', numpy.dot),
3343
('ddot', cblas_ddot),
3444
('dot_product', dot_product),
35-
('dot_cython_array', dot_cython_array),
36-
('dot_cython_array_optim', dot_cython_array_optim),
37-
('dot_array', dot_array),
38-
('dot_array_16', dot_array_16),
39-
('dot_array_16_sse', dot_array_16_sse),
45+
('ddot_cython_array', ddot_cython_array),
46+
('ddot_cython_array_optim', ddot_cython_array_optim),
47+
('ddot_array', ddot_array),
48+
('ddot_array_16', ddot_array_16),
49+
('ddot_array_16_sse', ddot_array_16_sse),
4050
]
4151

42-
rows = []
4352
for tu in fcts:
4453
name, fct = tu[:2]
45-
ctx = {'va': va, 'vb': vb, 'fdot': fct}
54+
ctx = {'va': va, 'vb': vb, 'fctdot': fct}
4655
if len(tu) == 3:
47-
res = measure_time('fdot(va, vb)', ctx, repeat=tu[2])
56+
res = measure_time('fctdot(va, vb)', ctx, repeat=tu[2])
4857
else:
49-
res = measure_time('fdot(va, vb)', ctx)
58+
res = measure_time('fctdot(va, vb)', ctx)
5059
res['name'] = name
5160
if verbose > 0:
5261
pprint.pprint(res)
5362
rows.append(res)
63+
64+
# float
65+
if verbose > 0:
66+
print("\nfloat\n")
67+
68+
va = numpy.random.randn(100).astype(numpy.float32)
69+
vb = numpy.random.randn(100).astype(numpy.float32)
70+
fcts = [
71+
('pydot', pydot, 1),
72+
('numpy.dot', numpy.dot),
73+
('sdot', cblas_sdot),
74+
('sdot_cython_array', sdot_cython_array),
75+
('sdot_cython_array_optim', sdot_cython_array_optim),
76+
('sdot_array', sdot_array),
77+
('sdot_array_16', sdot_array_16),
78+
('sdot_array_16_sse', sdot_array_16_sse),
79+
]
80+
81+
for tu in fcts:
82+
name, fct = tu[:2]
83+
ctx = {'va': va, 'vb': vb, 'fctdot': fct}
84+
if len(tu) == 3:
85+
res = measure_time('fctdot(va, vb)', ctx, repeat=tu[2])
86+
else:
87+
res = measure_time('fctdot(va, vb)', ctx)
88+
res['name'] = name
89+
if verbose > 0:
90+
pprint.pprint(res)
91+
rows.append(res)
92+
5493
return rows

0 commit comments

Comments
 (0)