Pregunta

Una cosa que no he descubierto y Google no me está ayudando, es por eso que es posible tener conflictos con los bancos de memoria compartida, pero no en la memoria global? ¿Puede haber conflictos con registros bancarios?

Actualizar Wow realmente aprecio las dos respuestas de Tibbit y grisáceo. Parece que sólo puedo dar una marca de verificación verde para una respuesta sin embargo. Soy bastante nuevo a desbordamiento de pila. Creo que tengo que elegir una respuesta como la mejor. ¿Puedo hacer algo para decir gracias a la respuesta que no me importa una verificación verde para?

¿Fue útil?

Solución

Respuesta corta:. No hay conflictos de banco, ya sea en la memoria global o en los registros

Explicación:

La clave para entender por qué es captar la granularidad de las operaciones. Un solo hilo no tiene acceso a la memoria global. accesos de memoria a nivel mundial se "fundieron". Dado que la memoria global es taaan lento, cualquier acceso de los hilos dentro de un bloque se agrupan juntos para hacer el menor número de solicitudes a la memoria global posible.

La memoria compartida se puede acceder por hilos simultáneamente. Cuando dos hilos intentan acceder a una dirección dentro del mismo banco, esto provoca un conflicto banco.

Registros no se puede acceder por cualquier hilo excepto aquella a la que se le asigna. Puesto que no puede leer o escribir en mis registros, usted no me puede bloquear el acceso a ellos - por lo tanto, no hay conflictos bancarias

.

¿Quién puede leer y escribir a la memoria global?

Only blocks. Un solo hilo puede hacer un acceso, pero la transacción será procesada a nivel de bloque (en realidad el nivel de urdimbre urdimbre / media, pero no estoy tratando de ser complicado). Si dos bloques de acceder a la misma memoria, no creo que se necesitará más tiempo y puede suceder acelerado por la caché L1 en los dispositivos más nuevos -. Aunque esto no es evidente de forma transparente

¿Quién puede leer y escribir a la memoria compartida?

Any thread within a given block. Si sólo tiene 1 hilo por bloque no se puede tener un conflicto banco, pero que no tendrá un rendimiento razonable. conflictos bancarios se deben a que un bloque se asigna con varios, por ejemplo de 512 hilos y todo lo que están compitiendo por diferentes direcciones dentro del mismo banco (no es exactamente la misma dirección). Hay algunos excelentes fotos de estos conflictos al final de la programación CUDA C Guía - La figura G2, en la página 167 (en realidad la página 177 del pdf). Enlace a la versión 3.2

¿Quién puede leer y escribir a los registros?

Only the specific thread to which it is allocated. Por lo tanto sólo un hilo tiene acceso a él a la vez.

Otros consejos

si hay o no puede haber conflictos de banco en un determinado tipo de memoria es, obviamente, depende de la estructura de la memoria y, por tanto, de su propósito.

¿Por qué es la memoria compartida diseñado de una manera que permite conflictos bancarias?

Eso es relativamente simple, no es fácil diseñar un controlador de memoria que puede manejar accesos independientes a la misma memoria de forma simultánea (probado por el hecho de que la mayoría no puede). Así que con el fin de permitir que cada hilo en un halfwarp para acceder a una palabra dirigida de manera individual y se deposita la memoria, con un controlador independiente para cada banco (al menos eso es lo que uno puede pensar en ello, no estoy seguro sobre el hardware real). Estos bancos son intercalados para hacer roscas secuenciales acceso secuencial rápido de memoria. Así que cada uno de estos bancos pueden manejar una solicitud a la vez lo ideal teniendo en cuenta las ejecuciones simultáneas de todas las solicitudes en el halfwarp (obviamente, este modelo puede sostener teóricamente mayor ancho de banda debido a la independencia de los bancos, que también es un plus).

¿Qué hay de registros?

Los registros están diseñados para utilizarse como operandos para instrucciones de la ALU, lo que significa que tienen que ser visitada con una latencia muy baja. Por lo tanto consiguen más transistores / bits para hacerlo posible. No estoy seguro exactamente cómo se accede a los registros en procesadores modernos (no el tipo de información que a menudo y no tan fácil de encontrar fuera necesario). Sin embargo es obvio que sería muy poco práctico para organizar registros en los bancos (para arquitecturas más simples que normalmente se ve todos los registros que cuelga en una gran multiplexor). Así que no, no habrá conflictos bancarios para los registros.

Memoria global

En primer lugar la memoria global trabaja en una granularidad diferente de memoria compartida a continuación. Se accede a la memoria en 32, 64 ó 128Byte bloques (por GT200 al menos, de Fermi es siempre 128B, pero en caché, AMD es un poco diferente), donde cada vez que quiere algo de un bloque se accede / transferido todo el bloque. Por eso es necesario accesos fundidas, ya que si cada hilo accesos a la memoria de un bloque diferente que tiene que transferir todos los bloques.

Pero, ¿quién dice que no hay conflictos de banco? No estoy completamente seguro de esto, porque no he encontrado ninguna fuente real para apoyar esto para el hardware de NVIDIA, pero parece lógico: La memoria global se distribuye normalmente a varios chips de memoria RAM (que se pueden verificar fácilmente mirando en un GraphicsCard). Tendría sentido, si cada uno de estos chips es como un banco de memoria local, por lo que se obtendría conflictos bancarios si hay varias solicitudes simultáneas en el mismo banco. Sin embargo, los efectos serían mucho menos pronunciados para una cosa (ya que la mayor parte del tiempo consumido por los accesos a memoria es la latencia para obtener los datos de A a B de todos modos), y que no será un efecto noticible "dentro" de un grupo de trabajo (ya que sólo uno ejecuta halfwarp a la vez y en caso de que las cuestiones halfwarp más de una solicitud que tiene un acceso a la memoria uncoalesced, por lo que ya está tomando un éxito por lo que es difícil medir los efectos de este conflicto. Por lo que sólo se obtendría conflictos si varios grupos de trabajo tratar de acceder al mismo banco. en su situación típica para GPGPU tiene una gran base de datos situada en la memoria secuencial por lo que los efectos no debería ser noticible ya que no hay suficientes otros grupos de trabajo accessinng los otros bancos, al mismo tiempo, pero debería ser posible construir situaciones en las que el conjunto de datos se centra en unos pocos bancos, lo que haría para un golpe de ancho de banda (ya que el ancho de banda máximo vendría de la distribución de equaly acceso en todos los bancos, por lo que cada banco o ólo tener una fracción de ese ancho de banda). Una vez más no he leído nada que demostrar esta teoría para el hardware de NVIDIA (en su mayoría se centra sobre todo coalescencia, que por supuesto es más importante, ya que hace de este un no problemática para los conjuntos de datos naturales a). Sin embargo, según el cálculo de ATI Stream guide esta es la situación para las tarjetas Radeon (por 5xxx: los bancos son de 2 kb aparte y que desea asegurarse de que distribuya sus accesos (es decir de todos worgroups simulateously activos) equaly sobre todos los bancos), así que me imagino que las tarjetas NVidia comportan similary .

Por supuesto, para la mayoría scenarious la posibilidad de conflictos de banco en la memoria global es un tema que no, por lo que en la práctica se puede decir:

  • Reloj de coalescencia cuando se accede a la memoria global
  • Reloj de conflictos bancarias cuando se accede a la memoria local
  • No hay problemas con acceso a los registros

múltiples hilos que accedan al mismo banco no necesariamente significa que hay un conflicto banco. Hay un conflicto si las roscas quieren leer al mismo tiempo desde una fila diferente dentro del mismo banco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top