2016-06-29 10 views
1

私は2つの主要なカーネルがあるプログラムで作業しています。性能への影響に起因しcuRAND初期化カーネルにはどのような次元がありますか

は、各カーネルは、それ自身の寸法を有します。したがって、私は2つの異なるブロックとグリッドサイズ(その値はコンパイル時に知ることができません)を持っています。

両方のカーネルは、第三カーネルがデバイス上cuRAND状態を初期化するために起動される前にして、cuRANDライブラリを使用する必要があります。私はこのカーネルの寸法を選択する必要がある場合

私の質問が来ます。

のは、私はカーネル1と2を持っているとしましょう:cuRAND初期化カーネルについては

block_size_1 = 256 
grid_size_1 = 10 
block_size_2 = 512 
grid_size_2 = 2 

を、私は最も大きいサイズ(10*512)、またはスレッドの最大数(10*256)を使用する必要がありますか?それはあなたが使用しますcuRand発電機の最大数であるため、

+2

の数を起動(http://docs.nvidia.com/cuda/curand/index.html)。あなたの質問は不明です... – havogt

答えて

1

は、最大カーネルサイズを選んでください。あなたはeasylyあなたが

__host__ void fun(){ 
    curandState * randState; 
    int myCurandSize = ((block_size1 * grid_size1) > (block_size2 * grid_size2))? Block_size1 * Grid_size1 : Block_size2 * Grid_size2); 
    error = cudaMalloc((void **)&randState, myCurandSize * sizeof(curandState)); 
    if (error == cudaErrorMemoryAllocation){ 
     cudaDeviceReset(); 
     return 1; 
    } 
    setup_cuRand <<<1, myCurandSize>>> (randState, unsigned(time(NULL))); 

    //Don't forget to free the space 
    cudaFree(randState); 
} 

__global__ void setup_cuRand(curandState * state, unsigned long seed) 
{ 
    int id = threadIdx.x; 
    curand_init(seed, id, 0, &state[id]); 
} 

編集のようなものを使用している必要サイズを評価することができます:私はblock_size * grid_sizeがそうでなければ、あなたが同じことを行うことができ、最大スレッド制限を超えないことをasummingが、グリッドとブロックの寸法aswell保っていたとあなたは[ドキュメント]をお読みくださいスレッドsetup_curand<<<x, y>>>(...);

関連する問題