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 循环永远不会终止的原因。尝试在从中提取的循环上方创建随机流。
我编写了一个 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 循环永远不会终止的原因。尝试在从中提取的循环上方创建随机流。