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"で示されるバッファ位置を初期化するためにそれを使用するもう1つの補助関数:
void wang_rnd_0(__global unsigned int * rnd_buffer,int id)
{
uint maxint=0;
maxint--;
uint rndint=wang_hash(id);
rnd_buffer[id]=rndint;
}
もう1つは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