我正在构建一个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的设备来验证这是否是我做错了。
我现在完全失去了。我在谷歌论坛上搜索了一个线程,暗示这可能是由坏司机引起的,但我想要第二个意见。