single threadよりもmultiple-threadsの方が計算速度が速いということは容易に理解できる。しかし、実際にどれくらい高速なのかという疑問が湧いたので、早速速度比較をしてみた。
スポンサーリンク
ipyparallelを使う¶
from ipyparallel import Client
rc = Client()
rc.ids
dv = rc[:]
スポンサーリンク
マンデルブロットを描く¶
マンデルブロ集合を描くコードを書く。マンデルブローとも言われている。個人的にはマンデルブロットと言っている。
@dv.parallel(block = True)
def mandel2(x, y, max_iters=80):
c = complex(x, y)
z = 0.0j
for i in range(max_iters):
z = z*z + c
if z.real*z.real + z.imag*z.imag >= 4:
return i
return max_iters
def mandel1(x, y, max_iters=80):
c = complex(x, y)
z = 0.0j
for i in range(max_iters):
z = z*z + c
if z.real*z.real + z.imag*z.imag >= 4:
return i
return max_iters
import numpy as np
x = np.arange(-2, 1, 0.01)
y = np.arange(-1, 1, 0.01)
X, Y = np.meshgrid(x, y)
%%time
im1 = np.reshape(list(map(mandel1, X.ravel(), Y.ravel())), (len(y), len(x)))
%%time
im2 = np.reshape(mandel2.map(X.ravel(), Y.ravel()), (len(y), len(x)))
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].grid(False)
axes[0].imshow(im1, cmap='jet')
axes[1].grid(False)
axes[1].imshow(im2, cmap='jet')
スポンサーリンク
シングルスレッドバージョン¶
import matplotlib.pyplot as plt
import time
start_time = time.time()
def mandel1(x, y, max_iters=250):
c = complex(x, y)
z = 0.0j
for i in range(max_iters):
z = z*z + c
if z.real*z.real + z.imag*z.imag >= 4:
return i
return max_iters
x = np.arange(-2, 1, 0.001)
y = np.arange(-1, 1, 0.001)
X, Y = np.meshgrid(x, y)
start = time.clock()
im1 = np.reshape(list(map(mandel1, X.ravel(), Y.ravel())), (len(y), len(x)))
plt.grid(False)
plt.imshow(im1, cmap='jet')
dt = time.time() - start_time
print("Mandelbrot created on CPU in %f s" % dt)
スポンサーリンク
multi-threaded version¶
import matplotlib.pyplot as plt
import time
start_time = time.time()
@dv.parallel(block = True)
def mandel2(x, y, max_iters=250):
c = complex(x, y)
z = 0.0j
for i in range(max_iters):
z = z*z + c
if z.real*z.real + z.imag*z.imag >= 4:
return i
return max_iters
x = np.arange(-2, 1, 0.001)
y = np.arange(-1, 1, 0.001)
X, Y = np.meshgrid(x, y)
start = time.clock()
im2 = np.reshape(mandel2.map(X.ravel(), Y.ravel()), (len(y), len(x)))
plt.grid(False)
plt.imshow(im2, cmap='jet')
dt = time.time() - start_time
print("Mandelbrot created on CPU in %f s" % dt)
102.121429/19.603561
multi-threaded versionはsingle thread versionの約5.2倍速い。
スポンサーリンク
スポンサーリンク