我对 CUDA 语言还很陌生,我需要对粒子进行模拟,这些粒子在每个时间步都会更新,方法是在它们的位置上添加一个随机值(彼此不同,但遵循相同的分布)。
我的想法是给每个粒子一个不同的 curandState(带有不同的种子),并且在每个时间步简单地做一个 curand(curandState[particle_id])。
我在想我可以将随机状态和粒子 ID 存储在 GPU 上的常量内存中。但是我还没有看到有人在任何地方这样做,这会引起记忆问题吗?这可以加快程序吗?
谢谢您的帮助 :)
我对 CUDA 语言还很陌生,我需要对粒子进行模拟,这些粒子在每个时间步都会更新,方法是在它们的位置上添加一个随机值(彼此不同,但遵循相同的分布)。
我的想法是给每个粒子一个不同的 curandState(带有不同的种子),并且在每个时间步简单地做一个 curand(curandState[particle_id])。
我在想我可以将随机状态和粒子 ID 存储在 GPU 上的常量内存中。但是我还没有看到有人在任何地方这样做,这会引起记忆问题吗?这可以加快程序吗?
谢谢您的帮助 :)
我不认为这是有道理的。 __constant__
内存是恒定的,不能由运行在 GPU 上的线程直接修改。但是,每次线程生成随机数时都需要修改 curandState(否则,您将一遍又一遍地生成相同的数字)。
给每个粒子自己的状态并没有错。这将是这种情况的典型用法。
由于 curandState 的检索和使用以及随机数的生成是由 GPU 上的 NVIDIA 库完成的,因此您可以假设 NVIDIA 工程师在优化内存访问以提高效率和合并方面做得相当不错。检索和更新状态,生成随机数的操作。
__constant__
内存还具有每个时钟每个 SM 仅服务一个 32 位值的特性,因此当所有线程都访问相同的数据元素(即广播)时它很有用,但当每个线程访问不同的元素时通常没有用处(例如单独的 curandState )即使该访问通常会合并,例如,如果它在普通的全局内存中。