2011-08-11 13 views
6

Voy a paralelizar en CUDA un algoritmo de búsqueda local para algún problema de optimización. El problema es muy difícil, por lo que el tamaño de los problemas prácticamente solucionables es bastante pequeño. Mi preocupación es que el número de hilos previsto para funcionar en un solo núcleo es insuficiente para obtener cualquier aceleración en la GPU (incluso suponiendo que todos los hilos se fundieron, libre de conflictos de banco, sin ramificación, etc.). Digamos que un kernel se lanza para 100 hilos. ¿Es razonable esperar ganancias con el uso de GPU? ¿Qué pasa si la cantidad de hilos es 1000? ¿Qué información adicional se necesita para analizar el caso?número mínimo de hilos de GPU para ser eficaz

+0

Probablemente no habrá mucha ventaja en tener 100 hilos - la programación CUDA por lo general se convierte en práctica si tiene miles de hilos, y sobre todo si todos hacen lo mismo. –

+0

Para ser preciso, quiere decir que los hilos de la misma urdimbre deben hacer lo mismo, ¿no? – AdelNick

+0

escribe un prototipo que haga lo que necesitas y luego preocúpate por acelerarlo. Mire en empuje si hay algo similar a lo que necesita. – fabrizioM

Respuesta

7

100 hilos no es realmente suficiente. Lo ideal es que desee un tamaño que se pueda dividir en al menos tantos bloques de subprocesos como multiprocesadores (SM) en la GPU, de lo contrario dejará los procesadores inactivos. Cada bloque de hilos debe tener no menos de 32 hilos, por el mismo motivo. Idealmente, debe tener un pequeño múltiplo de 32 hilos por bloque (digamos 96-512 hilos), y si es posible, múltiples de estos bloques por SM.

Como mínimo, debe tratar de tener suficientes hilos para cubrir la latencia aritmética de los SM, lo que significa que en una GPU Compute Capability 2.0, necesita alrededor de 10-16 warps (grupos de 32 hilos) por SM. Sin embargo, no todos necesitan venir del mismo bloque de hilos. Así que eso significa, por ejemplo, en una GPU Tesla M2050 con 14 SM, necesitaría al menos 4480 hilos, divididos en al menos 14 bloques.

Dicho esto, un menor número de hilos que esto también podría proporcionar un aumento de velocidad - que depende de muchos factores. Si el cálculo está vinculado al ancho de banda, por ejemplo, y puede mantener los datos en la memoria del dispositivo, entonces podría obtener una aceleración porque el ancho de banda de la memoria del dispositivo GPU es más alto que el ancho de banda de la memoria de la CPU. O bien, si se trata de un límite de cálculo, y hay un gran paralelismo de nivel de instrucción (instrucciones independientes del mismo hilo), entonces no necesitará tantos hilos para ocultar la latencia. Este último punto se describe muy bien en "Better performance at lower occupancy" talk de Vladimir Volkov de GTC 2010.

Lo principal es asegurarse de usar todos los SM: sin hacerlo, no está utilizando todo el rendimiento de cómputo o ancho de banda de la GPU puede proporcionar.

+0

gracias por una respuesta detallada y un enlace útil. – AdelNick

+0

@harrism: ¿Hay algún lugar en la guía de programación en el que hablen sobre el número de subprocesos que se usarán para que la tarea sea efectiva? – Programmer

Cuestiones relacionadas