我的CL计划:
constant double LATTICEWEIGHTS[19] = { 1.0 / 36.0,
.....
1.0 / 36.0 };
void
computeFeq(
double density,
double3 velocity,
double* feq) {
for (int i = 0; i < 19; ++i) {
feq[i] = LATTICEWEIGHTS[i]; // Line 1
//feq[i] = 2.0 * LATTICEWEIGHTS[i]; // Line 2
}
}
__kernel void
Kernel(){
.....
double density;
double3 velocity;
double feq[19];
computeFeq(density, velocity, feq);
}
此代码有效。 但如果我评论第1行并取消注释第2行,则会立即发生CL_OUT_OF_RESOURCES。
有什么想法吗?
我用NVIDIA GTX 670M测试它。
答案 0 :(得分:5)
这似乎不对,但有些事要先检查一下:注册用法。 Nvidia GPU支持详细输出选项。将其传递给clBuildProgram,然后检查构建日志。像这样:
clBuildProgram(program, 1, &device_id, "-cl-nv-verbose", NULL, NULL);
这是在cl_nv_compiler_options扩展名下记录的。在CUDA文档中查找设备的最大寄存器数。可能发生的情况是,一个工作项块所需的寄存器总数超过单个SM / SMX中可用的寄存器总数,从而导致错误。
如果寄存器使用不是问题,那么它可能是某个地方的超出内存访问。我没有错误消息没有暗示这一点,但我之前遇到过这样的错误。这样的错误可能在任何地方都很难找到。