gpt4 book ai didi

c++ - 通过拒绝方法使用 CUDA 生成随机数。性能问题

转载 作者:行者123 更新时间:2023-11-28 07:02:02 24 4
gpt4 key购买 nike

我正在运行用 CUDA 编写的用于粒子模拟的蒙特卡罗代码。基本上,在每一步中,我都会计算每个粒子的速度并更新其位置。速度与路径长度成正比。对于给定的 Material ,路径长度具有一定的分布。我知道这个路径长度的概率密度函数。我现在尝试通过 rejection method. 根据此函数对随机数进行采样我会说我的 CUDA 知识有限。我明白,最好是一次创建大块随机数而不是多个小块。然而,对于拒绝方法,我只生成两个随机数,检查某个条件并在失败的情况下重复此过程。因此,我在内核上生成随机数。

使用分析器/nvvp 我注意到,基本上我 50% 的时间花在了拒绝方法上。

我的问题是:有什么方法可以优化拒绝方法吗?

我感谢每一个答案。

代码

这里是拒绝方法。

__global__ void rejectSamplePathlength(float* P, curandState* globalState,
int numParticles, float sigma, int timestep,curandState state) {
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numParticles) {
bool success = false;
float p;
float rho1, rho2;
float a, b;
a = 0.0;
b = 10.0;
curand_init(i, 0, 0, &state);
while (!success) {
rho1 = curand_uniform(&globalState[i]);
rho2 = curand_uniform(&globalState[i]);
if (rho2 < pathlength(a, b, rho1, sigma)) {
p = a + rho1 * (b - a);
success = true;
}
}
P[i] = abs(p);

}
}

if 语句中的 pathlength 函数计算内核上的值 y=f(x)。我很确定 curand_init 在时间上有问题,但如果没有这个语句,每个内核都会生成相同的数字?

最佳答案

也许您可以在先前的内核中创建一个随机生成的统一变量池,然后您在该池中选择您的统一变量并在该池中循环。但它应该足够大以避免无限循环..

关于c++ - 通过拒绝方法使用 CUDA 生成随机数。性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22296794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com