can';t在Android JNi中创建类型为CL_DEVICE_type_的上下文

can';t在Android JNi中创建类型为CL_DEVICE_type_的上下文,android,opengl-es,opencl,Android,Opengl Es,Opencl,我正在优化我的应用程序,即使用OpenCL和OpenGL的人脸检测算法。OpenGL API用于生成读/写图像。同时,我想用多个设备(两个设备:一个是GPU,另一个是CPU)创建一个上下文,用于CPU/GPU协同处理。但我不能制造CPU设备。我期望“使用openGL的contextProperties” 在OpenGL中使用多个设备我应该怎么做 cl_context_properties contextProperties[] = { CL_GL_CONTEXT_KHR, (cl

我正在优化我的应用程序,即使用OpenCL和OpenGL的人脸检测算法。OpenGL API用于生成读/写图像。同时,我想用多个设备(两个设备:一个是GPU,另一个是CPU)创建一个上下文,用于CPU/GPU协同处理。但我不能制造CPU设备。我期望“使用openGL的contextProperties”

在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线程
  • 使用高通公司的MARE tasking runtime*,它提供CPU和GPU的集成视图,包括在单个框架内访问OpenCL
或者,您可以使用Renderscript,它可以提供CPU和GPU支持,但与OpenCL和/或MARE相比功能有限

  • 有关高通公司MARE的更多信息,请访问:

恐怕没有Android OpenCL实现支持CPU。所以你现在不能这么做。然而,我预计速度会很慢,因为移动设备复制数据的速度非常慢。我不明白为什么不能为CPU运行OpenCL。实际上,高通Adreno 320、330、420都支持GPU OpenCL。(对于420,仅在Android 5.0之后,CPU上的OpenCL才被删除。但对于Kitkat,CPU仍然受支持)感谢您的建议。:)我现在一定要检查一下。