get_global_size(0)使控制器崩溃

时间:2016-06-19 05:22:45

标签: opencl

大家。

我有这个内核:

__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倍。

1 个答案:

答案 0 :(得分:0)

每件物品都在做1000000 * 1000 = 1Gop。太多了,需要太长时间才能做到这一点,驱动程序重新启动GPU。 (我猜你的例子中全局大小是1)

使用如此少的工作项运行CL内核完全浪费资源,这将使GPU几乎进行串行计算并花费太长时间。

新GPU中至少需要1024个全局项才能充分利用其资源。

编辑:循环可能由编译器在具有静态值时进行优化。因此,给予一个惊人的&#34;加速。