2011-03-12 11 views
7

¿Cuál es el código ensamblador x86 más rápido para sincronizar el acceso a una matriz en la memoria?¿Código de ensamblaje x86 más rápido para sincronizar el acceso a una matriz?

Para ser más precisos: tenemos una región de paginación única continua mallocada en la memoria y el sistema operativo no realizará una paginación de esta región durante la duración de nuestro experimento. Un hilo escribirá en el conjunto, un hilo leerá del conjunto. la matriz es pequeña, pero más grande que la capacidad de escritura atómica de su CPU (para que se requiera un bloqueo por separado)

"más rápido": la velocidad efectiva: no suponga que la longitud del bytecode es significativa, pero tome teniendo en cuenta el comportamiento de bloqueo del bloqueo y el comportamiento de bifurcación con respecto al código circundante.

Se tiene que trabajar en x86-32 y/o x86-64

Tiene que trabajar en la parte superior de (o descendientes de) de Windows desde XP, Linux desde kernel 2.2 o MAXOS X (en el usuario -modo).

Por favor, no "depende" -respuestas: Si depende de algo que no ha especificado aquí sólo hacer su propio ejemplo (s) y el estado lo que es más rápido en que/los caso (s).

¡Código postal! (Esto es para evitar descripciones vagas)

mensaje no sólo su línea 2 LOCK + CMPXCHG comparar & de intercambio, pero nos muestran cómo se integran con las instrucciones de lectura en el hilo y la reseña de instrucciones de la otra.

Si lo desea, explique sus ajustes para la optimización de la memoria caché y cómo evitar errores de predicción de ramas si el branch-target depende de (1) si obtiene o no el bloqueo (2) cuál es el primer byte de un -read es.

Si desea distinguir entre multiprocesamiento y conmutación de tareas: ¿cómo se comportará su código si los hilos no se realizan en 2 cpus pero solo se apoderan de uno?

+0

@Ken blanco: jaja divertida. o estas en serio? de ser así, eche un vistazo a la terminología que uso y las preguntas que he respondido. –

+0

@Ken - Me interesaría mucho la escuela que asigna este tipo de preguntas como tarea. – linuxuser27

+0

@eznme, leí la terminología utilizada. Parece algo directamente de un libro de texto. "Publica no solo tu 2 líneas ... sino muestra". Sin intención de ofender, no parecía algo que contuviera una pregunta típica. @ linuxuser27, ¿has visto alguno de los cursos avanzados en MIT o RIT? –

Respuesta

1

No lo entiendo. El bloqueo de bus (prefijo de bloqueo o mem xchg, instrucción reg) y la velocidad tienen poco que ver entre sí. Se trata de sincronizar físicamente la CPU con el dispositivo activo más lento de su sistema, que podría estar conectado a través del PCI de 33 MHz o algo así, y puede apostar a que será mucho más lento que un acceso de RAM que no estaba en el caché. Así que espere 300-3000 ciclos de reloj de la CPU, dependiendo de cuánto tiempo tenga que esperar para el dispositivo. Si no hay dispositivos activos, deberá esperar a que los respectivos buses confirmen el bloqueo.

¿Código más rápido? Olvídalo. Debe aceptar que así es como funcionan los bloqueos de bus o encontrar otras formas de sincronizar que no requieran el bloqueo de bus.

-1

Si el rendimiento de bloqueo es importante, está haciendo algo mal.

+0

Sí, estoy de acuerdo. Si los trozos de trabajo son lo suficientemente grandes, amortiza el costo de bloqueo. –

2

Realmente, la respuesta es "depende". ¿Cuál es el patrón de uso de tu matriz? ¿Se lee, principalmente? ¿Se actualiza en su mayoría y puede salirse con la suya con resultados imprecisos de lectura (usando arreglos por CPU)? Las actualizaciones son tan infrecuentes que RCU podría mejorar seriamente el rendimiento.

Hay un montón de ventajas y desventajas aquí, véase el libro de Paul McKenney: Is Parallel Programming Hard, And, If So, What Can You Do About It?

Cuestiones relacionadas