Other Parts Discussed in Thread: AM5728
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:AM5728 工具/软件:Linux
我将开始调查 AM5728上的 OpenCL。 我有 OpenCL 工作、可以执行基本操作、例如向量添加。 我现在对使用 OpenCL 进行图像处理感兴趣。 我尝试实现了本博客文章中的相同"模糊"功能: "Microsoft <a href="">">anteru.net/.../index.html""> s://anteru.net/blog/2012/05/2022/index.html"。
我使用的是内核为4.4.4.41的 TI 处理器 SDK。
当 OpenCL 尝试编译内核时,由于函数"read_imagef"和"write_imagef",它会因 cl_build_program_failure(-11 )而失败。
AM5728上的 TI OpenCL 是否不支持图像功能?
错误消息:
已定义并初始化未 定义的过滤器 符号 文件中 ------ -------- read_imagef /tmp/opencltJqDR7.obj write_imagef /tmp/opencltJqDR7.obj 错误#10234-D:未解析的符号保留 错误#10010:链接期间遇到错误;"/tmp/opencltJqDR7.out 未 生成 >>编译失败 OpenCL 调用失败、错误-11
代码如下:
/**
* OCLControl::blurImage()
*用途:
@OpenCL 的蓝色图像**@param 输入是一个字符*表示要处理的图像*@param 宽度是输入图像的跨度*@param 高度是输入图像的高度* param 深度是输入图像的位深度
*
//
void OCLControl:::blurImage (char *输入、uint 宽度、uint 高度、uint 高度、 UINT 深度){
//错误跟踪
int error =-1;
//简单的高斯模糊滤波器
浮点滤波器[]={
1、2、1、
2、4、2、
1、2、1
};
//对滤波器进行标准化
对于(int i = 0;i < 9;+i){
过滤器[i]/= 16.0f;
}
#ifdef OCL_DEBUG
qDebug ()<<"已定义和已初始化的滤波器";
#endif
cl_program = CreateProgram (QString ("OCL.cl"));
CheckError (clBuildProgram (program、1、&m_DeviceID、"-D filter_size=1"、nulptr、 lpnulltr);
#ifdef OCL_DEBUG
qDebug()<<"created program";
#endif
// www.khronos.org/.../clCreateKernel.html
cl_kernel kernel = clCreateKernel (程序、"过滤器"、错误);
CheckError (错误);
#ifdef OCL_DEBUG
qDebug()<<"创建的内核";
#endif
//从 DMABUF 创建映像
常量自动图像= LoadImageFromCharArray (输入、宽度、高度、深度);
// www.khronos.org/.../clCreateImage2D.html
静态常量 cl_image_format 格式={CL_RGBA、CL_UNORM_INT8};
cl_mem inputImage = clCreateImage2D (m_context、CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR、&format、
image.width、image.height、0、
//这是规范中的错误
const_cast (image.pixe.data ()))、
错误);
CheckError (错误);
#ifdef OCL_DEBUG
qDebug()<<"created 2D input Image";
#endif
//创建输出图像
cl_mem outputImage = clCreateImage2D (m_context、CL_MEM_write_only、&format、
image.width、image.height、0、
lpnulltr,&error);
CheckError (错误);
#ifdef OCL_DEBUG
qDebug()<<"created 2D output Image";
#endif
//为滤波器权重创建缓冲区
// www.khronos.org/.../clCreateBuffer.html
cl_mem filterWeightsBuffer = clCreateBuffer (m_context、CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR、sizeof (float)* 9、filter、&error);
CheckError (错误);
//设置内核参数
clSetKernelArg (内核、0、sizeof (cl_mem)、&inputImage);
clSetKernelArg (内核、1、sizeof (cl_mem)、&filterWeightsBuffer);
clSetKernelArg (内核、2、sizeof (cl_mem)、outputImage);
#ifdef OCL_DEBUG
qDebug()<<"设置内核参数";
#endif
//运行处理
// www.khronos.org/.../clEnqueueNDRangeKernel.html
std::size_t offset [3]={0};
std::size_t size [3]={ image.width、image.height、1};
CheckError (clEnqueueNDRangeKernel (m_CommandQueue、kernel、2、offset、size、偏移量、 nulptr、0、nulptr、nullptr);
//准备结果图像,设置为黑色
图像结果=图像;
std::fill (result.pixel.begin ()、result.pixel.end ()、0);
#ifdef OCL_DEBUG
qDebug()<<"已提交图像以供处理";
#endif
//将结果返回到主机
std::size_t origin [3]={0};
std::size_t 区[3]={result.width、result.height、1};
clEnqueueReadImage (m_CommandQueue、outputImage、CL_true、
原点、区域、0、0、
result.pixel.data()、0、nulptr、nulptr);
#ifdef OCL_debug
qDebug ()<<"读回图像";
#endif
//保存以进行调试
SaveImage (RGBAtoRGB (结果)、"output.ppm");
#ifdef OCL_DEBUG
qDebug()<<"将图像另存为要输出的文件";
#endif
//清理
clReleaseMemObject (outputImage);
clReleaseMemObject (filterWeightsBuffer);
clReleaseMemObject (inputImage);
clReleaseKernel (内核);
clReleaseProgram (程序);
}