如何获得“随机"身份OpenCL中的编号 [英] How to get a "random" number in OpenCL

查看:80
本文介绍了如何获得“随机"身份OpenCL中的编号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找OpenCL中的随机数.它不必是真正的随机甚至是随机的.只是简单而快速的事情.

I'm looking to get a random number in OpenCL. It doesn't have to be real random or even that random. Just something simple and quick.

我看到OpenCL中有大量的真正的随机并行化花式裤子随机算法,就像成千上万的行.我不需要那样的东西.即使很容易看到其中的模式,也可以使用简单的"random()".

I see there is a ton of real random parallelized fancy pants random algorithms in OpenCL that are like thousand and thousands of lines. I do NOT need anything like that. A simple 'random()' would be fine, even if it is easy to see patterns in it.

我看到有一个噪波"功能吗?有什么简单的方法可以用来获取随机数吗?

I see there is a Noise function? Any easy way to use that to get a random number?

推荐答案

最近几天,我一直在解决这个无随机性"的问题,我想出了三种不同的方法:

I was solving this "no random" issue for last few days and I came up with three different approaches:

  1. Xorshift -我基于该引擎创建了生成器.您要做的就是为整个内核提供一个uint2编号(种子),每个工作项将计算自己的rand编号

  1. Xorshift - I created generator based on this one. All you have to do is provide one uint2 number (seed) for whole kernel and every work item will compute his own rand number

// 'randoms' is uint2 passed to kernel
uint seed = randoms.x + globalID;
uint t = seed ^ (seed << 11);  
uint result = randoms.y ^ (randoms.y >> 19) ^ (t ^ (t >> 8));

  • Java随机-我使用了.next(int bits)方法中的代码来产生随机数.这次,您必须提供一个ulong号作为种子.

  • Java random - I used code from .next(int bits) method to generate random number. This time you have to provide one ulong number as seed.

    // 'randoms' is ulong passed to kernel
    ulong seed = randoms + globalID;
    seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
    uint result = seed >> 16;
    

  • 只需在CPU上生成所有内容,然后将其传递到一个大缓冲区中即可.

  • Just generate all on CPU and pass it to kernel in one big buffer.

    我在我的进化算法中测试了所有三种方法(生成器),这些算法计算图形中的最小支配集.

    I tested all three approaches (generators) in my evolution algorithm computing Minimum Dominating Set in graphs.

    我喜欢第一个生成的数字,但是看起来我的进化算法却不喜欢.

    I like the generated numbers from the first one, but it looks like my evolution algorithm doesn't.

    第二个生成器生成的数字具有一些可见的模式,但是我的进化算法仍然喜欢这种方式,并且整个事物的运行速度都比第一个生成器快.

    Second generator generates numbers that has some visible pattern but my evolution algorithm likes it that way anyway and whole thing run little faster than with the first generator.

    但是第三种方法表明,仅提供主机(cpu)中的所有数字绝对是可以的.首先,尽管我生成(在我的情况下)1536个int32数字并将其在每次内核调用中传递给GPU都将太昂贵(以进行计算并将其传输到GPU).但是事实证明,它和我以前的尝试一样快.并且CPU负载保持在5%以下.

    But the third approach shows that it's absolutely fine to just provide all numbers from host (cpu). First I though that generating (in my case) 1536 int32 numbers and passing them to GPU in every kernel call would be too expensive (to compute and transfer to GPU). But it turns out, it is as fast as my previous attempts. And CPU load stays under 5%.

    顺便说一句,我还尝试了 MWC64X随机,但之后我安装了新的GPU驱动程序,该功能mul_hi开始导致构建失败(甚至整个AMD Kernel Analyer崩溃了).

    BTW, I also tried MWC64X Random but after I installed new GPU driver the function mul_hi starts causing build fail (even whole AMD Kernel Analyer crashed).

    这篇关于如何获得“随机"身份OpenCL中的编号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆