gpt4 book ai didi

c++ - 相当于 OpenCL 的 curand

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:25 25 4
gpt4 key购买 nike

我正在考虑将我的计算卡从 nvidia 切换到 amd,因为我需要 double 支持。在这样做之前,我决定在我的 nvidia 卡上学习 opencl,看看我是否喜欢它。我想将以下代码从 CUDA 转换为 OpenCL。我正在使用 curand 库生成均匀且正态分布的随机数。每个线程都需要能够创建不同的随机数序列,并为每个线程生成几百万个。这是代码。我将如何在 OpenCL 中解决这个问题。我在网上阅读的所有内容似乎都暗示我应该生成一个随机数缓冲区,然后在 gpu 上使用它,但这对我来说不切实际。

template<int NArgs, typename OptimizationFunctor>
__global__
void statistical_solver_kernel(float* args_lbounds,
float* args_ubounds,
int trials,
int initial_temp,
unsigned long long seed,
float* results,
OptimizationFunctor f)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if(idx >= trials)
return;

curandState rand;
curand_init(seed, idx, 0, &rand);
float x[NArgs];
for(int i = 0; i < NArgs; i++)
{
x[i] = curand_uniform(&rand) * (args_ubounds[i]- args_lbounds[i]) + args_lbounds[i];
}
float y = f(x);
for(int t = initial_temp - 1; t > 0; t--)
{
float t_percent = (float)t / initial_temp;
float x_prime[NArgs];
for(int i = 0; i < NArgs; i++)
{
x_prime[i] = curand_normal(&rand) * (args_ubounds[i] - args_lbounds[i]) * t_percent + x[i];
x_prime[i] = fmaxf(args_lbounds[i], x_prime[i]);
x_prime[i] = fminf(args_ubounds[i], x_prime[i]);
}

float y_prime = f(x_prime);
if(y_prime < y || (y_prime - y) / y_prime < t_percent)
{
y = y_prime;
for(int i = 0; i < NArgs; i++)
{
x[i] = x_prime[i];
}
}
}

float* rptr = results + idx * (NArgs + 1);
rptr[0] = y;
for(int i = 1; i <= NArgs; i++)
rptr[i] = x[i - 1];
}

最佳答案

VexCL库提供了基于计数器的生成器的实现。您可以在较大的表达式中使用那些,请参阅此 slide举个例子。

编辑:我是 VexCL 的作者 :),请稍加批评。

关于c++ - 相当于 OpenCL 的 curand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35783896/

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