今日はこのサイトのコードを参考にしてPyCUDAのExclusiveScanKernelを使ってみる。
スポンサーリンク
codeをloadする¶
cd git/gpu/Code/Python/PyCUDA
ls
# %load scan.py
import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
from pycuda.scan import InclusiveScanKernel
knl = InclusiveScanKernel(np.int32, "a+b")
n = 2**20-2**18+5
host_data = np.random.randint(0, 10, n).astype(np.int32)
dev_data = gpuarray.to_gpu(host_data)
knl(dev_data)
assert (dev_data.get() == np.cumsum(host_data, axis=0)).all()
スポンサーリンク
コードを書き換える¶
このサイトを参考にしてコードを書き換える。
# %load scan.py
import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
import time
from pycuda.scan import InclusiveScanKernel
N = pow(2,15)
NArrays = 5
n = 2**20-2**18+5
arrayDList = []
for i in range(NArrays):
host_data = np.random.randint(i, 10, n).astype(np.int32)
arrayDList.append(gpuarray.to_gpu(host_data))
krn = InclusiveScanKernel(np.int32,"a+b")
for i in range(NArrays):
time1 = time.time()
a = krn(arrayDList[i])
time2 = time.time()
print ("time = " + str(time2-time1))
print(a.get())
スポンサーリンク
ElementwiseKernelを使う¶
from pycuda.elementwise import ElementwiseKernel
NArrays = 5
n = 2**20-2**18+5
arrayDList = []
for i in range(NArrays):
host_data = np.random.randint(i, 10, n).astype(np.int32)
arrayDList.append(gpuarray.to_gpu(host_data))
knr = ElementwiseKernel(arguments = "np.int32",
operation = "a+b")
for i in range(NArrays):
time1 = time.time()
a = krn(arrayDList[i])
time2 = time.time()
print ("time = " + str(time2-time1))
print(a)
InclusiveScanKernelとElementwiseKernelは速度がほとんど変わらない。
スポンサーリンク
スポンサーリンク