Asignación de un número de hilo a una posición (no secuencial) en una matriz

StackOverflow https://stackoverflow.com/questions/2245577

  •  20-09-2019
  •  | 
  •  

Pregunta

Me gustaría asignar una thread_id. Esto en C / CUDA pero es más un problema algebraico que estoy tratando de resolver.

Así que el mapeo que estoy tratando de lograr es a lo largo de las líneas:

  • Hilos 0-15: array valor leído [0]
  • Hilos 16-31: valor leído [3]
  • Hilos 32-47: valor leído [0]
  • Hilos 48-63: valor leído [3]
  • Hilos 64-79: array valor leído [6]
  • Hilos 80-95: array valor leído [9]
  • Hilos 96-111: array valor leído [6]
  • Hilos 112-127: array valor leído [9]

y así sucesivamente ..

Tenga en cuenta que esto es una simplificación de la asignación, en realidad hay más de 128 hilos, pero la secuencia es como se muestra y las discusiones siempre se asignan a un múltiplo de tres.

¿Qué fórmula puedo utilizar que cada hilo puede ejecutar para averiguar qué posición de matriz debe mirar?

Me gustaría usar algún tipo de fórmula como lo he hecho en el siguiente ejemplo y no un mapa explícito o cualquier declaración si-.

Para ilustrar cómo he resuelto este para un caso diferente, que requiere un mapeo diferente, es decir:.

  • Hilos 0-31: array valor leído [0]
  • Hilos 32-63: valor leído [3]

He utilizado el código

rintf(float(tid)/96.0)*3
¿Fue útil?

Solución

Esto funcionará en C:

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

donde n es el número hilo.

Hice el supuesto aquí que el patrón continúa más allá de 128, como:. 0,3,0,3,6,9,6,9,12,15,12,15, etc.

Editar

Esta forma, sin operaciones bit a bit, puede ser más fácil de entender:

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

Se le dará los mismos resultados. n se supone que es un número entero, de modo que la división se redondea hacia abajo.

Otros consejos

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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top