Pregunta

¿Bajo qué circunstancias no es seguro tener dos hilos diferentes que escriben simultáneamente en elementos adyacentes de la misma matriz en x86? Entiendo que en algunas arquitecturas de tipo DS9K con modelos de memoria locos, esto puede provocar el desgarro de palabras, pero en x86, los bytes individuales son direccionables. Por ejemplo, en el lenguaje de programación D real es un tipo de punto flotante de 80 bits en x86. ¿Sería seguro hacer algo como:

real[] nums = new real[4];  // Assume new returns a 16-byte aligned block.
foreach(i; 0..4) {
    // Create a new thread and have it do stuff and 
    // write results to index i of nums.
}

Nota: Sé que, incluso si esto es seguro, a veces puede causar problemas de uso compartido falso con el caché, lo que lleva a un rendimiento lento. Sin embargo, para los casos de uso que tengo en mente, las escrituras serán lo suficientemente infrecuentes para que esto no importe en la práctica.

Editar: No te preocupes por leer los valores que están escritos. El supuesto es que habrá sincronización antes de que se lean los valores. Solo me importa la seguridad de escribir de esta manera.

¿Fue útil?

Solución

El x86 tiene cachés coherentes. El último procesador para escribir en una línea de caché lo adquiere todo y hace una escritura en el caché. Esto garantiza que los valores de byte único y de 4 bytes escritos en los valores correspondientes se actualicen de forma atómica.

Eso es diferente de " es seguro " ;. Si cada uno de los procesadores solo escribe en bytes / DWORDS " propietario " Por ese procesador por diseño, entonces las actualizaciones serán correctas. En la práctica, desea que un procesador lea los valores escritos por otros, y eso requiere sincronización.

También es diferente de lo que es " eficiente " ;. Si varios procesadores pueden escribir en diferentes lugares en la línea de caché, entonces la línea de caché puede hacer ping-pong entre las CPU y eso es mucho más costoso que si la línea de caché va a una sola CPU y se queda allí. La regla habitual es colocar los datos específicos del procesador en su propia línea de caché. Por supuesto, si solo va a escribir solo una palabra, solo una vez, y la cantidad de trabajo es significativa en comparación con un movimiento de línea de caché, entonces tu rendimiento será aceptable.

Otros consejos

Puede que me esté faltando algo, pero no preveo ningún problema. La arquitectura x86 escribe solo lo que necesita, no hace ninguna escritura fuera de los valores especificados. La búsqueda de caché maneja los problemas de caché.

Está preguntando sobre las características específicas de x86, pero su ejemplo está en un lenguaje de alto nivel. Su pregunta específica sobre D solo puede ser respondida por las personas que escribieron el compilador que está utilizando, o tal vez la especificación del lenguaje D. Java, por ejemplo, requiere que el acceso a los elementos de la matriz no cause desgarros.

Con respecto a x86, la atomicidad de las operaciones se especifica en la Sección 8.1 de Manual del desarrollador de software de Intel Volumen 3A . De acuerdo con esto, las operaciones de almacenamiento atómico incluyen: almacenar un byte, almacenar palabras alineadas con palabras y palabras clave alineadas con palabras en todas las CPU x86. También especifica que en las CPU P6 y posteriores, el acceso de 16, 32 y 64 bits sin alinear a la memoria en caché dentro de una línea de caché es atómico.

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