在我的程序中,我必须生成大量随机数。因此,我尝试重用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生成器也存在问题。
报告虚假错误的不是cuda-memcheck。启用了memcheck-option的它是Nsights。它似乎独立于cuRAND。即使在一些简单的cuda-examples中,Nsight也会报告内存访问错误。很抱歉上面的文字中有误导性的信息。
答案 0 :(得分:2)
在我完成了更多的调试之后,事实证明,curand工作得很好。它是产生错误消息的nsight-debugger。
特别是,启用了启用Cuda Memory Checker 选项。很多时候它会报告cuda-memcheck根本找不到任何错误的错误。
此外,它经常报告 false 失败的断言。到目前为止,我无法弄清楚导致问题的原因。可能我的代码中存在一个导致这种奇怪行为的错误。
或者我的机器配置有问题。与此同时,我安装了一些新驱动程序附带的CUDA更新。因此,CUDA本身似乎不太可能导致问题。
但是,我只想告诉你,CURAND并没有造成麻烦。