<2022-04-21 周四>
如何写ScaleImage()的硬件加速函数(一)
分析ScaleImage()函数及考虑参数如何传递:
- 函数中最大的循环是按
Y垂直方向的,这样每次内循环以X水平方向进行。 - 最大的循环中以两个
if-else分支为主,分别比较目标宽高是否等于原始宽高,所以可以考虑以两个无符号整形代表(因为kernel函数不支持布尔类型,1表示相等,0表示不等)或者也可以直接传入原始宽高和目标高宽,在kernel函数中比较是否相等。 - 选择传入目标宽高和原始宽高比较好,这样
x_scale和y_scale也可以在kernel函数中计算。 - 该函数中有申请可变长的动态数组,按照原始图片的宽度为长度申请堆内存。参考
ResizeImage()和AccelerateResizeImage()函数,它们没有用到可变长动态数组,在kernel函数中申请动态数组明显不合适,因为opencl不支持动态数组。 - 继续参考
ResizeImage()和AccelerateResizeImage()函数,用到了三个图片内存传入kernel函数,分别是imageBuffer,tempImageBuffer和filteredImageBuffer,原以为参数传递错了,为什么在resizeHorizontalFilter()和resizeVerticalFilter()函数中只有一个函数用到了filteredImageBuffer变量? - 仔细分析
resizeHorizontalFilter()和resizeVerticalFilter()函数发现它们的第五个参数是输入参数,第九个参数是输出参数,tempImageBuffer是临时内存,做为第一个函数的输出参数和第二个函数的输入参数,代码如下:
outputReady=resizeHorizontalFilter(device,queue,image,filteredImage,
imageBuffer,matte_or_cmyk,(cl_uint) image->columns,
(cl_uint) image->rows,tempImageBuffer,(cl_uint) resizedColumns,
(cl_uint) image->rows,filter_type,filter_info,blur,
cubicCoefficientsBuffer,xFactor,exception);
if (outputReady == MagickFalse)
goto cleanup;
outputReady=resizeVerticalFilter(device,queue,image,filteredImage,
tempImageBuffer,matte_or_cmyk,(cl_uint) resizedColumns,
(cl_uint) image->rows,filteredImageBuffer,(cl_uint) resizedColumns,
(cl_uint) resizedRows,filter_type,filter_info,blur,
cubicCoefficientsBuffer,yFactor,exception);
if (outputReady == MagickFalse)
goto cleanup;
- 那似乎
ScaleImage()里用不到这个临时内存,因为函数结构有区别。 - 以原图宽高为长度的动态数组是不是可以在调用
kernel函数之前申请好,用于临时内存?
commit:fake run: AccelerateScaleImage() can work now but with wrong effect。
本文讨论了如何在OpenCL中编写ScaleImage的硬件加速函数,重点关注参数传递、循环结构、动态数组使用以及ResizeImage和AccelerateResizeImage函数的启发。作者还探讨了如何改进内存管理,以提高性能并解决临时内存需求问题。
&spm=1001.2101.3001.5002&articleId=135912824&d=1&t=3&u=3b359e1ec7754702bd732efab9e67c31)
475

被折叠的 条评论
为什么被折叠?



