RK3588开发板 openCV调用openCL运行时失败,Status -11: CL_BUILD_PROGRAM_FAILURE...

固件类型:官方提供的固件
固件文件名称:rk3588_linux_release_20220812_v1.0.1b
固件下载地址:Firefly | 让科技更简单,让生活更智能
Log日志:opencl-error-log.txt

本帖最后由 Williamboy 于 2022-9-26 11:06 编辑

RK3588S 开发板,Ubuntu 20.04.5 LTS, 系统信息

<div>$ cat /proc/version
</div><div>Linux version 5.10.66 (daijh@8d391e97ab54) (kernel commit id: fa94ece7080f) (sdk version: rk3588_linux_release_20220812_v1.0.1b) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621, GNU ld (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 2.36.1.20210621) #155 SMP Fri Aug 12 10:03:43 CST 2022</div>

OpenCV4.6
OpenCL 安装/设备/驱动正常OpenCL2.1

<div>$clinfo
Number of platforms                               1
  Platform Name                                   ARM Platform
  Platform Vendor                                 ARM
  Platform Version                                OpenCL 2.1 v1.g6p0-01eac0.efb75e2978d783a80fe78be1bfb0efc1
  Platform Profile                                FULL_PROFILE
  Platform Extensions                  ...</div><div>.......</div>

OpenCV调用OpenCL C++测试代码如下:

void calcEdgesGPU()
{
    std::cout << "****** Use GPU imag processing ******"  << std::endl;

    cv::ocl::setUseOpenCL(true);

    bool ret1 = cv::ocl::haveOpenCL();
    bool ret2 = cv::ocl::useOpenCL();
    std::cout << "haveOpenCL:" << ret1 << std::endl;
    std::cout << "useOpenCL:" << ret2 << std::endl;

    double start = cv::getTickCount();
    cv::UMat gpuFrame, gpuGray, gpuBlur, gpuEdges;
    cv::Mat cpuFrame = cv::imread(IMAGE_PATHNAME);
    cpuFrame.copyTo(gpuFrame); //Mat与UMat相互转换

    cvtColor(gpuFrame, gpuGray, cv::COLOR_BGR2GRAY);
    cv::GaussianBlur(gpuGray, gpuBlur, cv::Size(3, 3), 15, 15);
    cv::Canny(gpuBlur, gpuEdges, 50, 100, 3);
    std::vector<cv::Vec3f> cir;
    cv::HoughCircles(gpuBlur, cir, cv::HOUGH_GRADIENT_ALT, 1.5, 15, 300, 0.8, 1, 100);

    std::cout << "GPU cost time:(s)" << ((cv::getTickCount() - start) / cv::getTickFrequency()) << std::endl;

    cv::Mat matResult = gpuEdges.getMat(cv::ACCESS_READ); //Mat与UMat相互转换
    cv::namedWindow("Canny Edges GPU1", cv::WINDOW_NORMAL);
    cv::imshow("Canny Edges GPU1", matResult);

    cv::namedWindow("Canny Edges GPU2", cv::WINDOW_NORMAL);
    cv::imshow("Canny Edges GPU2", gpuEdges);
}

编译正常,运行报错:
Status -11: CL_BUILD_PROGRAM_FAILURE

****** Use GPU imag processing ******
haveOpenCL:1
useOpenCL:1
OpenCL program build log: imgproc/color_rgb
<u>Status -11: CL_BUILD_PROGRAM_FAILURE</u>
-D depth=0 -D scn=3 -D PIX_PER_WI_Y=1 -D dcn=1 -D bidx=0 -D STRIPE_SIZE=1
<built-in>:167:9: error: expected member name or ';' after declaration specifiers
int32_t depth;             /**< The image depth. */
~~~~~~~ ^
<built-in>:1:15: note: expanded from here
#define depth 0
              ^

<built-in>:167:8: error: expected ';' at end of declaration list
int32_t depth;             /**< The image depth. */
       ^

error: Compiler frontend failed (error code 62)

GPU cost time:(s)0.350019

请问RK3588的GPU支持OPENCL吗?有人有同样的问题吗?
求救!
求救!!
求救!!!

SOS!
SOS!!
SOS!!!

tchip_askquestions
opencl-error-log.txt (640 Bytes)

这个文件就编译没通过。。。

OpenCL program build log: imgproc/color_rgb
Status -11: CL_BUILD_PROGRAM_FAILURE

Williamboy 发表于 2022-9-27 10:58
这个文件就编译没通过。。。

OpenCL program build log: imgproc/color_rgb

请问rk3588可以使用opencl吗

一模一样的问题,解决了吗?跪求解决方案

opencv是怎么编译的

我也是同样的问题, 有人能给出一个解决方案或者思路嘛

如果你是想用ocl加速remap,修改/modules/imgproc/src/imgwarp.cpp文件里的ocl_remap函数
1:把函数里的int depth变量换个名字,比如s_depth, 把这个函数里用到的depth都换成s_depth
2:还是在这个函数里找到buildOptions,都换成s_depth,包括字符串参数
buildOptions += format(" -D T=%s -D T1=%s -D cn=%d -D ST=%s -D s_depth=%d",
ocl::typeToStr(type), ocl::typeToStr(s_depth),
cn, ocl::typeToStr(sctype), s_depth);
我这里gpu使用成功,cpu负载很低
cat /sys/class/devfreq/fb000000.gpu/load
23@500000000Hz