我正在尝试优化OpenCL中用于运动估计的块匹配算法。基本上图像尺寸是384×288并且假设图像被分成大小为16×16的多个非重叠宏块,可以实现总共24×18个宏块。
在每个宏块位置,必须估计两个连续帧中的运动(包括搜索附近区域的像素强度的绝对差值之和 - 灰色使用16x16块),我是否正确设置全局大小为24和18分别在启动内核时?
我的理解是,当opencl内核启动时,原始图像上宏块位置的位置可以计算为{get_local_size(0)x 16 -1,get_local_size(1)x 16-1}。它是否正确?此用例的本地工作组大小的最佳值是什么?
谢谢
答案 0 :(得分:0)
我将全局大小分别设置为24和18是正确的 在启动内核时
如果每个线程计算一个完整的宏块,是的,你对全局大小是正确的,但本地大小应该是1或类似3x2。但是如果单线程计算单个像素,则全局参数是总线程。如果你计算每个线程一个像素,它应该是384x288。
组/宏块的数量随本地大小与全局大小的变化而变化。
如果组中有16个线程,并且总共有32个线程,则只有2组线程。对于2D和3D内核执行也会发生同样的事情。
原始图像上宏块位置的位置可以计算为
x=get_group_id(0) * get_local_size(0)
y=get_group_id(1) * get_local_size(1)
id从零开始。位置(x,y)指向贴片的左上角。然后右下角将是
xLast=get_group_id(0) * get_local_size(0)+get_local_size(0)
yLast=get_group_id(1) * get_local_size(1)+get_local_size(1)
在最左边的最左边,假设当前的起源是0,0。
此外,本地工作组规模的最佳值是多少 这个用例?
如果将本地大小参数保留为空(null),opencl实现会选择它(具有合适的大小但可能不是最佳),因此组的数量是未知的。
如果每个像素的线程数或每组线程数或每个像素的线程数超过一个,则全局大小和本地大小将不同。例如,如果要从较旧的5帧计算2个新帧,则可以使用每个像素2个线程。或者你可以在一个像素的单个线程中完成所有工作,或者你可以在一个线程中完成所有16x16像素的工作,或者你可以在一个线程中完成所有工作。选择是你的,你应该测试/ farsee,如果你的算法是令人尴尬的并行或串行。
我猜估计类似于5(或11)点模板(2d时间微分?)所以它会添加东西,适当地乘以单线程,然后应用于像素,然后对另一帧做同样的事情# 39; s像素,然后对所有16x16像素的宏块执行相同操作,然后对所有宏块执行相同操作,它应该使用每个像素1个线程(重新使用已计算的模板计算2个帧)(只有1个颜色?)。
你可以从工作代码开始(或者自己重写),然后在它的嵌套循环上并行化,例如你可以扫描线(1D内核),扫描像素(2D内核),扫描像素及其子像素(3D?)使得我变成get_global_id(0)而j变成get_global_id(1)。