[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