【发布时间】:2016-06-19 05:22:44
【问题描述】:
每个人。
我得到了这个内核:
__kernel void FuncionCL(__global char* in, __global char* out, __global int* S2)
{
__private int op1, op2, op3;
__private int C;
__private uint WorkDim, C2;
op1 = 1;
op2 = 2;
WorkDim = get_global_size(0);
__private int ID;
ID = get_global_id(0);
for(C = 0; C < 1000000; C++)
{
for(C2 = ID; C2 < 1000; C2 += WorkDim)
{
op3 = op1 + op2;
}
}
out[0] = 90;
out[1] = 89;
*S2 = (int) WorkDim;
}
不仅应用程序崩溃,图形控制器也崩溃。我更改常量值“16”的增量(get_global_size() 函数返回)然后代码运行正常。有什么问题?
如果我运行代码:
WorkDim = 16;
在第 8 行,而不是:
WorkDim = get_global_size(0);
代码运行速度快了 400 倍,这就是问题所在。为什么值相同?
**编辑:**好吧,现在我知道为什么了,代码这么慢而且有多种原因:
1.- 入住率。
2.- 所有线程在第一个循环中执行相同的迭代,正确的代码如下所示:
__kernel void FuncionCL(__global char* in, __global char* out, __global int* S2) { __private int op1,op2,op3; __private int C; __private uint WorkDim, C2; 操作1 = 1; op2 = 2; WorkDim = get_global_size(0); __private int ID; ID = get_global_id(0); for(C = ID; C
现在我的代码在 GPU 上的运行速度是 CPU 的 6.1 倍。
【问题讨论】:
-
它是立即崩溃还是在一段时间后(如 5 到 10 秒)崩溃?如果是后者,则是操作系统 GPU 看门狗定时器正在重置 GPU,因为内核花费的时间太长。理想情况下,您希望内核运行时间少于 50 毫秒,否则它们会开始影响系统响应能力(因为它们也用于 UI 绘制等)。
-
感谢您的回答。是的,它在 5 秒后崩溃。但问题是为什么?看起来 get_global_size(0) 返回 0 并且循环永远不会结束,但是,如果我使用常量值增量而不是 WorkDim 中的值,内核会返回 '16'(get_global_size(0) 预期值)。
标签: opencl