2017-07-14 46 views
0

我写了一个OpenCL内核,它在设备的while循环内部生成随机数。一旦获得可接受的随机数,内核应退出循环并将结果返回给主机。通常,每个工作项目的迭代次数为〜100-1000。在OpenCL内核循环中存在问题:执行挂起

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

任何人对可能发生什么都有任何想法?内核代码如下,也可在此github repo处获得。一种可能性是系统(我的情况下是MacOS)阻止GPU花费很长时间执行任务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; 
      } 

     } 
    } 
} 
+2

如果你不能在调试器中运行它,我建议你创建一个调试版本,在这个版本中你可以传递一个整数来达到最大迭代次数,比如说你希望的最坏情况的两倍。然后调试版本将返回所有被测试的采样值和曝光值,但未能输入真实的块。 – jeff6times7

+0

我同意,设置上限对于调试这是一个好主意。被拒绝的数字上的'printf()'也可能不是一个坏主意。我怀疑你可能有一个错误导致*所有*生成的数字被拒绝。 – pmdj

+2

您正在重复创建随机流;也许它总是创建相同的输出,这就是为什么你的while循环永远不会终止。尝试在你的循环上面创建随机数据流。 – Dithermaster

回答

1

您正在重复创建随机流;也许它总是创建相同的输出,这就是为什么你的while循环永远不会终止。尝试在你的循环上面创建随机数据流。