私は非常に単純な OpenCL カーネルを持っています。基本的には、入力を定義するだけです。
__kernel void test(__read_only image3d_t d_multitest){}
ホスト側のコードは、イメージをデバイスに転送してカーネルを実行するための基本的な pyopencl です。
import pyopencl as cl
import numpy as np
platform = cl.get_platforms()[0]
devs = platform.get_devices()
device1 = devs[1]
h_test = np.zeros((64,512,512)).astype(np.float32,order='F')
mf = cl.mem_flags
ctx = cl.Context([device1])
Queue1 = cl.CommandQueue(ctx,properties=cl.command_queue_properties.PROFILING_ENABLE)
Queue2 = cl.CommandQueue(ctx,properties=cl.command_queue_properties.PROFILING_ENABLE)
event_list=[]
fi = open('Minimal.cl', 'r')
fstr = "".join(fi.readlines())
prg = cl.Program(ctx, fstr).build()
knl = prg.test
d_test = cl.Image(ctx,mf.READ_ONLY, cl.ImageFormat(cl.channel_order.INTENSITY, cl.channel_type.FLOAT), h_test.shape)
e1 = cl.enqueue_copy(Queue1, d_test, h_test, is_blocking = False, origin = (0,0,0), region = h_test.shape)
knl.set_args(d_test)
cl.enqueue_nd_range_kernel(Queue2,knl,(512,512,64),None,wait_for=[e1,])
このコードをさまざまなデバイスでプロファイリングしていますが、転送時間は基本的にデバイスのメモリ帯域幅に比例することがわかります。これは予想されることです。一方、カーネルの実行時間は大きく異なります。
Nvidia では、カーネルの実行時間は <<1ms です。
ただし、まったく同じカーネルでも、AMD の実装では 20 ミリ秒以上かかります。
私の質問は、この種のオーバーヘッドが許容できるかどうか、または基本的に間違ったことをしている場合です。
ハードウェア:
NVIDIA GeForce GTX TITAN X
AMD ATI Radeon 9 290X
ホスト: Ubuntu 16.04