0

我有一个非常简单的 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。 在 Nvidia 上进行分析

然而,完全相同的内核在 AMD 的实现上花费 >20ms。 在此处输入图像描述

我的问题是,如果这种开销是可以容忍的,或者我做错了什么。

硬件:

NVIDIA GeForce GTX 泰坦 X

AMD ATI Radeon 9 290X

主机:Ubuntu 16.04

4

0 回答 0