用几何布朗运动法调试CUDA代码生成股票路径

用几何布朗运动法调试CUDA代码生成股票路径,cuda,Cuda,该代码是用来生成股票路径的几何布朗运动方法。对于每一条路径,我有10个步骤,但是,正如你在下面看到的,从第三条路径开始,所有的步骤都是0,这不是我想要的。错误在哪里 #include <iostream> #include <iomanip> #include <cuda_runtime.h> #include <device_launch_parameters.h> #include <curand_kernel.h> const

该代码是用来生成股票路径的几何布朗运动方法。对于每一条路径,我有10个步骤,但是,正如你在下面看到的,从第三条路径开始,所有的步骤都是0,这不是我想要的。错误在哪里

#include <iostream>
#include <iomanip>

#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <curand_kernel.h>

const int numSims(10);
const int threadBlockSize(4);

__global__ void generatePaths(float* path)
{
    float r=0.1;
    float sigma=0.3;
    float S0=100;
    float K=100;
    float t=1;

    int steps=10;
    float dt=t/float(steps);

    curandState s;
    int tid=blockIdx.x*blockDim.x+threadIdx.x;
    curand_init(tid, 0, 0, &s);

    float *value=path+tid;
    float S=S0;
    for(unsigned int i=0; i<steps; ++i)
    {
        S=S*expf((r-0.5*sigma*sigma)*dt+sigma*sqrt(dt)*curand_normal(&s));
        *(path+tid+i)=S;
    }
}

int main()
{
    dim3 grid;
    dim3 block;
    block.x=threadBlockSize;
    grid.x=(numSims+threadBlockSize-1)/threadBlockSize;

    int steps=10;
    float *da;
    cudaMalloc((void**)&da, numSims*steps*sizeof(float));
    generatePaths<<<grid, block>>>(da);

    float *values;
    values=(float*)malloc(numSims*steps*sizeof(float));
    cudaMemcpy(values, da, numSims*steps*sizeof(float), cudaMemcpyDeviceToHost);

    for(int i=0; i<numSims; i++)
    {
        for(int j=0; j<steps; j++)
        {
            std::cout<<values[i*steps+j]<<" ";
        }
        std::cout<<std::endl;
    }
    return 0;
}
结果是

103.381 97.1031 106.928 114.18 120.802 98.2669 114.038 106.057 126.741 136.836

125.589 124.903 123.564 102.781 125.09 71.5134 89.9109 92.4751 184.371 101.023

162.256 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 按任意键继续

应该是吗

    *(path + tid * steps + i) = S;
而不是

    *(path+tid+i)=S;
?

您的版本具有竞争条件-不同的线程正在写入同一内存元素

upd:
对,@Talonmes关于坏内存访问的观点是有效的-您的网格有3个块,每个块有4个线程,每个处理步骤元素,但分配的内存大小较小。您可以将大小传递给内核并添加一个检查iftid>size return;,或者更改网格以更好地适应任务

这段代码应该做什么?你没有问任何问题。你的问题是什么。请将问题标题编辑成有意义的内容。如果你想得到答案,你需要提供一些背景和上下文。不是每个人都可以,也不是每个人都有时间,查看您的代码并推断您希望它做什么。是的,这就是问题所在。但是,如果在不向内核添加范围检查的情况下修复了越界内存访问,那么代码将失败。