get_global_size(0) 使控制器崩溃

get_global_size(0) crashes the controller

大家。

我得到了这个内核:

__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;
}

它不仅使应用程序崩溃,还使图形控制器崩溃。我将 for 增量更改为常量值“16”(get_global_size() 函数 returns),然后代码 运行 没问题。有什么问题?

如果我 运行 代码为:

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 整数 ID; ID = get_global_id(0); 对于(C = ID;C < 1000000;C += WorkDim) { 对于(C2 = ID;C2 < 1000;C2 += WorkDim) { op3 = op1 + op2; } } 输出 [0] = 90; 输出 [1] = 89; *S2 = (int) WorkDim; }

现在我的代码 运行 在 GPU 上比 CPU 快 6.1 倍。

那里的每个项目都在做 1000000*1000 = 1Gop。太多了,这样做需要太长时间,驱动程序会重新启动 GPU。 (我猜你的例子中的全局大小是 1)

运行一个 CL 内核的工作项太少,这完全是一种资源浪费,它会使 GPU 进行几乎串行的计算,并且花费的时间太长。

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

编辑:当循环具有静态值时,编译器可能对其进行了优化。因此给予 "amazing" 加速。