Random curandGenerateNormalDouble正在崩溃,将生成大量随机数

Random curandGenerateNormalDouble正在崩溃,将生成大量随机数,random,cuda,generator,Random,Cuda,Generator,有什么限制吗 箭毒( 库兰发电机, 浮点*输出ptr,大小, 浮动平均值,浮动标准差) 功能? curandGenerateNormal在循环内被调用,当我增加size\u t n参数的大小时,代码在被调用几次后开始崩溃 有什么想法吗?你能详细说明一下当它崩溃时会发生什么吗?是否检查所有错误值 您的循环应该与下面的代码类似。是否有可能Cudamaloc在您不知情的情况下出现故障,因此您传递的是无效指针或类似的东西 curandGenerator_t gen; curandResult = cur

有什么限制吗

箭毒( 库兰发电机, 浮点*输出ptr,大小, 浮动平均值,浮动标准差)

功能? curandGenerateNormal在循环内被调用,当我增加size\u t n参数的大小时,代码在被调用几次后开始崩溃


有什么想法吗?

你能详细说明一下当它崩溃时会发生什么吗?是否检查所有错误值

您的循环应该与下面的代码类似。是否有可能Cudamaloc在您不知情的情况下出现故障,因此您传递的是无效指针或类似的东西

curandGenerator_t gen;
curandResult = curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT));
if (curandResult != CURAND_STATUS_SUCCESS)
{
    // throw or whatever
}

curandResult = curandSetPseudoRandomGeneratorSeed(gen, 1234ULL));
if (curandResult != CURAND_STATUS_SUCCESS)
{
    // throw or whatever
}

cudaResult = cudaMalloc((void **)&data, szend * sizeof(float));
if (cudaResult != cudaSuccess)
{
    // throw or whatever
}

for (unsigned int sz = szstart ; sz <= szend ; sz += szstep)
{
    float *data = 0;

    /* Could allocate and free the memory on each iteration,
       instead of allocating for the maximum size upfront...
    cudaResult = cudaMalloc((void **)&data, sz * sizeof(float));
    if (cudaResult != cudaSuccess)
    {
        // throw or whatever
    }
    */
    curandResult = curandGenerateNormal(gen, data, sz, mean, stddev);
    if (curandResult != CURAND_STATUS_SUCCESS)
    {
        // throw or whatever
    }
    /* If allocating on each iteration, need to free...
    cudaResult = cudaFree(data);
    if (cudaResult != cudaSuccess)
    {
        // throw or whatever
    }
    */
}
cudaResult = cudaFree(data);
if (cudaResult != cudaSuccess)
{
    // throw or whatever
}

curandResult = curandDestroyGenerator(&gen));
if (curandResult != CURAND_STATUS_SUCCESS)
{
    // throw or whatever
}
curandgen;
curandResult=curandCreateGenerator(&gen,CURAND_RNG_PSEUDO_DEFAULT));
如果(curandResult!=CURAND_状态_成功)
{
//扔什么
}
curandResult=curandSetPseudoRandomGeneratorSeed(gen,1234ULL));
如果(curandResult!=CURAND_状态_成功)
{
//扔什么
}
cudaResult=cudamaloc((void**)和数据,szend*sizeof(float));
if(cudaResult!=cudaSuccess)
{
//扔什么
}

对于(unsigned int sz=szstart;sz),GenerateUniformDouble函数在循环中运行正常,但我们需要curandGenerateNormalDouble生成0到1之间的数字。请提供帮助。“curandGenerateNormalDouble正在崩溃”…用什么?!嗨,汤姆,谢谢你的回复。我们需要平均值为0和stddev 1的正态分布随机数。当sz参数值较大时,我得到的崩溃来自循环。此外,当curandResult!=CURAND_STATUS_SUCCESS时,我们如何输出一些详细的错误消息。感谢分配和释放每个itera上的内存操作,这会降低性能吗?我在循环开始前以固定大小分配内存,该大小等于每个循环中生成的随机数,并在循环结束后释放内存。但是,当需要生成的随机数很大时,程序在使用curandGenerateNormalDouble运行几次后崩溃。I使用了#define CURAND_CALL(x)do{if((x)!=CURAND_STATUS_SUCCESS){\printf(“%s Error at%s:%d\n”,“CURAND Library”,FILE,LINE);\return EXIT_FAILURE;}while(0)调用CurandGeneratorNormalDouble时从API样本中删除,因此当renturn值不等于CURAND_STATUS_SUCCESS时程序停止。在此行中,curandResult=curandSetPseudoRandomGeneratorSeed(gen,1234ULL));1234之后有什么用?thanksI还尝试了上面的示例代码。当curandGenerateNormal(gen、data、sz、mean、stddev)具有更大的sz值(例如250000)时,代码将在通过循环的几次调用后崩溃。