curand_init()产生内存访问错误

时间:2017-03-05 11:02:59

标签: cuda

在我的程序中,我必须生成大量随机数。因此,我尝试重用cuRAND状态,以便我只需要初始化一次。不幸的是,执行初始化的代码会产生奇怪的内存访问错误。我花了很多时间调试它,只有当我设置参数' sequence'时才会出现错误。 ' curand_init()'一个很大的值(例如30000)或参数' seed'得到的太大了。 使用以下代码,我能够重现错误:

#include <conio.h>
#include <stdio.h>
#include <curand.h>
#include <curand_kernel.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

__global__ void initRnd(unsigned long long seed, curandState* states, int size)
{
    int id = blockIdx.x * blockDim.x + threadIdx.x;
    if (id < size) {
        curand_init(seed, id, 0, &states[id]);
    }
}

void handleError(cudaError_t code)
{
    if (code != cudaSuccess) {
        printf("ERROR: %s (Code: %d) %s %d\n", cudaGetErrorString(code), code, __FILE__, __LINE__);
        exit(code);
    }
}

int main()
{
    const int size = 3000000;

    cudaError_t code = cudaSetDevice(0);
    handleError(code);

    curandState *data;
    code = cudaMalloc((void**)&data, size * sizeof(curandState));
    handleError(code);

    const int blockSize = 256;
    int numOfBlocks = (size + blockSize - 1) / blockSize;
    dim3 dimGrid(numOfBlocks);
    dim3 dimBlock(blockSize);
    initRnd << <dimGrid, dimBlock >> > (time(0), data, size);
    code = cudaDeviceSynchronize();
    handleError(code);

    code = cudaDeviceReset();
    handleError(code);

    printf("\nPress any key...\n");
    _getch();
}

当我使用cuda-memcheck运行时,它会产生不可预测的结果,有时我的计算机会崩溃。

错误消失当我将curand_init的sequence-parameter设置为0时:

curand_init(seed, 0, 0, &states[id]);

由于这导致在所有线程中都有相同的序列,我试图将thread-id添加到种子值:

curand_init(seed+id, 0, 0, &states[id]);

但是当错误出现时,错误会重新出现。包含高价值。

我对cuda编程很陌生,如果我做错了什么,或者如果这是我应该提交给NVidia的cuRAND中的错误,我就不会感到害羞。

有人可以帮忙吗?

更新

为了检查这是我的程序中的错误还是Cuda的某个地方,我使用了第3.6章中的第一个例子。 (&#34;设备API示例&#34;,请参阅cuRAND Programming Guide)。它还会在cuda-memcheck中产生内存访问冲突。所以我猜它是cuRAND或内存检查器中的错误。有人可以验证一下吗?有人能够毫无错误地运行示例whith cuda-memcheck吗?

btw:即使使用curandStatePhilox4_32_10_t或curandStateMRG32k3a等其他cuRAND生成器也存在问题。

更新2

报告虚假错误的不是cuda-memcheck。启用了memcheck-option的它是Nsights。它似乎独立于cuRAND。即使在一些简单的cuda-examples中,Nsight也会报告内存访问错误。很抱歉上面的文字中有误导性的信息。

1 个答案:

答案 0 :(得分:2)

在我完成了更多的调试之后,事实证明,curand工作得很好。它是产生错误消息的nsight-debugger。

特别是,启用了启用Cuda Memory Checker 选项。很多时候它会报告cuda-memcheck根本找不到任何错误的错误。

此外,它经常报告 false 失败的断言。到目前为止,我无法弄清楚导致问题的原因。可能我的代码中存在一个导致这种奇怪行为的错误。

或者我的机器配置有问题。与此同时,我安装了一些新驱动程序附带的CUDA更新。因此,CUDA本身似乎不太可能导致问题。

但是,我只想告诉你,CURAND并没有造成麻烦。