OpenCL:内核中的预期标识符 [英] OpenCL: Expected identifier in kernel

查看:103
本文介绍了OpenCL:内核中的预期标识符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在带有Intel CPU和HD图形的Windows 7(64位)上运行以下内核.

clGetProgramBuildInfo对于以下代码,我收到非常奇怪的错误报告:

#define BLOCK_SIZE 256

__kernel void reduce4(__global uint* input, __global uint* output, __local uint* sdata) 

{
    unsigned int tid = get_local_id(0);
    unsigned int bid = get_group_id(0);
    unsigned int gid = get_global_id(0);
    unsigned int blockSize = get_local_size(0);

    unsigned int index = bid*(BLOCK_SIZE*2) + tid;
    sdata[tid] = input[index] + input[index+BLOCK_SIZE];
     barrier(CLK_LOCAL_MEM_FENCE);
    for(unsigned int s = BLOCK_SIZE/2; s > 64 ; s >>= 1) {
        // Unrolling the last wavefront and we cut 7 iterations of this
        // for-loop while we practice wavefront-programming
        if(tid < s) 
        {
            sdata[tid] += sdata[tid + s];
        }
        barrier(CLK_LOCAL_MEM_FENCE);
    }

    if (tid < 64) {
        if (blockSize >= 128) sdata[tid] += sdata[tid + 64];
        if (blockSize >=  64) sdata[tid] += sdata[tid + 32];
        if (blockSize >=  32) sdata[tid] += sdata[tid + 16];
        if (blockSize >=  16) sdata[tid] += sdata[tid +  8];
        if (blockSize >=   8) sdata[tid] += sdata[tid +  4];
        if (blockSize >=   4) sdata[tid] += sdata[tid +  2];
        if (blockSize >=   2) sdata[tid] += sdata[tid +  1];
    }
    // write result for this block to global mem
    if(tid == 0) 
     {
     output[bid] = sdata[0];
     }
}

它总是说:

Compilation started
:38:2: error: expected identifier or '('
Compilation failed

这是最后一行的内容,我已在其中输入}.这是怎么了

更新:

This is how I am reading the kernel file:

int offset = 0; 
        for(int i = 0; i < numOfDevices; ++i, ++offset ) {
            /* Load the two source files into temporary datastores */
            const char *file_names[] = {"SimpleOptimizations.cl"}; 
            const int NUMBER_OF_FILES = 1;
            char* buffer[NUMBER_OF_FILES];
            size_t sizes[NUMBER_OF_FILES];
            loadProgramSource(file_names, NUMBER_OF_FILES, buffer, sizes);

            /* Create the OpenCL program object */
            program = clCreateProgramWithSource(context, NUMBER_OF_FILES, (const char**)buffer, sizes, &error);             
            if(error != CL_SUCCESS) {
              perror("Can't create the OpenCL program object");
              exit(1);   
            }

loadProgramSource的定义

void loadProgramSource(const char** files,
                       size_t length,
                       char** buffer,
                       size_t* sizes) {
       /* Read each source file (*.cl) and store the contents into a temporary datastore */
       for(size_t i=0; i < length; i++) {
          FILE* file = fopen(files[i], "r");
          if(file == NULL) {
             perror("Couldn't read the program file");
             exit(1);   
          }
          fseek(file, 0, SEEK_END);
          sizes[i] = ftell(file);
          rewind(file); // reset the file pointer so that 'fread' reads from the front
          buffer[i] = (char*)malloc(sizes[i]+1);
          buffer[i][sizes[i]] = '\0';
          fread(buffer[i], sizeof(char), sizes[i], file);
          fclose(file);
       }
}

我认为这是Windows处理以fopen()打开的文本文件的方式的问题.如果您查看fopen() MSDN页面,表示如果您仅使用"r"作为模式字符串打开文件,则关于行尾的翻译会发生.这意味着您查询的文件大小可能与fread()读取的数据量不匹配.

要解决此问题,只需更改模式字符串以表明您希望将文件读取为二进制数据(即不进行任何讨厌的翻译):

FILE* file = fopen(files[i], "rb");

I am running the following kernel on windows 7, 64 bit, with Intel CPU and HD graphics.

I get very strange error reporting by clGetProgramBuildInfo for the following code:

#define BLOCK_SIZE 256

__kernel void reduce4(__global uint* input, __global uint* output, __local uint* sdata) 

{
    unsigned int tid = get_local_id(0);
    unsigned int bid = get_group_id(0);
    unsigned int gid = get_global_id(0);
    unsigned int blockSize = get_local_size(0);

    unsigned int index = bid*(BLOCK_SIZE*2) + tid;
    sdata[tid] = input[index] + input[index+BLOCK_SIZE];
     barrier(CLK_LOCAL_MEM_FENCE);
    for(unsigned int s = BLOCK_SIZE/2; s > 64 ; s >>= 1) {
        // Unrolling the last wavefront and we cut 7 iterations of this
        // for-loop while we practice wavefront-programming
        if(tid < s) 
        {
            sdata[tid] += sdata[tid + s];
        }
        barrier(CLK_LOCAL_MEM_FENCE);
    }

    if (tid < 64) {
        if (blockSize >= 128) sdata[tid] += sdata[tid + 64];
        if (blockSize >=  64) sdata[tid] += sdata[tid + 32];
        if (blockSize >=  32) sdata[tid] += sdata[tid + 16];
        if (blockSize >=  16) sdata[tid] += sdata[tid +  8];
        if (blockSize >=   8) sdata[tid] += sdata[tid +  4];
        if (blockSize >=   4) sdata[tid] += sdata[tid +  2];
        if (blockSize >=   2) sdata[tid] += sdata[tid +  1];
    }
    // write result for this block to global mem
    if(tid == 0) 
     {
     output[bid] = sdata[0];
     }
}

It always says:

Compilation started
:38:2: error: expected identifier or '('
Compilation failed

this is for the last line, where I have put }. What is wrong here?

Update:

This is how I am reading the kernel file:

int offset = 0; 
        for(int i = 0; i < numOfDevices; ++i, ++offset ) {
            /* Load the two source files into temporary datastores */
            const char *file_names[] = {"SimpleOptimizations.cl"}; 
            const int NUMBER_OF_FILES = 1;
            char* buffer[NUMBER_OF_FILES];
            size_t sizes[NUMBER_OF_FILES];
            loadProgramSource(file_names, NUMBER_OF_FILES, buffer, sizes);

            /* Create the OpenCL program object */
            program = clCreateProgramWithSource(context, NUMBER_OF_FILES, (const char**)buffer, sizes, &error);             
            if(error != CL_SUCCESS) {
              perror("Can't create the OpenCL program object");
              exit(1);   
            }

Definition of loadProgramSource

void loadProgramSource(const char** files,
                       size_t length,
                       char** buffer,
                       size_t* sizes) {
       /* Read each source file (*.cl) and store the contents into a temporary datastore */
       for(size_t i=0; i < length; i++) {
          FILE* file = fopen(files[i], "r");
          if(file == NULL) {
             perror("Couldn't read the program file");
             exit(1);   
          }
          fseek(file, 0, SEEK_END);
          sizes[i] = ftell(file);
          rewind(file); // reset the file pointer so that 'fread' reads from the front
          buffer[i] = (char*)malloc(sizes[i]+1);
          buffer[i][sizes[i]] = '\0';
          fread(buffer[i], sizeof(char), sizes[i], file);
          fclose(file);
       }
}

解决方案

I believe this is an issue with the way the Windows deals with text files opened with fopen(). If you take a look at the MSDN page for fopen(), it indicates that if you open a file with just "r" as the mode string, some translations will happen with regards to line-endings. This means that the size of the file you query may not match the amount of data read by fread().

To solve this, simply change the mode string to indicate that you wish to read the file as binary data (i.e. without any pesky translations):

FILE* file = fopen(files[i], "rb");

这篇关于OpenCL:内核中的预期标识符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆