numpy vs cupy 速度比較

Anaconda の numpy がいつの間にかデフォルト mkl になっていたので、改めて numpy 対 cupy 対決をしてみました。

  • numpy: 1.16.2
  • cupy: 6.0.0b
  • CPU: intel 6960X(3.0GHz)
  • GPU: TITAN-V

結果を示すと以下の様になりました。

np(1000000):0:00:16.926656 sec
sum:250000055.953125
cp(1000000):0:00:01.184336 sec
sum:250006660.0
np(100000):0:00:01.684878 sec
sum:24998295.525390625
cp(100000):0:00:00.144552 sec
sum:24996460.0
np(10000):0:00:00.175715 sec
sum:2499707.635986328
cp(10000):0:00:00.143209 sec
sum:2499635.8

1万回ループでは殆ど差異はなく、10万回以上で10倍程度の差になっています。

CPUが今となっては非力な点があり、コア数が多く、周波数が高くAVX512 が使える 9XXX 番台だともっと高い数値が期待できると思います。

ちなみに計算時間の殆どは乱数計算が占めています。複雑な並列計算はGPU圧勝という感じでした。

最後に今回のスクリプトを掲載します。

# -*- coding: utf-8 -*-
# numpy(INTEL mkl edition) vs CuPy
import numpy as np
import cupy as cp
import datetime

# initiation...
cp.cuda.set_allocator(cp.cuda.MemoryPool().malloc)

xp = None
size=100000
loop = 1000

def func(r1, r2):
    return xp.dot(r1, r2)
    
def prepare(func, size, rem, el):
    st = datetime.datetime.now()
    r1 = xp.random.rand(size).astype(np.float32)
    r2 = xp.random.rand(size).astype(np.float32)
    rem += func(r1, r2)
    el += datetime.datetime.now() - st
    return (rem, el)

def measure(amble, size, func, count):
    rem = 0.0
    el = datetime.timedelta()
    for r in range(count):
        (rem, el) = prepare(func, size, rem, el)
    print (amble + ":" + str(el) + " sec")
    print ("sum:" + str(rem))

sizes = (1000000, 100000, 10000)
engines = (('np', np), ('cp', cp))

for s in sizes:
    for e in engines:
        xp = e[1]
        amble = e[0] + "(" + str(s) + ")"
        measure(amble, s, func, loop)

cupy のメモリアロケータ(2)

前項からの続き。

set_allocator() を実行すると、どうやらメモリキャッシュが解放されるようだ。
メモリプールを使い回す設定で2回同じテストを実行したところ、
実行速度が一番速くなった。

なお、今回は初期値を一様乱数にしてある。

numpy: 0:00:00.012221 sec
cupy: 0:00:00.000184 sec
cupy(memory pool): 0:00:00.000442 sec
cupy(memory pool2): 0:00:00.000096 sec

 

BOMのワナ

ホームページの、先頭の数ページを作成した。

フォーム問い合わせで SecurImage を使おうとしたら start_session() が warning を出して止まってしまった。原因は encoding で BOM つきの UTF-8 を使っていたことにあった。

BOM は大概のエディタでは目に見えないので、エンコードを確認するしかないのだが、どうもいつも失敗している気がする。

技術ページをいくつか作ったらまた Amazon に申請してみますか。