IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

CUDA Discussion :

Demande d'explications sur le concept de réduction de vecteur


Sujet :

CUDA

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 0
    Points
    0
    Par défaut Demande d'explications sur le concept de réduction de vecteur
    bonsoir à tous le monde

    Dans un exemple du livre cuda by example, j'ai pas compris ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i = blockDim.x/2;
    while (i != 0) {
        if (cacheIndex < i)
            cache[cacheIndex] += cache[cacheIndex + i];
        __syncthreads();
        i /= 2;
    }
    j'ai pas compris pourquoi il a besoin de int i = blockDim.x/2;
    alors il dit :

    The general idea is that each thread will add two of the values in cache[] and
    store the result back to cache[].
    pourquoi ne pas utiliser int i=thread.x/2
    Merci

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Merci de faire attention à la présentation de ton message (balises CODE et QUOTE, indentation, ponctuation)

    Si, je suppose que c'est le code de 79 ? Avec la figure 5.4, c'est pas clair ? Tu démarre bien à la moitié de la largueur du block

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 0
    Points
    0
    Par défaut réponse
    bonjour merci pour votre réponse voici le code complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    __global__ void dot( float *a, float *b, float *c ) {
    __shared__ float cache[threadsPerBlock];
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    int cacheIndex = threadIdx.x;
    float temp = 0;
    while (tid < N) {
    temp += a[tid] * b[tid];
    tid += blockDim.x * gridDim.x;
    }
    // set the cache values
    cache[cacheIndex] = temp;
    // synchronize threads in this block
    __syncthreads();
    // for reductions, threadsPerBlock must be a power of 2
    // because of the following code
    int i = blockDim.x/2;
    while (i != 0) {
    if (cacheIndex < i)
    cache[cacheIndex] += cache[cacheIndex + i];
    __syncthreads();
    i /= 2;
    }
    if (cacheIndex == 0)
    c[blockIdx.x] = cache[0];
    }
    je n'arrive pas à comprendre pourquoi ils utilisent l'instruction int i = blockDim.x/2;
    pourtant la réduction de fait pour les threads d'un même block
    Je vous remercie d'avance

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Sérieusement, ça commence à m'aggacer ton code non correctement indenté. Il faut que tu fasses attention...
    Ton code d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    __global__ void dot( float *a, float *b, float *c ) {
    __shared__ float cache[threadsPerBlock];
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    int cacheIndex = threadIdx.x;
    float temp = 0;
    while (tid < N) {
    temp += a[tid] * b[tid];
    tid += blockDim.x * gridDim.x;
    }
    // set the cache values
    cache[cacheIndex] = temp;
    // synchronize threads in this block
    __syncthreads();
    // for reductions, threadsPerBlock must be a power of 2
    // because of the following code
    int i = blockDim.x/2;
    while (i != 0) {
    if (cacheIndex < i)
    cache[cacheIndex] += cache[cacheIndex + i];
    __syncthreads();
    i /= 2;
    }
    if (cacheIndex == 0)
    c[blockIdx.x] = cache[0];
    }
    Ton code correctement indenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    __global__ void dot( float *a, float *b, float *c ) {
        __shared__ float cache[threadsPerBlock];
        int tid = threadIdx.x + blockIdx.x * blockDim.x;
        int cacheIndex = threadIdx.x;
        float temp = 0;
        while (tid < N) {
            temp += a[tid] * b[tid];
            tid += blockDim.x * gridDim.x;
        }
        // set the cache values
        cache[cacheIndex] = temp;
        // synchronize threads in this block
        __syncthreads();
        // for reductions, threadsPerBlock must be a power of 2
        // because of the following code
        int i = blockDim.x/2;
        while (i != 0) {
            if (cacheIndex < i)
                cache[cacheIndex] += cache[cacheIndex + i];
            __syncthreads();
            i /= 2;
        }
        if (cacheIndex == 0)
            c[blockIdx.x] = cache[0];
    }
    Si tu veux de l'aide, fais un effort.

    Regarde la différence entre une réduction "classique" (par exemple http://cs.anu.edu.au/student/comp332...preduction.jpg) et la figure 5.4.
    Dans le cas classique, après 1 itération, tu as 1 threads sur 2 qui travaillent, après la 2ème itération, tu as 1 sur 4 qui travaillent, etc. Le code dont tu parles regroupe les résultats des calculs ensemble.
    Je te conseille de prendre un papier et un crayon pour tester les valeurs prises par les variables à chaque cycle

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 0
    Points
    0
    Par défaut remerciment
    bonjour merci pour ton aide j'excuse pour le code mal indenté
    s'il te plait j'ai compris le principe de réduction mais j'ai pas compris le rôle de cette instruction int i = blockDim.x/2 puisque nous somme dans le même block
    Merci

Discussions similaires

  1. Demande d explication sur protocole FTP
    Par Mr_Chut dans le forum Réseau
    Réponses: 1
    Dernier message: 04/05/2007, 19h47
  2. Réponses: 4
    Dernier message: 09/10/2006, 23h12
  3. Réponses: 3
    Dernier message: 27/09/2006, 14h11
  4. [C#] demande d'explication sur un sample msdn
    Par legillou dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/06/2006, 18h01
  5. [final]demande d'explication sur ce mot-clé
    Par Invité dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo