我从我的内核生成1 个 256 个线程块Setup()
来设置一个RNGstates
具有 256 个 CURAND 状态的数组:
__global__ void Setup(curandState *RNGstates, long seed) {
int tid = threadIdx.x;
curand_init(seed, tid, 0, &RNGstates[tid]);
}
现在,我从内核中生成1000 个 256 个线程的块,用 256,000 个随机数Generate()
填充数组。result
但是,我只使用 256 个状态RNGstates
,这样每个状态将被 1000 个线程访问(每个块一个):
__global__ void Generate(curandState *RNGstates, float *result) {
int tid = blockIdx.x*blockDim.x + threadIdx.x;
float rnd = curand_uniform(&RNGstates[threadIdx.x]);
result[tid] = rnd;
}
我知道调用curand_uniform()
会以某种方式更新状态,所以我认为正在发生一些写操作。
那么,当映射到 256 个 CURAND 状态中的每一个的 1000 个线程尝试通过隐式更新状态时,我是否应该担心发生数据竞争curand_uniform()
?这会影响我的随机数的质量(例如获得频繁的重复值)吗?
非常感谢。