문제
나는 고생으로 이 모든 일,내가 노력을 얻기 위한 스레드에서 나 CUDA 코드입니다.나는 보았을 통해 모든 포럼 및 이 항목에서 제공한다 나 시간을 보냈다고 해명하는 모든 종류의 코드가 소용이 없었습니다.누군가가 알고 있다면 간단한 방법으로, device 커널 호출할 수 있는 반환하는 임의의 플로트 0 과 1 사이에,또는 정수할 수 있는 변환기는 것이 가장 감사합니다.
다시 사용할 수 있도록 노력하겠습니다 임의의 수는 커널에서처럼,rand()를 인스턴스입니다.
사전에 감사합니다
해결책
왜 당신이 특별한 것이 필요한지 이해하지 못합니다. 전통적인 PRNG는 다소 직접 포트해야합니다. ㅏ 선형 합동 잘 작동해야합니다. 당신은 당신이 설정하려는 특별한 속성이 있습니까?
다른 팁
관심있는 사람이라면 이제 쿠 랜드.
이 질문에 대한 모든 논의는 Zenna의 Orginal 요청에 답해야한다고 생각합니다. 스레드 레벨 구현. 구체적으로 a 장치 기능 그것은 내에서 호출 할 수 있습니다 커널 또는 스레드. 내가 "대담한"문구를 과도하게 생각한다면 죄송하지만 지금까지 대답이 여기서 찾는 내용을 다루지 않는다고 생각합니다.
Curand Library가 최선의 방법입니다. 사람들이 바퀴를 재발 명하기를 원한다는 점에 감사하지만 (하나는 감사하고 더 적절하게 타사 라이브러리를 사용합니다) 고성능 고품질 숫자 생성기는 풍부하고 잘 테스트되었습니다. 내가 추천 할 수있는 가장 좋은 정보는 여기 다른 발전기의 GSL 라이브러리 문서에 있습니다.http://www.gnu.org/software/gsl/manual/html_node/random-number-generator-algorithms.html
심각한 코드의 경우 수학자/컴퓨터 과학자가 체계적인 약점을 찾아서 지상에있는 주요 알고리즘 중 하나를 사용하는 것이 가장 좋습니다. "Mersenne Twister"는 10^6000 (MT19997 알고리즘은 "Mersenne Twister 2^19997"을 의미하는 기간) (반복 루프)를 가진 것입니다. 스레드 ID 호출을 사용한 동일한 날실. 여기에서 종이를 참조하십시오 :http://developer.download.nvidia.com/compute/cuda/2_2/sdk/website/projects/mersennetwister/doc/mersennetwister.pdf. 실제로이 라이브러리를 사용하여 약간의 구현을 위해 노력하고 있으며 제대로 작동하면 코드를 게시합니다. NVIDIA는 현재 CUDA 툴킷에 대한 문서 사이트에 몇 가지 예제가 있습니다.
참고 : 레코드를 위해서는 NVIDIA에서 작동하지 않지만 CUDA에 대한 문서와 추상화 디자인은 지금까지 인상적인 것임을 인정할 것입니다.
응용 프로그램에 따라 당신의 주의해야 한 사용하여 LCGs 을 고려하지 않고는지 여부를 스트림이(하나의 스레드당 스트림)이 겹칠 수 있습니다.구현할 수 있는 도약으로 LCG,그러나 당신이 필요 충분히 장기간 LCG 지 확인하는 순서는 없 반복합니다.
예를 들어 도약할 수 있다:
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.거기에 몇 가지 일괄 생성기에서 SDK 도 있지만,그것은 아마 없을 찾고 계신 경우에.
편집
이 단어-투표,내가 그림의 가치를 업데이트를 언급하는 cuRAND, 으로 언급하여 더 많은 최근의 이 질문에 답하게 사용할 수 있고의 번호를 제공 발전기와 배포가 들어 있습니다.는 가장 쉬운 장소를 시작합니다.
이것을위한 가장 좋은 방법은 자신의 글을 쓰는 것입니다 장치 기능, 여기에 있습니다
void RNG()
{
unsigned int m_w = 150;
unsigned int m_z = 40;
for(int i=0; i < 100; i++)
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
cout <<(m_z << 16) + m_w << endl; /* 32-bit result */
}
}
32 비트 결과로 100 랜덤 숫자를 제공합니다.
1에서 1000 사이의 임의 숫자를 원한다면 result%1000
, 소비 시점 또는 생성 시점에서 :
((m_z << 16) + m_w)%1000
M_W 및 M_Z 시작 값을 변경하면 (예에서 150 및 40) 매번 다른 결과를 얻을 수 있습니다. 당신이 사용할 수있는 threadIdx.x
그중 하나로서 매번 다른 의사 안드롬 시리즈를 제공해야합니다.
나는 그것이 rand () 함수보다 2 번 더 빨리 작동한다고 덧붙이고 싶었고 훌륭하게 작동한다고 덧붙였다.)
Cuda에 대한 좋은 병렬 번호 생성기를 찾지 못했지만 학술 연구를 기반으로 병렬 랜덤 숫자 생성기를 찾았습니다. http://sprng.cs.fsu.edu/
당신은 시험해 볼 수 있습니다 GPU의 Mersenne Twister
그것은 매우 빠르고 신뢰할 수있는 무작위 번호 생성기 인 SIMD 지향적 빠른 Mersenne Twister (SFMT)를 기반으로합니다. 임의의 숫자 생성기에 대한 Marsaglias Diehard 테스트를 통과합니다.