[Beignet] [PATCH] Fix the issue of -cl-std=CLX.X option.
Zhigang Gong
zhigang.gong at linux.intel.com
Wed Sep 10 01:36:04 PDT 2014
Pushed with modification to add the necessary predefined macro
__OPENCL_C_VERSION__.
Thanks.
On Wed, Sep 10, 2014 at 03:39:41PM +0800, junyan.he at inbox.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
>
> The -cl-std= will specify the least version to compile
> the source code providing to our API. So we need to
> check it early, and return failure if our platform's
> version can not meet the request. In the backend, we
> just ignore this cmd line option.
>
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
> backend/src/backend/program.cpp | 6 ++++-
> src/cl_program.c | 50 ++++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 54 insertions(+), 2 deletions(-)
>
> diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
> index 8c41d5e..fd0cb99 100644
> --- a/backend/src/backend/program.cpp
> +++ b/backend/src/backend/program.cpp
> @@ -664,8 +664,12 @@ namespace gbe {
> if(str.size() == 0)
> continue;
>
> - if(unsupportedOptions.find(str) != std::string::npos)
> + if(unsupportedOptions.find(str) != std::string::npos) {
> continue;
> + }
> + if(optionStr.find("-cl-std=") != std::string::npos) {
> + continue;
> + }
>
> if (uncompatiblePCHOptions.find(str) != std::string::npos)
> invalidPCH = true;
> diff --git a/src/cl_program.c b/src/cl_program.c
> index a745c00..3ecc49f 100644
> --- a/src/cl_program.c
> +++ b/src/cl_program.c
> @@ -424,6 +424,43 @@ error:
> goto exit;
> }
>
> +/* Before we do the real work, we need to check whether our platform
> + cl version can meet -cl-std= */
> +static int check_cl_version_option(cl_program p, const char* options) {
> + const char* s = NULL;
> + int ver1 = 0;
> + int ver2 = 0;
> + char version_str[64];
> +
> + if (options && (s = strstr(options, "-cl-std="))) {
> +
> + if (s + strlen("-cl-std=CLX.X") > options + strlen(options)) {
> + return 0;
> + }
> +
> + if (s[8] != 'C' || s[9] != 'L' || s[10] > '9' || s[10] < '0' || s[11] != '.'
> + || s[12] > '9' || s[12] < '0') {
> + return 0;
> + }
> +
> + ver1 = (s[10] - '0') * 10 + (s[12] - '0');
> +
> + if (cl_get_device_info(p->ctx->device, CL_DEVICE_OPENCL_C_VERSION, sizeof(version_str),
> + version_str, NULL) != CL_SUCCESS)
> + return 0;
> +
> + assert(strstr(version_str, "OpenCL") && version_str[0] == 'O');
> + ver2 = (version_str[9] - '0') * 10 + (version_str[11] - '0');
> +
> + if (ver2 < ver1)
> + return 0;
> +
> + return 1;
> + }
> +
> + return 1;
> +}
> +
> LOCAL cl_int
> cl_program_build(cl_program p, const char *options)
> {
> @@ -434,6 +471,9 @@ cl_program_build(cl_program p, const char *options)
> if (p->ref_n > 1)
> return CL_INVALID_OPERATION;
>
> + if (!check_cl_version_option(p, options))
> + return CL_BUILD_PROGRAM_FAILURE;
> +
> if (options) {
> if(p->build_opts == NULL || strcmp(options, p->build_opts) != 0) {
> if(p->build_opts) {
> @@ -526,11 +566,16 @@ cl_program_link(cl_context context,
> cl_int* errcode_ret)
> {
> cl_program p = NULL;
> - cl_int err=CL_SUCCESS;
> + cl_int err = CL_SUCCESS;
> cl_int i = 0;
> int copyed = 0;
> p = cl_program_new(context);
>
> + if (!check_cl_version_option(p, options)) {
> + err = CL_BUILD_PROGRAM_FAILURE;
> + goto error;
> + }
> +
> p->opaque = compiler_program_new_gen_program(context->device->vendor_id, NULL, NULL);
>
> for(i = 0; i < num_input_programs; i++) {
> @@ -588,6 +633,9 @@ cl_program_compile(cl_program p,
> if (p->ref_n > 1)
> return CL_INVALID_OPERATION;
>
> + if (!check_cl_version_option(p, options))
> + return CL_BUILD_PROGRAM_FAILURE;
> +
> if (options) {
> if(p->build_opts == NULL || strcmp(options, p->build_opts) != 0) {
> if(p->build_opts) {
> --
> 1.8.3.2
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list