相当于 OpenCL 的 curand
Equivalent of curand for OpenCL
我正在考虑从 nvidia 切换到 amd 作为我的计算卡,因为我想要双精度支持。 在这样做之前,我决定在我的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 库提供了基于计数器的生成器的实现。您可以在较大的表达式中使用它们,有关示例,请参阅此幻灯片。
编辑:带着一点点,因为我是VexCL :)的作者。
相关文章:
- 使用std::vector的OpenCL矩阵乘法
- OpenCL 内核参数中的字符***?
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- OpenCL 是否支持向量作为内核参数?
- 向量加法代码 OpenCL 返回 clCreateKernel 错误 -46
- 提高 OpenCL 的性能
- openCL 内核返回垃圾值,尽管没有错误
- OpenCL 内核计时测量 0 秒或导致 SIGABRT
- 0xc000007b Windows 上的 OpenCL 库的加载时间错误
- OpenCL 在 NVIDIA 和 Intel GPU 上启动内核时CL_INVALID_COMMAND_QUEUE
- OpenCL 代码卡在写入输出缓冲区上
- 将 C++ 库包含在 OpenCL 内核中?
- 如何在 OpenCL 中将小写转换为大写,反之亦然
- OpenCL 错误类在主机C++给出错误
- Zedboard zynq-7000 Opencl 浮点数从类型 'double*' 强制转换为类型 'double' 无效
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 使用 NVIDIA GPU 在 Cygwin 中链接 OpenCL 库时遇到问题
- 在 OpenCL 库中找不到 cl::Error 类
- 在 OpenCL 内核中实现半精度浮点数据类型
- 相当于 OpenCL 的 curand