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;
}
}
}
}
如果你不能在调试器中运行它,我建议你创建一个调试版本,在这个版本中你可以传递一个整数来达到最大迭代次数,比如说你希望的最坏情况的两倍。然后调试版本将返回所有被测试的采样值和曝光值,但未能输入真实的块。 – jeff6times7
我同意,设置上限对于调试这是一个好主意。被拒绝的数字上的'printf()'也可能不是一个坏主意。我怀疑你可能有一个错误导致*所有*生成的数字被拒绝。 – pmdj
您正在重复创建随机流;也许它总是创建相同的输出,这就是为什么你的while循环永远不会终止。尝试在你的循环上面创建随机数据流。 – Dithermaster