我正在构建一个 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 论坛上搜索了一个线程,表明这可能是由错误的驱动程序引起的,但我想要第二个意见。