OpenCL 内核中有问题的 while 循环:执行挂起

Problematic while loop in OpenCL kernel: Execution hangs

我编写了一个 OpenCL 内核,它在设备的 while 循环内生成随机数。一旦获得可接受的随机数,内核应退出循环并将结果返回给主机。通常, 每个工作项的迭代次数约为 100-1000。

问题是当我启用 while 循环时此代码挂起并且从未 returns 结果。如果我只是禁用 while 循环——即只生成一个随机数而不是 100 个——内核工作正常。

有人知道会发生什么吗?内核代码在下面,也可以在 github repo. One possibility is that the system (MacOS in my case) prevents the GPU from taking a long time executing a task as described here 找到,但我不确定。

#include <clRNG/mrg31k3p.clh> // for random number generation

#include "exposure.clh" // defines function exposure

__kernel void cr(__global clrngMrg31k3pHostStream* streams, __global float* xa, __global float* ya, const int n) {
    int i = get_global_id(0);
    float x,y,sampling;

    if (i<n) {
        // Loop that produces individual CRs
        while (1) {
            clrngMrg31k3pStream private_stream_d;   // This is not a pointer!
            clrngMrg31k3pCopyOverStreamsFromGlobal(1, &private_stream_d, &streams[i]);

            // random number between 0 and 360 
            x=360.*clrngMrg31k3pRandomU01(&private_stream_d);
            // random number between 0 and 1
            y=clrngMrg31k3pRandomU01(&private_stream_d);

            // To avoid concentrations towards the poles, generates sin(delta)
            // between -1 and +1, then converts to delta
            y = asin((float)(2.*y-1.))*180./M_PI_F; // dec

            // If sampling<exposure for a given CR, it is accepted
            sampling=clrngMrg31k3pRandomU01(&private_stream_d);

            if (sampling <= exposure(y)) {
                xa[i]=x;
                ya[i]=y;
                break;
            }

        } 
    } 
}

您正在一遍又一遍地重新创建随机流;也许它总是创建相同的输出,这就是为什么你的 while 循环永远不会终止的原因。尝试在从中提取的循环上方创建随机流。