使用OpenACC生成便携式随机数

问题描述 投票:1回答:1

有没有一种可移植的方法来使用OpenACC生成随机数?我知道可以直接使用cuRand,但后来我只能使用Nvidia GPU。另一个选择似乎是在主机上生成数字然后将它们移动到设备,但这似乎不是性能方面的最佳解决方案。

有没有更好的办法?

c++ random gpu openacc pgi
1个回答
1
投票

并行使用随机数发生器本身就是一项棘手的操作。 RNG携带状态变量,该变量需要私有到每个并行线程。使用系统的“rand”是有问题的,因为它使用全局状态变量,当在并行上下文中使用时,该变量给出未定义的行为(竞争条件)。应该使用更多并行的RNG,例如“rand_r”和Boost的PRNG。

第二个问题是RNG并不总是可移植的。不同的平台可能以某种方式实现“rand”。如您所知,NVIDIA设备上没有“rand”呼叫,您需要使用cuRAND呼叫。

OpenACC旨在以平台无关的方式帮助您在代码中利用并行性。因此,诸如并行RNG的平台特定操作难以在标准本身内定义。也许可以做点什么,特别是对于像PRNG这样有用的东西,我建议你联系OpenACC标准委员会,请求这种支持(feedback_at_openacc_dot_org)。

现在唯一真正可移植的方法是编写自己的并行RNG并将其作为代码的一部分包含在内。另外,我没有写一个OpenACC示例并且有点淹没所以不知道我是否有时间,但会尽我所能将它们拉到一起。

我确实编写了一个Mersenne Twister算法的CUDA C版本作为我8年前写的一篇文章的一部分,这篇文章可能会有所帮助(尽管它早于OpenACC)。它使用文章开头的PGI加速器模型和中间的CUDA Fortran,所以不要过多担心内容,只需要MT来源。

https://www.pgroup.com/blogs/posts/tune-gpu-monte-carlo.htm

来源包:https://www.pgroup.com/lit/samples/pginsider/pgi_mc_example.tar.gz

© www.soinside.com 2019 - 2024. All rights reserved.