meta-freescale icon indicating copy to clipboard operation
meta-freescale copied to clipboard

OpenCV support with OpenCL on imx8mp

Open meetgandhi-dev opened this issue 7 months ago • 3 comments

Hi,

I'm trying to enable OpenCL support in OpenCV. I'm on hardknott branch.

With reference to this discussion #320 , I have added below parameters in my local.conf file:

PACKAGECONFIG_append_pn-opencv = " opencl"
PREFERRED_PROVIDER_opencl-headers_imxgpu     = "imx-gpu-viv"

I have build the opencv package. As per the yocto's log.do_configure the support for OpenCL is enabled:

--   OpenCL:                        YES (no extra features)
--     Include path:                /home/test/imx8mp-sr/imx-yocto/build-xwayland-imx8mpsolidrun/tmp/work/cortexa53-crypto-mx8mp-poky-linux/opencv/4.5.2.imx-r0/git/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
--

I have verified the same from the opencv2/cvconfig.h file as well:

/* OpenCL Support */
#define HAVE_OPENCL
/* #undef HAVE_OPENCL_STATIC */
/* #undef HAVE_OPENCL_SVM */

But when I try to check the OpenCV in the generated image, it says OpenCL is disabled. Below is the output of opencv_version --opencl command:

4.5.2
OpenCL is disabled

I have also tried below code snippet:

#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
#include <opencv2/cvconfig.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/ocl.hpp>

using namespace std;

int main()
{
    cv::ocl::setUseOpenCL(true);
    if (!cv::ocl::haveOpenCL())
    {
        cout << "OpenCL is not avaiable..." << endl;
    }
    cv::ocl::Context context;
    if (!context.create(cv::ocl::Device::TYPE_ALL))
    {
        cout << "Failed creating the context..." << endl;
    }

    // In OpenCV 3.0.0 beta, only a single device is detected.
    cout << context.ndevices() << " GPU devices are detected." << endl;
    for (int i = 0; i < context.ndevices(); i++)
    {
        cv::ocl::Device device = context.device(i);
        cout << "name                 : " << device.name() << endl;
        cout << "available            : " << device.available() << endl;
        cout << "imageSupport         : " << device.imageSupport() << endl;
        cout << "OpenCL_C_Version     : " << device.OpenCL_C_Version() << endl;
        cout << endl;
    }
    return 0;
}

I got below output:

OpenCL is not avaiable...
Failed creating the context...
0 GPU devices are detected.

I tried using the OpenCL SDK directly. Using that my test application was able to detect the GPUs:

#include <iostream>
#include <string>
#include <vector>

#include <CL/opencl.hpp>

static cl_int PrintPlatformInfoSummary(cl::Platform platform)
{
    std::cout << "\tName:           " << platform.getInfo<CL_PLATFORM_NAME>()
              << "\n";
    std::cout << "\tVendor:         " << platform.getInfo<CL_PLATFORM_VENDOR>()
              << "\n";
    std::cout << "\tDriver Version: " << platform.getInfo<CL_PLATFORM_VERSION>()
              << "\n";

    return CL_SUCCESS;
}

static void PrintDeviceType(const std::string& label, cl_device_type type)
{
    std::cout << label << ((type & CL_DEVICE_TYPE_DEFAULT) ? "DEFAULT " : "")
              << ((type & CL_DEVICE_TYPE_CPU) ? "CPU " : "")
              << ((type & CL_DEVICE_TYPE_GPU) ? "GPU " : "")
              << ((type & CL_DEVICE_TYPE_ACCELERATOR) ? "ACCELERATOR " : "")
              << ((type & CL_DEVICE_TYPE_CUSTOM) ? "CUSTOM " : "") << "\n";
}

static cl_int PrintDeviceInfoSummary(const std::vector<cl::Device> devices)
{
    for (size_t i = 0; i < devices.size(); i++)
    {
        std::cout << "Device[" << i << "]:\n";

        cl_device_type deviceType = devices[i].getInfo<CL_DEVICE_TYPE>();
        PrintDeviceType("\tType:           ", deviceType);

        std::cout << "\tName:           "
                  << devices[i].getInfo<CL_DEVICE_NAME>() << "\n";
        std::cout << "\tVendor:         "
                  << devices[i].getInfo<CL_DEVICE_VENDOR>() << "\n";
        std::cout << "\tDevice Version: "
                  << devices[i].getInfo<CL_DEVICE_VERSION>() << "\n";
        std::cout << "\tDevice Profile: "
                  << devices[i].getInfo<CL_DEVICE_PROFILE>() << "\n";
        std::cout << "\tDriver Version: "
                  << devices[i].getInfo<CL_DRIVER_VERSION>() << "\n";
    }

    return CL_SUCCESS;
}

int main(int, char**)
{
    std::vector<cl::Platform> platforms;
    cl::Platform::get(&platforms);
    std::cout << "Enumerated " << platforms.size() << " platforms.\n\n";

    for (size_t i = 0; i < platforms.size(); i++)
    {
        std::cout << "Platform[" << i << "]:\n";
        PrintPlatformInfoSummary(platforms[i]);

        std::vector<cl::Device> devices;
        platforms[i].getDevices(CL_DEVICE_TYPE_ALL, &devices);

        PrintDeviceInfoSummary(devices);
        std::cout << "\n";
    }

    std::cout << "Done.\n";

    return 0;
}

The output is shown below:

Enumerated 1 platforms.

Platform[0]:
	Name:           Vivante OpenCL Platform
	Vendor:         Vivante Corporation
	Driver Version: OpenCL 3.0 V6.4.3.p2.336687
Device[0]:
	Type:           GPU 
	Name:           Vivante OpenCL Device GC7000UL.6204.0000
	Vendor:         Vivante Corporation
	Device Version: OpenCL 3.0 
	Device Profile: FULL_PROFILE
	Driver Version: OpenCL 3.0 V6.4.3.p2.336687
Device[1]:
	Type:           GPU 
	Name:           Vivante OpenCL Device VIP8000Nano-S+I.8002.0000
	Vendor:         Vivante Corporation
	Device Version: OpenCL 3.0 
	Device Profile: FULL_PROFILE
	Driver Version: OpenCL 3.0 V6.4.3.p2.336687
Done

Am I missing something here, when building the OpenCV with OpenCL? Let me know if you need any additional information.

meetgandhi-dev avatar Jul 29 '24 12:07 meetgandhi-dev