0

我正在构建一个 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;
}

context并且device被定义且有效,program是一个cl_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 的设备来验证这是否是我做错的事情。

我现在完全不知所措。我在 AMD 论坛上搜索了一个线程,表明这可能是由错误的驱动程序引起的,但我想要第二个意见。

4

0 回答 0