在android上使用opencv的ocl模組遇到的問題(一)

MRQsun1314發表於2017-02-08

執行系統:一個裁剪版的android系統

使用的核函式:pyrlk.cl

由於opencl的機制的問題,在第一次執行的時候會產生*.clb檔案,我在產生lkSparse_C1_D5的kernel時出現錯誤,而之前的pyrDown_C1_D5等kernel都順利完成。

報錯資訊:"

BUILD LOG: pyrlk: -D DOUBLE_SUPPORT
<source>:676:11: error: using invalid qualifier with sampler type
sampler_t sampleri     = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
          ^
error: Compiler frontend failed (error code 58)
OpenCV Error: Gpu API call (CL_BUILD_PROGRAM_FAILURE) in _cl_program* cv::ocl::ProgramFileCache::getOrBuildProgram(const cv::ocl::Context*, const cv::ocl::ProgramEntry*, const string&), file /home/mrqsun/opencv/opencv-2.4.13/modules/ocl/src/cl_programcache.cpp, line 454

"

報錯解析:一般出現CL_BUILD_PROGRAM_FAILURE這種錯誤,是clBuildProgram失敗的意思,失敗的原因一般是存在語法錯誤,然後根據BUILD LOG的資訊,定位語法出錯的地方,然後進行修改。

opencl相關的巨集,在cl.h裡面定義的,cl.h一般在系統路徑include/CL下面。針對ocl模組,我們在列印一些狀態值除錯的時候,根據列印的巨集的值,取cl.h裡面找對應的狀態,然後確定走哪一個分支。

根據錯誤資訊定位,修改

sampler_t sampleri     = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;

const sampler_t sampleri     = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;

不再報錯。

總結:ocl模組的opencl下面是寫好的一些核函式,裡面有得可能存在語法錯誤,根據報錯與opencl的語法規則進行相應修改。

相關文章