2016-06-29 8 views
1

Ich arbeite an einem Programm, in dem es zwei Hauptkerne gibt.Welche Dimension sollte der cuRAND-Initialisierungskernel haben

Aufgrund der Auswirkungen auf die Leistung hat jeder Kernel seine eigenen Dimensionen. Somit habe ich 2 verschiedene Block- und Rastergrößen (deren Werte zur Kompilierzeit nicht bekannt sind).

Beide Kernel müssen die cuRAND-Bibliothek verwenden, also bevor ein dritter Kernel gestartet wird, um den cuRAND-Zustand auf dem Gerät zu initialisieren.

Meine Frage kommt, wenn ich die Dimensionen dieses Kernels wählen muss.

Lassen Sie uns sagen, dass ich für den Kernel 1 und 2:

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

Für die cuRAND Initialisierung Kernel, sollte ich die größten Größen verwenden (10*512) oder die höchste Anzahl der Threads (10*256)?

+2

Sie sollten die [Dokumentation] (http://docs.nvidia.com/cuda/curand/index.html) lesen. Deine Frage ist unklar ... – havogt

Antwort

1

Wählen Sie die größte Kernelgröße aus, da dies die maximale Anzahl an cuRand-Generatoren ist, die Sie verwenden. Sie können easyly bewerten die Größe, die Sie so etwas wie

__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]); 
} 

Bearbeiten mit brauchen: Ich war asumming dass block_size * grid_size nicht über die maximale Thread-Limit gehen, sonst können Sie das gleiche tun, aber als gut das Gitter und Blockmaß halten und Starten Sie diese Anzahl von Threads setup_curand<<<x, y>>>(...);