OpenCL - 文件末尾的<eof>解析器</eof>

时间:2013-10-14 08:43:00

标签: c++ opencl nvidia

我正在构建一个OpenCL扩充应用程序。当我最初使用ViennaCL时,我发现在编译内部内核时,我最终会得到以下内容:

Stack dump:
0.      <eof> parser at end of file

我很快就责怪ViennaCL失败了,所以我很快就把几个OpenCL辅助函数拼凑在一起并试图编译一个非常简单的向量加法内核。

该计划的步骤如下:

  • 创建一个平台
  • 选择设备
  • 创建上下文
  • 创建队列
  • 将一些数据推送到设备
  • 编译内核
  • 将内核入队
  • 等待内核完成
  • 回读数据

在评论完大部分之后,我留下了强制设置和编译内核的命令。但结果仍然是相同的:

Stack dump:
0.      <eof> parser at end of file

这是违规行为:

void createProgram(std::string progstr)
{
    const char ** conv = new const char*[1];
    conv[0] = progstr.c_str();

    cl_int error = 0;
    program = clCreateProgramWithSource(context, 1, conv, NULL, &error);
    if (error != CL_SUCCESS) {
        cout << "Error creating command queue: " << oclErrorString(error) << endl;
        exit(error);
    }

    error = clBuildProgram(program, 1, &device, NULL, NULL, NULL);

    if (error != CL_SUCCESS) {
        cout << "Error creating command queue: " << oclErrorString(error) << endl;
        exit(error);
    }

    char* build_log;
    size_t log_size;

    clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
    build_log = new char[log_size+1];

    clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, log_size, build_log, NULL);
    build_log[log_size] = '\0';
    cout << build_log << endl;
    delete[] build_log;
}

contextdevice已定义且有效,programcl_program

我目前正在使用股票向量添加内核进行测试:

__kernel void vector_add_gpu (__global const float* src_a, __global const float* src_b, __global float* res, const int num)
{
    const int idx = get_global_id(0);

    if (idx < num)
       res[idx] = src_a[idx] + src_b[idx];
}

我无权访问另一个支持OpenCL的设备来验证这是否是我做错了。

我现在完全失去了。我在谷歌论坛上搜索了一个线程,暗示这可能是由坏司机引起的,但我想要第二个意见。

0 个答案:

没有答案