【发布时间】:2013-12-13 08:34:26
【问题描述】:
我为 OpenCL 测试了一个飞思卡尔 i.MX6.Q 平台,我得到了有趣的结果,我无法完全解释。我的算法是通过执行 4 个内核来完成的,最后一个是我感兴趣的一个:经典的图像差异。
我测试了两个版本,一个矢量化版本和一个经典版本(没有矢量化)。起初我对并行化的差异给出的结果感到惊讶:在这个平台上,必须选择 OpenCL,只有要处理的图像包含超过 180kpix(在算法中,图像被处理为缓冲区)。
但是对于两个 OpenCL 实现,在开始时(对于小图像)都有恒定的执行时间(大约 5 毫秒)。我检查了空内核的执行时间,对于任何测试的图像(从 32x32 到 1920x1024),它们在这个平台上总是大约 5 毫秒。
我将空内核的这些时间视为 OpenCL 差异的并行化成本,我想知道该成本包含什么?
我的内核编译是在工作台外完成的,我看不出哪一步应该花费 5 毫秒。 GPU正在处理的只是NDRange解释吗?
如果有人对此有解释,我接受!!!
巴蒂斯特
编辑:
我的时间测量和内核启动:
start_time = time_now();
cl_mem_flags mem_device_host;
if (device.getInfo<CL_DEVICE_HOST_UNIFIED_MEMORY>()==CL_TRUE)
mem_device_host = CL_MEM_USE_HOST_PTR;
else
mem_device_host = CL_MEM_COPY_HOST_PTR;
cl_status = kernel.setArg(0, input_image);
oclReturnOnError(cl_status, "Passage de l'argument 0 du kernel 'morph'")
cl_status = kernel.setArg(1, output_image);
oclReturnOnError(cl_status, "Passage de l'argument 1 du kernel 'morph'")
cl_status = kernel.setArg(2, input_SE);
oclReturnOnError(cl_status, "Passage de l'argument 2 du kernel 'morph'")
cl::Event eventMorph;
cl_status = commandQueue.enqueueNDRangeKernel(kernel,
cl::NullRange,
global_range,
local_range
NULL , &eventMorph);
oclReturnOnError(cl_status, "Ajout du kernel 'morph' à la queue de commande")
cl_status = eventMorph.wait();
oclReturnOnError(cl_status, "Attende d'exécution du kernel 'morph'")
end_time = time_now();
【问题讨论】:
-
你能提供一些发射/测量的代码吗?由于 5ms,这是一个非常高的值。例如,在我的设置中,我有 1us 的执行开销。
-
我添加一个例子。我测量内核执行和参数设置。对于我的空内核,我只有 1 个参数和几个编译选项来让内核接近我的差异。但我认为我的设置有点差(CPU 4 核 @ 1GHz 和 GPU 64 核在 4 CU @ 500MHz)没有本地内存