CUDAでの乱数
をテンプレートにして作成
[
トップ
|
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
*CUDAでの乱数 [#m0a38666]
C for CUDAではC言語のrand関数のような乱数を生成する関数は...
C言語のrand関数は乱数の質としては問題があるが気軽に使える...
CUDA SDKにはメルセンヌツイスターのサンプルがあるのでこれ...
ここでは,より簡単に実装できる線形合同法とXORシフト法をデ...
**線形合同法 [#sd08ddf4]
C言語のrand関数などで使われている方法.
#code(C){{
__device__
unsigned int Rand(unsigned int randx)
{
randx = randx*1103515245+12345;
return randx&2147483647;
}
}}
ただし,スレッドごとに異なるrandxを用意して,返値のrandx...
また,一度のカーネル関数呼び出し内でスレッドごとに乱数を...
事前に乱数テーブルをデバイスメモリ(テクスチャメモリやコン...
**XORシフト法 [#ddf9f989]
"Xorshift RNGs"という論文
((G. Marsaglia, "Xorshift RNGs", Journal of Statistical S...
で提案されている方法.
高速で質もよく,簡単に実装できるのでお勧め.
#code(C){{
__device__ static unsigned long xors_x = 123456789;
__device__ static unsigned long xors_y = 362436069;
__device__ static unsigned long xors_z = 521288629;
__device__ static unsigned long xors_w = 88675123;
__device__
unsigned long Xorshift128()
{
unsigned long t;
t = (xors_x^(xors_x<<11));
xors_x = xors_y; xors_y = xors_z; xors_z = xors_w;
return ( xors_w = (xors_w^(xors_w>>19))^(t^(t>>8)) );
}
__device__
long Xorshift128(long l, long h)
{
unsigned long t;
t = (xors_x^(xors_x<<11));
xors_x = xors_y; xors_y = xors_z; xors_z = xors_w;
xors_w = (xors_w^(xors_w>>19))^(t^(t>>8));
return l+(xors_w%(h-l));
}
__device__
float XorFrand(float l, float h)
{
return l+(h-l)*(Xorshift128(0, 1000000)/1000000.0f);
}
}}
終了行:
*CUDAでの乱数 [#m0a38666]
C for CUDAではC言語のrand関数のような乱数を生成する関数は...
C言語のrand関数は乱数の質としては問題があるが気軽に使える...
CUDA SDKにはメルセンヌツイスターのサンプルがあるのでこれ...
ここでは,より簡単に実装できる線形合同法とXORシフト法をデ...
**線形合同法 [#sd08ddf4]
C言語のrand関数などで使われている方法.
#code(C){{
__device__
unsigned int Rand(unsigned int randx)
{
randx = randx*1103515245+12345;
return randx&2147483647;
}
}}
ただし,スレッドごとに異なるrandxを用意して,返値のrandx...
また,一度のカーネル関数呼び出し内でスレッドごとに乱数を...
事前に乱数テーブルをデバイスメモリ(テクスチャメモリやコン...
**XORシフト法 [#ddf9f989]
"Xorshift RNGs"という論文
((G. Marsaglia, "Xorshift RNGs", Journal of Statistical S...
で提案されている方法.
高速で質もよく,簡単に実装できるのでお勧め.
#code(C){{
__device__ static unsigned long xors_x = 123456789;
__device__ static unsigned long xors_y = 362436069;
__device__ static unsigned long xors_z = 521288629;
__device__ static unsigned long xors_w = 88675123;
__device__
unsigned long Xorshift128()
{
unsigned long t;
t = (xors_x^(xors_x<<11));
xors_x = xors_y; xors_y = xors_z; xors_z = xors_w;
return ( xors_w = (xors_w^(xors_w>>19))^(t^(t>>8)) );
}
__device__
long Xorshift128(long l, long h)
{
unsigned long t;
t = (xors_x^(xors_x<<11));
xors_x = xors_y; xors_y = xors_z; xors_z = xors_w;
xors_w = (xors_w^(xors_w>>19))^(t^(t>>8));
return l+(xors_w%(h-l));
}
__device__
float XorFrand(float l, float h)
{
return l+(h-l)*(Xorshift128(0, 1000000)/1000000.0f);
}
}}
ページ名: