¿Se produce la serialización de accesos simultáneos a la memoria global a una dirección cuando hay niveles de caché L1 y L2?

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

  •  21-12-2019
  •  | 
  •  

Pregunta

Según lo que sé, cuando los subprocesos de un warp acceden a la misma dirección en la memoria global, las solicitudes se serializan, por lo que es mejor usar memoria constante.¿Se produce la serialización de accesos simultáneos a la memoria global cuando la GPU está equipada con niveles de caché L1 y L2 (en la arquitectura Fermi y Kepler)?En otras palabras, cuando los subprocesos de un warp acceden a la misma dirección de memoria global, ¿31 subprocesos de un warp se benefician de la existencia de caché porque 1 subproceso ya ha solicitado esa dirección?¿Qué sucede cuando el acceso es de lectura y también cuando el acceso es de escritura?

¿Fue útil?

Solución

Los accesos globales simultáneos a la misma dirección por parte de subprocesos en la misma deformación en Fermi y Kepler no se serializan.La lectura warp tiene un mecanismo de transmisión que satisface todas esas lecturas desde una única lectura de línea de caché sin afectar el rendimiento.El rendimiento es el mismo que si se tratara de una lectura totalmente fusionada.Esto es cierto independientemente de las características específicas de la caché; por ejemplo, es cierto incluso si el almacenamiento en caché L1 está deshabilitado.

El rendimiento de escrituras simultáneas no está especificado (AFAIK) pero conductualmente, las escrituras simultáneas siempre se serializan y el orden no está definido.

EDITAR respondiendo a las preguntas adicionales a continuación:

  1. Incluso si todos los hilos en el warp escriben el mismo valor en la misma dirección, ¿se serializa?¿No existe un mecanismo de transmisión de escritura que reconozca tal situación?

No existe un mecanismo de transmisión de escritura que analice todas las escrituras simultáneas para ver si son todas iguales y luego tomar alguna medida en función de eso.La respuesta correcta es que las escrituras ocurren en un orden no especificado y las características de rendimiento no están definidas.Obviamente, si todos los valores que se escriben son iguales, puede estar seguro de que el valor que termine en la ubicación será ese valor.Pero si pregunta si la actividad de escritura está colapsada en un solo ciclo o requiere varios ciclos para completarse, ese comportamiento real no está definido (no está documentado) y, de hecho, puede variar de una arquitectura a otra (por ejemplo, cc1.x puede serializarse de tal manera que se realicen todas las escrituras, mientras que cc2.x puede "serializarse" de tal manera que una escritura "gane" y todas las demás se realicen). descartado, sin consumir ciclos reales.) Nuevamente, el rendimiento no está documentado/no especificado, pero el observable por programa Se define la conducta.

2 Con este mecanismo de transmisión que usted explicó, la única diferencia entre el acceso de transmisión constante a la memoria y el acceso de transmisión a la memoria global es que el primero puede enrutar el acceso hasta la memoria global, pero el segundo tiene un hardware dedicado y es más rápido, ¿verdad?

__constant__ La memoria utiliza el caché constante, que es una pieza de hardware dedicada que está disponible por SM, y almacena en caché una sección particular de la memoria global en un solo lectura moda.Esta caché de hardware está física y lógicamente separada de la caché L1 (si existe y está habilitada) y de la caché L2.Para Fermi y más allá, ambos mecanismos admiten transmisión en lectura, y para caché constante, este es el patrón de acceso preferido, porque la caché constante solo puede dar servicio a un acceso de lectura por ciclo (es decir,no admite una línea de caché completa leída por un warp.) Cualquiera de los mecanismos puede "acertar" en el caché (si está presente) o "fallar" y desencadenar una lectura global.En la primera lectura de una ubicación determinada (o línea de caché), ninguna de las cachés tendrá los datos solicitados y, por lo tanto, "perderá" y activará una lectura de memoria global para atender el acceso.A partir de entonces, en cualquier caso, las lecturas posteriores se eliminarán de la caché, suponiendo que los datos relevantes no se eliminen mientras tanto.Para los primeros dispositivos cc1.x, la memoria caché constante era bastante valiosa ya que esos primeros dispositivos no tenían una caché L1.Para Fermi y más allá, la razón principal para usar el caché constante sería si los datos identificables (es decir,solo lectura) y patrones de acceso (misma dirección por warp) están disponibles, entonces el uso del caché constante evitará que esas lecturas viajen a través de L1 y posiblemente desalojen otros datos.De hecho, está aumentando un poco el espacio que se puede almacenar en caché, por encima de lo que la L1 puede soportar por sí sola.

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