我有一个非常简单的 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 GeForce GTX 泰坦 X
AMD ATI Radeon 9 290X
主机:Ubuntu 16.04