无法在 Android JNi 中创建类型为 CL_DEVICE_TYPE_ALL 的上下文

can't make the context whose type is CL_DEVICE_TYPE_ALL in Android JNi

我正在优化我的应用程序,即使用 OpenCL 的 FaceDetection 算法 & OpenGL.OpenGL API 用于制作 read/write 图像。同时,我想用多个设备(2 个设备:一个是 GPU,另一个是 CPU)创建 1 个上下文,以进行 CPU/GPU 协同处理。但我无法制作 CPU 设备。我预计 'contextProperties for using openGL'。

在 OpenGL 中使用多设备我应该怎么做?

cl_context_properties contextProperties[] = {
        CL_GL_CONTEXT_KHR, (cl_context_properties) eglGetCurrentContext(),
        CL_EGL_DISPLAY_KHR, (cl_context_properties) eglGetCurrentDisplay(),
        CL_CONTEXT_PLATFORM, (cl_context_properties) firstPlatformId,
        0 };                               // If  CL_DEVICE_TYPE_ALL is set, program can't execution. 
context = clCreateContextFromType(contextProperties, CL_DEVICE_TYPE_GPU,
        NULL, NULL, &errNum);//creating a context for a GPU device,

if (errNum != CL_SUCCESS) {
    LOGE("[LYW]Could not create GPU context, trying CPU...");
    context = clCreateContextFromType(contextProperties,
            CL_DEVICE_TYPE_CPU, NULL, NULL, &errNum); //creating a context for a CPU device
    if (errNum != CL_SUCCESS) {
        LOGE("[LYW] Failed to create an OpenCL GPU or CPU context.");
        return NULL;
    }
}

如上所述,Android 上的任何特定供应商都不支持 OpenCL CPU 设备。因此,如果您的 Android 设备在 GPU 上支持 OpenCL,您可以使用以下选项之一来集成 CPU:

  • 使用一个简单的线程池来管理CPU个线程
  • 使用 Qualcomm 的 MARE 任务运行时*,它提供 CPU 和 GPU 的集成视图,包括在单个框架内访问 OpenCL。

或者您可以使用 Renderscript,它可以提供 CPU 和 GPU 支持,但与 OpenCL and/or MARE 相比功能有限。