आपके आवेदन के आधार पर आप पर विचार किए बिना LCGs का उपयोग कर से सावधान रहना चाहिए चाहे धाराएं (प्रति थ्रेड एक स्ट्रीम) ओवरलैप हो जाएंगी। आप एलसीजी के साथ एक लीपफ्रॉग लागू कर सकते हैं, लेकिन फिर यह सुनिश्चित करने के लिए कि अनुक्रम दोहराना नहीं है, आपको पर्याप्त लंबी अवधि एलसीजी की आवश्यकता होगी।
एक उदाहरण मेंढक कूद हो सकता है:
template <typename ValueType>
__device__ void leapfrog(unsigned long &a, unsigned long &c, int leap)
{
unsigned long an = a;
for (int i = 1 ; i < leap ; i++)
an *= a;
c = c * ((an - 1)/(a - 1));
a = an;
}
template <typename ValueType>
__device__ ValueType quickrand(unsigned long &seed, const unsigned long a, const unsigned long c)
{
seed = seed * a;
return seed;
}
template <typename ValueType>
__global__ void mykernel(
unsigned long *d_seeds)
{
// RNG parameters
unsigned long a = 1664525L;
unsigned long c = 1013904223L;
unsigned long ainit = a;
unsigned long cinit = c;
unsigned long seed;
// Generate local seed
seed = d_seeds[bid];
leapfrog<ValueType>(ainit, cinit, tid);
quickrand<ValueType>(seed, ainit, cinit);
leapfrog<ValueType>(a, c, blockDim.x);
...
}
लेकिन तब कि जनरेटर की अवधि शायद ज्यादातर मामलों में अपर्याप्त है।
ईमानदार होने के लिए, मैं NAG जैसे किसी तृतीय पक्ष लाइब्रेरी का उपयोग करना चाहता हूं। एसडीके में कुछ बैच जनरेटर भी हैं, लेकिन शायद यह नहीं है कि आप इस मामले में क्या खोज रहे हैं।
संपादित
के बाद से यह सिर्फ कर ली ऊपर वोट दिया है, मैं समझ यह है कि cuRAND, के रूप में इस सवाल का अधिक हाल ही में उत्तर से उल्लेख किया है, उपलब्ध है उल्लेख करने के लिए अद्यतन करने के लायक है और जनरेटर और वितरण के एक नंबर प्रदान करता है। यह निश्चित रूप से शुरू करने का सबसे आसान स्थान है।
कुछ उपयोगी जानकारी: http://http.developer.nvidia.com/GPUGems3/gpugems3_ch37.html – Jesper