cupy の中の人の投稿によると、cupy.cuda.set_allocator() で
メモリプールを使い回すようにすると高速になると書いてある。
実際そのとおりなのだが、投稿にある test() を2回連続で
回すと、アロケータをセットした方が圧倒的に遅くなった。
ソースコードを見ていないが、どこかに実行結果をキャッシュしている?
numpy: 0:00:00.004890 sec
cupy: 0:00:00.000179 sec
cupy(memory pool): 0:00:00.000456 sec
なお、記事では触れていないが、いわいる「バーンイン」を
行わないで GPU 回りのメソッドを呼ぶと初期化設定のため、
最初の1回だけは非常に時間がかかることに注意。
使用したテストコードは以下の通り。
# -*- coding: utf-8 -*-
import numpy as np
import cupy as cp
import datetime
def test(xp):
x = xp.arange(1000000).reshape(1000, -1)
return x.T * 2
def test_with_time(title, xp):
t1 = datetime.datetime.now()
test(xp)
t2 = datetime.datetime.now()
print(title, t2 - t1, "sec")
# バーンイン
#cp.arange(1)
test(cp)
test_with_time("numpy:", np)
test_with_time("cupy:", cp)
cp.cuda.set_allocator(cp.cuda.MemoryPool().malloc)
test_with_time("cupy(memory pool):", cp)