2012-12-07 96 views
2

Hello Everyone ....
我是新来的opencl并试图探索更多@它。local_work_size对性能的影响以及为什么它是

openCL程序中local_work_size的工作方式以及它在性能方面的重要性。

我工作的一些图像处理算法中和我的OpenCL内核,我给 作为

size_t local_item_size = 1; 
size_t global_item_size = (int) (ceil((float)(D_can_width*D_can_height)/local_item_size))*local_item_size; // Process the entire lists 
ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL,&global_item_size, &local_item_size, 0, NULL, NULL); 

和相同的内核,当我改变

size_t local_item_size = 16; 

藏在心里相同。

我的表现快了约4-5倍。

+0

您可以将local_item_size设置为NULL;而OpenCL将为工作组选择“最佳”大小,但不考虑所使用的本地内存。 –

回答

5

当地工作尺寸,又名工作组大小,是每个工作组工作项数量。

每个工作组被一个计算单元其能够处理一堆工作项,不仅一个上执行。

所以当你使用太小的组时,你会浪费一些计算能力,并且只能在计算单元级别进行粗略的并行化。

但是,如果组中有太多工作项目,那么也可能会失去一些并行化机会,因为某些计算单元可能不会被使用,而其他计算单元会被过度使用。

所以,你可以用多个值进行测试,以找到最好的一个,或只是让OpenCL的通过传递NULL作为当地工作尺寸为您挑选一个好的。 PS:我有兴趣了解OpenCL选择与以前的值相比的性能,所以请你做一个测试并发布结果。 谢谢:)

+0

这是非常有趣的....所以我应该保持local-work-size =(处理元素的数量在一个COMPUTE UNIT中)。我也会很快发布结果。 – Meluha

+1

这不是一个好主意。如果您使用CPU,则每个计算单元只能有一个处理元素。因此,您的工作组大小等于1.这是非常耗时的。 一般而言,建议的内核工作组大小为64-128个工作项。 不考虑使用本地内存。您应该将工作组大小设置为如下所示:Global_size/Compute Unit 通过调用clGetKernelWorkGroupInfo,可以使用CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE获得首选工作组大小倍数。 而且,要从CPU上使用矢量化中受益,工作组大小必须是8的倍数。 –

相关问题