我產卵的從我Setup()
核心256個線程設置了256個CURAND狀態的陣列RNGstates
1塊:CUDA CURAND是否容易受數據競爭影響?
__global__ void Setup(curandState *RNGstates, long seed) {
int tid = threadIdx.x;
curand_init(seed, tid, 0, &RNGstates[tid]);
}
現在,我產卵從我Generate()
內核的1000塊256個線程填寫數組result
與256,000個隨機數。但是,我這樣做只使用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()
莫名其妙地更新狀態,所以我相信一些寫操作正在發生。
因此,當1000個線程映射到256個CURAND狀態中的每個狀態時,都應該擔心數據競爭會通過curand_uniform()
隱式更新狀態?這會影響我的隨機數的質量(例如獲得頻繁的重複值)嗎?
非常感謝。
是的,但最好我想用,如果我能更少的內存脫身使用curandStateMtgp32_t,所以256個州仍然安全工作? – mchen
@MiloChen不安全。爲了節省內存,你可以限制#blocks。我已經更新了我的答案。 – kangshiyin