2010-02-11 4 views
1

Je souhaite mapper un thread_id. C'est en C/CUDA mais c'est plus un problème algébrique que j'essaie de résoudre.Mappage d'un numéro de thread à une position (non séquentielle) dans un tableau

Ainsi, la cartographie que je suis en train de réaliser est le long des lignes:

  • Threads 0-15: tableau de valeur lue [0]
  • Threads 16-31: valeur lue [3]
  • Fils 32-47: lire la valeur [0]
  • Fils 48-63: lire la valeur [3]
  • Fils 64-79: matrice de valeur lue [6]
  • Fils 80-95: matrice de valeur lue [9 ]
  • Threads 96-111: tableau de valeur lue [6]
  • Threads 112-127: tableau de valeur lue [9]

et ainsi de suite ..

Notez que cette simplification du mapping, en réalité il y a plus de 128 threads mais la séquence est comme montrée et les threads seront toujours mappés à un multiple de trois.

Quelle formule puis-je utiliser pour que chaque thread puisse s'exécuter pour déterminer la position du tableau qu'il doit regarder?

Je voudrais utiliser une sorte de formule comme je l'ai dans l'exemple suivant et non une carte explicite ou des instructions if.

Pour illustrer la façon dont je l'ai résolu ce pour un autre cas qui a nécessité une cartographie différente, à savoir:

  • Threads 0-31: tableau de valeur lue [0]
  • Threads 32-63: valeur lue [3]

je le code

rintf(float(tid)/96.0)*3 
+1

Personnellement, je ne trouve aucune question –

+0

Est-ce que c'est plus clair? – zenna

Répondre

6

Cela fonctionne dans C:

3 * ((n>>4 & 1) + (n>>5 & ~1)) 

n est le numéro de fil. J'ai fait l 'hypothèse ici que le modèle continue au - delà de 128 comme: 0,3,0,3,6,9,6,9,12,15,12,15, etc.

Edit:

Cette forme, sans opérations de manipulation de bits, peut être plus facile à comprendre:

6 * (n/64) + 3 * ((n/16) % 2) 

Il donnera les mêmes résultats. n est supposé être un nombre entier, de sorte que la division sera arrondie vers le bas.

+0

Excuses, j'ai regardé les réponses affichées et j'apprécie les réponses. Je ne suis pas sûr de la façon dont votre solution fonctionne. – zenna

+0

J'ai ajouté une version plus simple. Faites-moi savoir si elle a besoin de clarification. – interjay

+0

Dans le premier exemple avec des opérations sur les bits, vous ne devriez pas avoir '' & 1' appliqué au 'n >> 4' puisque cela fera répéter la séquence 0,3,0,3,6,9,6,9 plutôt que continuer. +1 dans tous les cas. – Tom

0
int f(int thread_id) 
{ 
    int tmp = thread_id % 64; 
    int tmp2 = thread_id/64; 
    if (tmp =< 15 || (tmp >= 32 && tmp <= 47)) { 
     return tmp2 * 6; 
    } else { 
     return tmp2 * 6 + 3; 
    } 
} 
Questions connexes