[FFmpeg-devel] [PATCH 5/5] libavutil: add user specfic device type

Wei Gao highgod0401 at gmail.com
Fri Apr 5 04:34:13 CEST 2013


2013/4/5 Stefano Sabatini <stefasab at gmail.com>

> On date Thursday 2013-04-04 20:34:52 +0800, Wei Gao encoded:
> >
>
> > From b9d6433b9ad5f9dc2e8688f42227eca1a58e5fcb Mon Sep 17 00:00:00 2001
> > From: highgod0401 <highgod0401 at gmail.com>
> > Date: Thu, 4 Apr 2013 20:25:29 +0800
> > Subject: [PATCH 5/5] add user specfic device type
>
> typo, also missing topic, e.g.:
> lavu/opencl: add user specified device type
>
> >
> > ---
> >  libavutil/opencl.c | 80
> +++++++++++++++++++++++++++++++-----------------------
> >  libavutil/opencl.h |  4 +--
> >  2 files changed, 48 insertions(+), 36 deletions(-)
> >
> > diff --git a/libavutil/opencl.c b/libavutil/opencl.c
> > index 9876a42..4c0b56f 100644
> > --- a/libavutil/opencl.c
> > +++ b/libavutil/opencl.c
> > @@ -45,6 +45,7 @@ static pthread_mutex_t atomic_opencl_lock =
> PTHREAD_MUTEX_INITIALIZER;
> >  typedef struct {
> >      int dev_idx;
> >      int platform_idx;
>
> > +    int dev_type_idx;
>
> device_type?
>
index of device type in  _device_type device_type[]

>
> >  } UserSpecDevInfo;
> >
> >  typedef struct {
> > @@ -91,6 +92,9 @@ static OpenclUtils openclutils = {&openclutils_class};
> >
> >  static GPUEnv gpu_env;
> >
> > +static const cl_device_type device_type[] = {CL_DEVICE_TYPE_GPU,
> CL_DEVICE_TYPE_CPU, CL_DEVICE_TYPE_DEFAULT};
> > +
> > +
> >  typedef struct {
> >      int err_code;
> >      const char *err_str;
> > @@ -249,7 +253,6 @@ end:
> >      return ret;
> >  }
> >
> > -
> >  void av_opencl_release_kernel(AVOpenCLKernelEnv *env)
> >  {
> >      cl_int status;
> > @@ -277,8 +280,7 @@ static int init_opencl_env(GPUEnv *gpu_env,
> AVOpenCLExternalEnv *ext_opencl_env)
> >      cl_platform_id *platform_ids = NULL;
> >      cl_context_properties cps[3];
> >      char platform_name[100];
> > -    int i, ret = 0;
> > -    cl_device_type device_type[] = {CL_DEVICE_TYPE_GPU,
> CL_DEVICE_TYPE_CPU, CL_DEVICE_TYPE_DEFAULT};
> > +    int i, j, ret = 0;
> >      if (ext_opencl_env) {
> >          if (gpu_env->is_user_created)
> >              return 0;
> > @@ -329,22 +331,21 @@ static int init_opencl_env(GPUEnv *gpu_env,
> AVOpenCLExternalEnv *ext_opencl_env)
> >                          goto end;
> >                      }
> >                      gpu_env->platform_id = platform_ids[i];
> > -                    status = clGetDeviceIDs(gpu_env->platform_id,
> CL_DEVICE_TYPE_GPU,
> > -                                            0, NULL, &num_devices);
> > -                    if (status != CL_SUCCESS) {
> > -                        av_log(&openclutils, AV_LOG_ERROR, "Could not
> get OpenCL device number:%s\n", opencl_errstr(status));
> > -                        ret = AVERROR_EXTERNAL;
> > -                        goto end;
> > -                    }
> > -                    if (num_devices == 0) {
> > -                        //find CPU device
> > -                        status = clGetDeviceIDs(gpu_env->platform_id,
> CL_DEVICE_TYPE_CPU,
> > -                                             0, NULL, &num_devices);
>
> > +                    j = 0;
> > +                    if (gpu_env->usr_spec_dev_info.dev_type_idx >= 0) {
> > +                        j = gpu_env->usr_spec_dev_info.dev_type_idx;
> >                      }
> > -                    if (status != CL_SUCCESS) {
> > -                        av_log(&openclutils, AV_LOG_ERROR, "Could not
> get OpenCL device ids: %s\n", opencl_errstr(status));
> > -                        ret = AVERROR(EINVAL);
> > -                        goto end;
>
> > +                    while (j <
> sizeof(device_type)/sizeof(cl_device_type)) {
>
>
>     for (j = 0; j < FF_ARRAY_ELEMS(device_type); j++)
>


>
> > +                        status = clGetDeviceIDs(gpu_env->platform_id,
> device_type[j],
> > +                                            0, NULL, &num_devices);
>
> weird indent
>
> > +                        if (status == CL_SUCCESS) {
> > +                            gpu_env->device_type = device_type[j];
> > +                            break;
> > +                        }
> > +                        if (gpu_env->usr_spec_dev_info.dev_type_idx >=
> 0) {
> > +                            break; // find using other platforms
> > +                        }
> > +                        j++;
> >                      }
> >                      if (num_devices)
> >                         break;
> > @@ -353,8 +354,14 @@ static int init_opencl_env(GPUEnv *gpu_env,
> AVOpenCLExternalEnv *ext_opencl_env)
> >                          ret = AVERROR_EXTERNAL;
> >                          goto end;
> >                      }
> > +                    if (i >= num_platforms - 1) {
> > +                        if (status != CL_SUCCESS) {
> > +                            av_log(&openclutils, AV_LOG_ERROR, "Could
> not get OpenCL device ids: %s\n", opencl_errstr(status));
> > +                            ret = AVERROR(EINVAL);
> > +                            goto end;
> > +                        }
> > +                    }
> >                      i++;
> > -
> >                  }
> >              }
> >              if (!gpu_env->platform_id) {
> > @@ -379,22 +386,11 @@ static int init_opencl_env(GPUEnv *gpu_env,
> AVOpenCLExternalEnv *ext_opencl_env)
> >              cps[2] = 0;
> >
> >              /* Check for GPU. */
> > -            for (i = 0; i < sizeof(device_type); i++) {
> > -                gpu_env->device_type = device_type[i];
> > -                gpu_env->context     = clCreateContextFromType(cps,
> gpu_env->device_type,
> > -                                                               NULL,
> NULL, &status);
> > -                if (status != CL_SUCCESS) {
> > -                    av_log(&openclutils, AV_LOG_ERROR,
> > -                           "Could not get OpenCL context from device
> type: %s\n", opencl_errstr(status));
> > -                    ret = AVERROR_EXTERNAL;
> > -                    goto end;
> > -                }
> > -                if (gpu_env->context)
> > -                    break;
> > -            }
> > -            if (!gpu_env->context) {
> > +            gpu_env->context     = clCreateContextFromType(cps,
> gpu_env->device_type,
> > +                                                           NULL, NULL,
> &status);
> > +            if (status != CL_SUCCESS) {
> >                  av_log(&openclutils, AV_LOG_ERROR,
> > -                       "Could not get OpenCL context from device
> type\n");
> > +                       "Could not get OpenCL context from device type:
> %s\n", opencl_errstr(status));
> >                  ret = AVERROR_EXTERNAL;
> >                  goto end;
> >              }
>
> > @@ -519,14 +515,17 @@ int av_opencl_init(AVDictionary *options,
> AVOpenCLExternalEnv *ext_opencl_env)
> >      AVDictionaryEntry *opt_build_entry;
> >      AVDictionaryEntry *opt_platform_entry;
> >      AVDictionaryEntry *opt_device_entry;
> > +    AVDictionaryEntry *opt_device_type_entry;
> >      char *pos;
> >      LOCK_OPENCL
> >      if (!gpu_env.init_count) {
> >          opt_platform_entry = av_dict_get(options, "platform_idx", NULL,
> 0);
> >          opt_device_entry   = av_dict_get(options, "device_idx", NULL,
> 0);
> > +        opt_device_type_entry = av_dict_get(options, "device_type",
> NULL, 0);
> >          /* initialize devices, context, command_queue */
> >          gpu_env.usr_spec_dev_info.platform_idx = -1;
> >          gpu_env.usr_spec_dev_info.dev_idx = -1;
> > +        gpu_env.usr_spec_dev_info.dev_type_idx = -1;
> >          if (opt_platform_entry) {
> >              gpu_env.usr_spec_dev_info.platform_idx =
> strtol(opt_platform_entry->value, &pos, 10);
> >              if (pos == opt_platform_entry->value) {
> > @@ -543,6 +542,19 @@ int av_opencl_init(AVDictionary *options,
> AVOpenCLExternalEnv *ext_opencl_env)
> >                  goto end;
> >              }
> >          }
> > +        if (opt_device_type_entry) {
> > +            if (!av_strcasecmp(opt_device_type_entry->value, "GPU")) {
> > +                gpu_env.usr_spec_dev_info.dev_type_idx = 0;
> > +            } else if (!av_strcasecmp(opt_device_type_entry->value,
> "CPU")) {
> > +                gpu_env.usr_spec_dev_info.dev_type_idx = 1;
> > +            } else if (!av_strcasecmp(opt_device_type_entry->value,
> "default")) {
> > +                gpu_env.usr_spec_dev_info.dev_type_idx = 2;
> > +            } else {
> > +                av_log(&openclutils, AV_LOG_ERROR, "Device type should
> be CPU or GPU or default\n");
> > +                ret = AVERROR(EINVAL);
> > +                goto end;
> > +            }
> > +        }
>
> We should use an option context and avoid manual parsing.
>
is there and code I can reference?

>
> [...]
> --
> FFmpeg = Fostering and Frightening Minimalistic Philosophical Extended
> Gnome
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list