Random OpenCL内核上的drand48

Random OpenCL内核上的drand48,random,opencl,opencl-c,Random,Opencl,Opencl C,是否有人拥有drand48()或同等版本的实现,可以在OpenCL内核中工作 我一直在通过缓冲区发送主机上生成的随机数,但如果有办法,我需要在设备上生成随机数。这里有一个OpenCL设备函数,您可以从OpenCL内核调用它: uint rng\u next(\u全局ulong*状态,uint索引){ /*假设32位*/ uint位=32; /*获取当前状态*/ ulong状态=状态[索引]; /*更新状态*/ 状态=(状态*0x5DEECE66DL+0xBL)和((1L>(48位)); } s

是否有人拥有drand48()或同等版本的实现,可以在OpenCL内核中工作


我一直在通过缓冲区发送主机上生成的随机数,但如果有办法,我需要在设备上生成随机数。

这里有一个OpenCL设备函数,您可以从OpenCL内核调用它:

uint rng\u next(\u全局ulong*状态,uint索引){
/*假设32位*/
uint位=32;
/*获取当前状态*/
ulong状态=状态[索引];
/*更新状态*/
状态=(状态*0x5DEECE66DL+0xBL)和((1L>(48位));
}
states
数组包含每个工作项的PRNG状态,索引基本上是(但不一定是)工作项ID(可以使用
get\u global\u ID()
获得)

状态
数组可以在主机中生成(使用另一个PRNG)并复制到设备,也可以在设备中使用应用于工作项全局ID的某种哈希函数对其进行初始化。如果使用工作项全局ID作为初始种子,则每个工作项的随机流质量将非常低(由于它们之间的高度相关性)。下面是一个内核,用于应用哈希函数来解相关初始种子(注意,您需要主机传递的主初始种子):

\u内核无效rng\u初始化(
康斯图隆大教堂,
__全局clo_状态类型*种子){
/*获取此工作项的初始种子*/
ulong seed=get_global_id(0)+main_seed;
/*应用基本的异或移位哈希,可能存在更好的*/
种子=((种子>>16)^种子)*0x45d9f3b;
种子=((种子>>16)^种子)*0x45d9f3b;
种子=((种子>>16)^种子);
/*更新种子数组*/
种子[get_global_id(0)]=种子;
}
请注意,正如注释中所指出的,drand48的质量非常低,如果使用大量工作项,您将在渲染中看到瑕疵。对此进行了更详细的解释


此代码取自库,我是该库的作者。

如果这些数字旨在以任何方式提高信息安全性(例如,它们用作随机加密密钥、nonce或密码),您将使用这些随机数做什么,则
drand48
不是RNG的合适选择。此外,您是否确认随机数生成是应用程序中的性能瓶颈?@PeterO。它们被用于光线跟踪应用程序中,以从材质模拟算法生成真实输出,因此随机数越多越真实输出是ic。为了防止随机数重复,我必须发送一个非常大的缓冲区,虽然我并不关注它的性能,但我认为可能有更好的方法在本机上实现它?使用drand48的目的是使其值介于0和1之间。虽然我实际上没有使用drand48,但我只是将其定义为
rand()/rand_MAX
。对于此函数,我是否会执行类似操作,将输出除以,例如,
UINT_MAX
,然后转换为双精度,或者如何将其规格化为0到1之间的值?