大家。
我有这个内核:
__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'的for增量(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; op1 = 1; op2 = 2; WorkDim = get_global_size(0); __private int ID; ID = get_global_id(0); for(C = ID; C <1000000; C + = WorkDim) { for(C2 = ID; C2 <1000; C2 + = WorkDim) { op3 = op1 + op2; } } out [0] = 90; out [1] = 89; * S2 =(int)WorkDim; }
现在我的代码在GPU上运行速度比CPU快6.1倍。
答案 0 :(得分:0)
每件物品都在做1000000 * 1000 = 1Gop。太多了,需要太长时间才能做到这一点,驱动程序重新启动GPU。 (我猜你的例子中全局大小是1)
使用如此少的工作项运行CL内核完全浪费资源,这将使GPU几乎进行串行计算并花费太长时间。
新GPU中至少需要1024个全局项才能充分利用其资源。
编辑:循环可能由编译器在具有静态值时进行优化。因此,给予一个惊人的&#34;加速。