2012-04-07 26 views
6

Diga si el núcleo A está modificando una variable X y el núcleo B está leyendo esa variable (X). Por supuesto, en este caso, un protocolo de coherencia de caché actualizará el caché del núcleo B, porque X ha sido modificado por el núcleo A y, por supuesto, la coherencia del caché reducirá la ejecución en el núcleo B. Sin embargo, ¿afectará esta coherencia al funcionamiento del núcleo A? suponiendo que la variable X reside en su caché.Cómo la coherencia de la memoria caché afecta el rendimiento en este caso

Respuesta

3

Sí. Hay varias formas en que puede afectar el rendimiento. El protocolo estándar que las personas utilizan es una variante de MSI (Modificado, Compartido, Inválido), a veces con O (Propietario) y, a menudo, E (Exclusivo) agregado al protocolo. En su ejemplo, el núcleo A comenzaría en el estado Modificado (o Exclusivo), y la lectura del núcleo B obligaría al núcleo A a cambiarlo al estado Compartido. Esta acción ocupa ciclos en la memoria caché, ya que solo hay tantas operaciones que el núcleo puede realizar en cualquier momento dado. El impacto de esto en el Core A no es muy alto, ya que no está en la ruta crítica. El mayor impacto es si Core A hace una escritura nuevamente. Como la línea de caché está en el estado compartido (o inválido), debe emitir una solicitud para actualizarse a M o E. Esa solicitud debe ir al Core B. Esta operación se encuentra en la ruta crítica y la escritura no puede finalizar hasta que el bloque de caché se actualiza. Dicho esto, las escrituras generalmente se almacenan en búfer y, por lo general, el procesador no se bloqueará en esta operación.

+0

En mi caso, el Core A escribe con frecuencia, y el core B a veces lee con frecuencia, así que supongo que dañará bastante el rendimiento. ¿derecho? – pythonic

+2

Si la mayoría de lo que hace el núcleo a es escribir y la mayoría de lo que el núcleo b está haciendo es leer, entonces sí, puede tener problemas. Esto generalmente se llama ping-ponging. ¿Qué tipo de comunicación estás tratando de hacer? Hay toneladas de documentos sobre esto. Por ejemplo, si está produciendo algo en el núcleo A y desea consumirlo en el núcleo B, entonces debe usar una estructura de fila de la cola que no se pueda cerrar y que evite tanto ping-ponging como sea posible. (Debe tener conceptos como shadow head y shadow tail.) –

+0

Nathan, gracias por un comentario tan informativo. Voy a analizar este ping-ponging con más detalle. – pythonic

2

Sí, en las microarquitecturas actuales que usan protocolos de coherencia SI (O) SI, ralentizará también las actualizaciones de A a X. La razón de esto es que la lectura de B colocará la línea de caché que contiene X en el estado 'compartido' antes de copiarla, y luego la escritura de A tendrá que invalidar la copia de B para ingresar el estado 'exclusivo' antes de que pueda modificarlo nuevamente.

Dicho todo esto, las escrituras de A a X podrían no detener realmente la tubería de ejecución de A. Esto depende del modelo de coherencia de memoria de la arquitectura y el lenguaje de programación, y de si la escritura se expulsa como una operación atómica o una valla de escritura posterior.

Cuestiones relacionadas