opencl
의사 난수 생성 프로그램의 커널 예제
수색…
매개 변수
매개 변수 | 세부 |
---|---|
__global unsigned int * rnd_buffer | unsigned int는 OpenCL 표준에 의해 32 비트로 표준화되었습니다. |
* | __global은 읽기 / 쓰기 액세스를위한 장치의 주 메모리를 의미합니다. |
* | rnd_buffer는 "opencl program"(호스트가 아니라 장치)의 범위에있는 이름입니다. |
Thomas Wang의 정수 해시 함수 사용
종자를 가져 와서 평가하는 보조 기능 :
uint wang_hash(uint seed)
{
seed = (seed ^ 61) ^ (seed >> 16);
seed *= 9;
seed = seed ^ (seed >> 4);
seed *= 0x27d4eb2d;
seed = seed ^ (seed >> 15);
return seed;
}
"id"로 표시된 버퍼 위치를 초기화하는 데 사용하는 다른 보조 함수 :
void wang_rnd_0(__global unsigned int * rnd_buffer,int id)
{
uint maxint=0;
maxint--;
uint rndint=wang_hash(id);
rnd_buffer[id]=rndint;
}
다른 하나는 0에서 1 사이의 추가 플로트 출력을 수행합니다.
float wang_rnd(__global unsigned int * rnd_buffer,int id)
{
uint maxint=0;
maxint--; // not ok but works
uint rndint=wang_hash(rnd_buffer[id]);
rnd_buffer[id]=rndint;
return ((float)rndint)/(float)maxint;
}
초기화 커널 :
__kernel void rnd_init(__global unsigned int * rnd_buffer)
{
int id=get_global_id(0);
wang_rnd_0(rnd_buffer,id); // each (id) thread has its own random seed now
}
단일 반복 커널 :
__kernel void rnd_1(__global unsigned int * rnd_buffer)
{
int id=get_global_id(0);
// can use this to populate a buffer with random numbers
// concurrently on all cores of a gpu
float thread_private_random_number=wang_rnd(rnd_buffer,id);
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow