【发布时间】:2017-09-12 01:49:22
【问题描述】:
我从我的 Setup() 内核生成 1 个 256 个线程块,以设置具有 256 个 CURAND 状态的数组 RNGstates:
__global__ void Setup(curandState *RNGstates, long seed) {
int tid = threadIdx.x;
curand_init(seed, tid, 0, &RNGstates[tid]);
}
现在,我从我的 Generate() 内核中生成 1000 个 256 个线程的块,用 256,000 个随机数填充数组 result。但是,我只使用 RNGstates 的 256 个状态,这样每个状态将被 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() 隐式更新状态时,我是否应该担心发生数据争用?这会影响我的随机数的质量(例如获得频繁的重复值)吗?
非常感谢。
【问题讨论】:
标签: random cuda gpgpu race-condition