Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCL的curand等价物_C++_Opencl - Fatal编程技术网

C++ OpenCL的curand等价物

C++ OpenCL的curand等价物,c++,opencl,C++,Opencl,我正在寻找从nvidia转换到amd的计算卡,因为我想要双精度支持。在此之前,我决定在我的nvidia卡上学习opencl,看看我是否喜欢它。我想将以下代码从CUDA转换为OpenCL。我正在使用curand库生成均匀和正态分布的随机数。每个线程都需要能够创建不同的随机数序列,并在每个线程中生成数百万个随机数。这是代码。我将如何在OpenCL中实现这一点。我在网上读到的所有内容似乎都暗示我应该生成一个随机数缓冲区,然后在gpu上使用它,但这对我来说并不实际 template<int NAr

我正在寻找从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];
}
模板
__全球
无效统计解算器内核(浮点*参数边界,
浮点数*args_ubounds,
国际审判,
初始温度,
未签名的长种子,
浮动*结果,
优化函子(f)
{
int idx=blockIdx.x*blockDim.x+threadIdx.x;
如果(idx>=试验)
返回;
库兰州立大学;
curand_init(种子、idx、0和兰德);
浮动x[NArgs];
for(int i=0;i0;t--)
{
浮动温度百分比=(浮动)温度/初始温度;
浮动x_素数[NArgs];
for(int i=0;i

编辑:带着一点沙尔特的味道,因为我是VexCL的作者:).

我被第一句话难住了。Nvidia至少支持双精度超过5年。您使用的是哪一张卡?它真的那么旧吗?您可以添加cuda编译器标志以启用双精度支持。-此外,我欢迎您选择也支持Nvidia以外的供应商使用您的软件。;)随机性通常是非常重要的使用noise函数完成,该函数使用种子和线程ID分别获取每个线程的随机数。请参见作为开始。抱歉,我的意思是快速双重感知。您可以使用(基于计数器的)来自Boost.Compute或VexCL库的随机数生成器。我在OpenCL Monte Carlo代码中用于替换curand。它轻量级且非常有效。IDK如果它是最好的或任何东西,但它对我来说做得非常好