문제

나는 고생으로 이 모든 일,내가 노력을 얻기 위한 스레드에서 나 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 용 GNU RAND48 () 기능의 구현을 포함하는 MDGPU 패키지 (GPL)가 있습니다. 여기.

나는 그것을 발견했다 (아주 쉽게, Google을 사용하여, 당신이 시도했다고 생각합니다 :-) Nvidia 포럼에서 여기.

Cuda에 대한 좋은 병렬 번호 생성기를 찾지 못했지만 학술 연구를 기반으로 병렬 랜덤 숫자 생성기를 찾았습니다. http://sprng.cs.fsu.edu/

당신은 시험해 볼 수 있습니다 GPU의 Mersenne Twister

그것은 매우 빠르고 신뢰할 수있는 무작위 번호 생성기 인 SIMD 지향적 빠른 Mersenne Twister (SFMT)를 기반으로합니다. 임의의 숫자 생성기에 대한 Marsaglias Diehard 테스트를 통과합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top