2012-04-20 17 views
5

El término divergencia de hilos se usa en CUDA; según entiendo, es una situación en la que se asignan diferentes hilos para realizar tareas diferentes y esto da como resultado un gran golpe de rendimiento.divergencia de hilo de Openmp?

Me preguntaba, ¿hay alguna penalización similar por hacer esto en openmp? Por ejemplo, supongamos que tengo un procesador de 6 núcleos y un programa con 6 hilos. Si tengo un condicional que hace que 3 hilos realicen una determinada tarea, y luego los otros tres hilos realizan una tarea completamente diferente, ¿habrá un gran golpe de rendimiento? Supongo que, en esencia, es como usar openmp para hacer MIMD.

Básicamente, estoy escribiendo un programa con openmp y CUDA. Quiero dos hilos para ejecutar un núcleo CUDA mientras que los otros sobrantes ejecutan código C. Gracias.

+0

Simplemente curioso, ¿cómo podría uno hacer esto en OpenMP? Sé que ya has respondido tu pregunta, pero sería bueno ver un fragmento de código. –

+0

Esto no está relacionado con el tema, pero antes de que su código de host sea demasiado complicado, es posible que no necesite más de un hilo de CPU para CUDA, con CUDA 4.0 y posterior programación de múltiples GPUs se puede hacer desde un solo hilo de host, tiene que hacer un trabajo paralelo en el lado del host, es posible que los subprocesos múltiples no agreguen nada más que complejidad. Si tiene que hacer un trabajo paralelo en la CPU, podría usar un hilo de la CPU para CUDA y el resto para hacer el trabajo de la CPU en paralelo. – harrism

Respuesta

7

No, no hay ningún golpe de rendimiento para subprocesos divergentes que usan OpenMP. Es un problema en CUDA debido a la forma en que las instrucciones se transmiten simultáneamente a un conjunto de núcleos. Cuando un hilo OpenMP se dirige a un núcleo de CPU, cada núcleo de CPU tiene su propio conjunto independiente de instrucciones a seguir, y se ejecuta como lo haría cualquier otro programa de subproceso único.

Es posible que vea algunos de sus núcleos subutilizados si tiene barreras de sincronización después de la divergencia del hilo, porque eso obligaría a los hilos más rápidos a esperar a que los hilos más lentos se pongan al día.

+0

¡Gracias por la respuesta! Primera publicación en desbordamiento de pila y obtengo dos respuestas en 10 minutos. Bastante impresionante. – Justin

3

Cuando se habla de paralelismo de CPU, no se obtiene un rendimiento intrínseco al utilizar un determinado patrón de diseño de subprocesos. No al nivel teórico al menos.

El único problema que veo es que debido a que los hilos están haciendo cosas diferentes que pueden tener diferentes tiempos de finalización, algunos de los hilos pueden permanecer inactivos después de terminar su trabajo, esperando que los demás terminen una tarea más larga.

+0

Gracias por la respuesta. – Justin

1

El término divergencia de subprocesos en CUDA se refiere a la situación en la que no todos los subprocesos de un bock evalúan un condicional con el mismo resultado. Dichos hilos se dice que divergen. Si los subprocesos divergentes están en la misma distorsión, dichos subprocesos pueden realizar trabajos en serie, lo que conduce a la pérdida de rendimiento.

No estoy seguro de que OpenMP tenga el mismo problema. Cuando diferentes subprocesos realizan un trabajo diferente, entonces el equilibrio de carga puede ser utilizado por el tiempo de ejecución, pero no conduce necesariamente a la serialización del trabajo.

1

no hay este tipo de problema en openmp porque cada hilo de openmp tiene su propia PC.