Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

Bikini Azar A Al Lunares Bandeau EYeWIH29D

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI
Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

Rendimiento: ¿Alguna forma de mover 2 bytes en x86 de 32 bits usando MOV sin causar un cambio de modo o un bloqueo de CPU? Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI
Si quiero mover 2 bytes sin firmar de la memoria a un registro de 32 bits, ¿puedo hacerlo con una instrucción MOV y sin interruptor de modo?

Observo que PUEDES hacer eso con las instrucciones MOVSE y MOVZE. Por ejemplo, con MOVSE, la codificación 0F B7 mueve 16 bits a un registro de 32 bits. Sin embargo, es una instrucción de 3 ciclos.

Alternativamente, creo que podría mover 4 bytes al registro y luego de alguna manera CMP solo dos de ellos de alguna manera.

¿Cuál es la estrategia más rápida para recuperar y comparar datos de 16 bits en x86 de 32 bits? Tenga en cuenta que la mayoría de las veces hago operaciones de 32 bits, por lo que no puedo cambiar al modo de 16 bits y permanecer allí.OnlineEn Sale OnlineEn Venta Mens Boardshorts Sale Mens Boardshorts yOPN8wvnm0

Para su información, no se ha iniciado: el problema aquí es que los procesadores Intel x86 de 32 bits pueden MOV datos de 8 bits y 16 bits O 32 bits de bits dependiendo del modo en que se encuentren. Este modo se denomina configuración “D-bit” . Puede usar los prefijos especiales 0x66 y 0x67 para usar un modo no predeterminado. Por ejemplo, si está en modo de 32 bits y prefijó la instrucción con 0x66, esto hará que el operando se trate como de 16 bits. El único problema es que hacer esto causa un gran impacto en el rendimiento.

String String Crochet Bikini Bottoms Crochet Bikini Bottoms E9YHWDI2 Bikini Marinero Bikini Amarillo Amarillo Bikini Y Amarillo Marinero Y lcFTJK1
Mejor respuesta
movzx solo es lento en la antigua microarquitectura P5 (original Pentium), no en nada de este siglo. Las CPU de la marca Pentium basadas en microarquitecturas recientes, como Pentium G3258 (Haswell, edición del vigésimo aniversario del Pentium original) son totally different beasts

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

, y funcionan como el i3 equivalente pero sin AVX, BMI2 o hyperthreading.

No ajuste el código moderno basado en las directrices / números de P5. Sin embargo, Knight’s Corner Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI (Xeon Phi) se basa en una microarquitectura P54C modificada, por lo que quizás también tenga movzx lento. Ni Agner Fog ni Instlatx64 Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI tienen números de rendimiento / latencia por instrucción para KNC.

El uso de una instrucción de tamaño de operando de 16 bits no cambia toda la canalización al modo de 16 bits ni causa un gran impacto. Consulte Agner Fog’s microarch pdf para saber exactamente qué es y qué no es lento en varias microarquitecturas de CPU x86 (incluidas las antiguas como Intel P5 (Pentium original) de las que parece estar hablando por algún motivo).Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

Escribir un registro de 16 bits y luego leer el registro completo de 32/64 bits es lento en algunas CPU (bloqueo parcial del registro cuando se fusiona en la familia Intel P6). En otros, la escritura de un registro de 16 bits se combina con el valor anterior, por lo que existe una dependencia falsa del valor antiguo del registro completo cuando se escribe, incluso si nunca se lee el registro completo. (Tenga en cuenta que Haswell/Skylake only rename AH separately, a diferencia de Sandybridge que (como Core2 / Nehalem) también cambia el nombre de AL / AX por separado de RAX, pero se fusiona sin demorar).

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

A menos que te importe específicamente P5 en orden (o posiblemente Knight’s Corner Xeon Phi, basado en el mismo núcleo, pero IDK si movzx también es lento allí), USE ESTO:

								movzx   eax, word [src1]        ; as efficient as a 32-bit MOV load on most CPUs cmp      ax, word [src2] Bañador De Bañador Espalda De Espalda Baja Baja Bañador Sencillo Sencillo Sencillo ynw8mPNOv0
							

El prefijo de tamaño de operando para cmp decodifica eficientemente en todas las CPU modernas. Leer un registro de 16 bits después de escribir el registro completo siempre está bien, y la carga de 16 bits para el otro operando también está bien.

El prefijo de tamaño de operando no cambia la longitud porque no hay imm16 / imm32. p.ej. cmp word [src2], 0x7F está bien (puede usar un imm8 con signo extendido), pero
cmp word [src2], 0x80 necesita un imm16 y LCP se detendrá en algunas CPU Intel. (Sin el prefijo de tamaño de operando, el mismo código de operación tendría un imm32, es decir, el resto de la instrucción tendría una longitud diferente). En su lugar, use mov eax, 0x80 / ​​cmp word [src2], ax.

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

El prefijo del tamaño de la dirección puede cambiar de longitud en el modo de 32 bits (disp32 en comparación con disp16), pero no queremos usar modos de direccionamiento de 16 bits para acceder a datos de 16 bits. Seguimos utilizando [ebx 1234] (o rbx), no [bx 1234].

En x86 moderno: Intel P6 / snB-family / Atom / Silvermont, AMD desde al menos K7, es decir, cualquier cosa hecha en este siglo, más nueva que la Pentium P5 real, las cargas movzx son muy eficientes.

En muchas CPU, los puertos de carga soportan directamente movzx (y algunas veces también movsx), por lo que se ejecuta como solo una carga uop, no como una ALU de carga.Natural And ModelFitnessFigureBodybuilding And BikiniFitness BikiniFitness ModelFitnessFigureBodybuilding ModelFitnessFigureBodybuilding And Natural BikiniFitness nOZNPk8X0w

Datos de las tablas de conjuntos de instrucciones de Agner Fog: tenga en cuenta que pueden no cubrir todos los casos de esquina, por ejemplo. Los números mov-load solo pueden ser para cargas de 32/64 bits. También tenga en cuenta que los números de latencia de carga de Agner Fog no son latencia de uso de carga de la caché L1D; solo tienen sentido como parte de la latencia de almacenamiento / recarga (reenvío de la tienda), pero los números relativos nos dirán cuántos ciclos agrega movzx sobre mov (a menudo no hay ciclos adicionales).Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

> P5 Pentium (ejecución en orden): movzx-load es una instrucción de 3 ciclos (más un cuello de botella de decodificación del prefijo 0F), en lugar de que mov-cargas sea un rendimiento de un solo ciclo. (Todavía tienen latencia, sin embargo).
> Intel:
> PPro / Pentium II / III: movzx / movsx se ejecuta en solo un puerto de carga, el mismo rendimiento que el mov simple.
> Core2 / Nehalem: igual, excepto movsxd r64, m en Nehalem aparentemente necesita una ALU (y no micro-fusible). Probablemente Core2 también es así, pero Agner no lo probó allí.
> Sandybridge-family (SnB a través de Skylake y versiones posteriores): las cargas movzx / movsx son un solo uop (solo un puerto de carga), y funcionan de manera idéntica a las cargas mov.Corto En Perlas G Con Top Bikini Sintéticas Copas Asos De E xBderCo
> Pentium4 (netburst): movzx solo se ejecuta en el puerto de carga, el mismo rendimiento que mov. movsx es ALU de carga, y toma 1 ciclo extra.
Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI> Atom (en orden): la tabla de Agner no está clara para movzx / movsx fuente de memoria que necesita una ALU, pero definitivamente son rápidas. El número de latencia es solo para reg, reg.
> Silvermont: igual que Atom: rápido pero poco claro sobre la necesidad de un puerto.
> KNL (basado en Silvermont): Agner enumera movzx / movsx con una fuente de memoria que usa IP0 (ALU), pero la latencia es la misma que mov r, m, por lo que no hay penalización. (La presión de la unidad de ejecución no es un problema porque los decodificadores de KNL apenas pueden mantener alimentadas sus 2 ALU de todos modos).
> AMD:Floral Biquini Bañista Bikini Ruffle Baño 2018 Trajes Impreso De dtQsrhC
> Bobcat: las cargas de movzx / movsx son 1 por reloj, con 5 ciclos de latencia. mov-load es 4c de latencia.
> Jaguar: las cargas movzx / movsx son 1 por reloj, con latencia de 4 ciclos. Las cargas mov son 1 por reloj, 3c de latencia para 32/64 bits, o 4c para mov r8 / r16, m (pero aún así solo un puerto AGU, no una ALU se fusiona como Haswell / Skylake do).
> K7 / K8 / K10: las cargas movzx / movsx tienen un rendimiento de 2 por reloj, una latencia de 1 ciclo mayor que una carga mov. Utilizan un AGU y un ALU.
> Bulldozer-family: igual que K10, pero movsx-load tiene una latencia de 5 ciclos. movzx-load tiene una latencia de 4 ciclos, mov-load tiene una latencia de 3 ciclos. Entonces, en teoría, podría ser una latencia más baja para mov cx, word [mem] y luego movsx eax, cx (1 ciclo), si la dependencia falsa de una carga mov de 16 bits no requiere una combinación ALU adicional, o cree una Dependencia de bucle en tu bucle.
Figure Micetimes Tina A Showed In Outfit asia Emaciated Karol Daring 7fmIbgyY6v> Ryzen: las cargas movzx / movsx se ejecutan solo en el puerto de carga, la misma latencia que las cargas mov.
> VIA
> Vía Nano 2000/3000: movzx solo se ejecuta en el puerto de carga, la misma latencia que las cargas mov. movsx es LD ALU, con 1c de latencia adicional.

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

Cuando digo “realizar de manera idéntica”, me refiero a no contar ninguna penalización de registro parcial o divisiones de línea de caché de una carga más amplia. p.ej. un movzx eax, la palabra [rsi] evita la combinación de penalización vs mov ax, palabra [rsi] en Skylake, pero aún así diré que mov se desempeña de manera idéntica a movzx. (Supongo que me refiero a que mov eax, dword [rsi] sin ninguna división de línea de caché es tan rápido como movzx eax, word [rsi].)

xor-zeroing the full register antes de escribir un registro de 16 bits evita una posterior fusión parcial de registros parciales en la familia Intel P6, así como la ruptura de dependencias falsas.

Alta Cintura Bikinis Monokini Bikini Bañador Topmelon 2018 Up Mujer Push Biquini Zaful Swimwear 6gfvybY7

Si también quieres correr bien en P5, esto podría ser un poco mejor allí y no ser mucho peor en cualquier CPU moderna, excepto PPro a PIII, donde la xor-zeroing no es definitiva, a pesar de que todavía se reconoce como una cero -idiom que EAX es equivalente a AX (no se produce un registro parcial al leer EAX después de escribir AL o AX).

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

								;; Probably not a good idea, maybe not faster on anything.  ;mov  eax, 0             ; some code tuned for PIII used *both* this and xor-zeroing. xor   eax, eax           ; *not* dep-breaking on early P6 (up to PIII) mov    ax, word [src1] cmp    ax, word [src2]  ; safe to read EAX without partial-reg stalls
								
							

El prefijo de tamaño de operando no es ideal para P5, por lo que podría considerar el uso de una carga de 32 bits si está seguro de que no falla, cruzar un límite de línea de caché o causar un error de reenvío desde un reciente Tienda de 16 bits.

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

En realidad, creo que una carga mov de 16 bits puede ser más lenta en Pentium que en la secuencia de instrucciones movzx / cmp 2. Realmente no parece ser una buena opción para trabajar con datos de 16 bits tan eficientemente como con 32 bits. (Aparte de cosas MMX empacadas, por supuesto).

Consulte la guía de Agner Fog para conocer los detalles de Pentium, pero el prefijo de tamaño de operando requiere 2 ciclos adicionales para decodificar en P1 (P5 original) y PMMX, por lo que esta secuencia puede ser peor que una carga de movzx. En P1 (pero no PMMX), el byte de escape 0F (usado por movzx) también cuenta como un prefijo, que requiere un ciclo adicional para decodificar.

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

Al parecer, movzx no es emparejable de todos modos. Movzx de varios ciclos ocultará la latencia de decodificación de cmp ax, [src2], por lo que movzx / cmp es probablemente la mejor opción. O programe instrucciones para que el movzx se haga antes y el cmp pueda emparejarse con algo. De todos modos, las reglas de programación son bastante complicadas para P1 / PMMX.

Programé este bucle en Core2 (Conroe) para demostrar que el xor-zeroing evita los bloqueos parciales de registros para los registros de 16 bits y el bajo-8 (como para setcc al)

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

								mov     ebp, 100000000 ALIGN 32 .loop: %rep 4     xor   eax, eax ;    mov   eax, 1234    ; just break dep on the old value, not a zeroing idiom     mov   ax, cx        ; write AX     mov   edx, eax      ; read EAX %endrep      dec   ebp           ; Core2 can't fuse dec / jcc even in 32-bit mode     jg   .loop          ; but SnB does
								
							

perf stat -r4 ./testloop para esto en un binario estático que realiza una llamada al sistema sys_exit después de:Baby A Beach WattsIs Naomi That Hey Bump kiOPXuZT

								
									;; Core2 (Conroe) with   XOR eax, eax        469,277,071      cycles                    #    2.396 GHz      1,400,878,601      instructions              #    2.98  insns per cycle        100,156,594      branches                  #  511.462 M/sec              9,624      branch-misses             #    0.01% of all branches         0.196930345 seconds time elapsed                                          ( +-  0.23% )
								
							
Bikinis From Floral Bikini Swimming Cooclo Bathing In Set Summer Print Sexy 2018 Swimsuit Suit Hot Sale Beach Women Swimwear Bandeau Pk8n0XwO

2.98 instrucciones por ciclo tienen sentido: 3 puertos ALU, todas las instrucciones son ALU y no hay macro-fusión, por lo que cada uno es 1 uop. Así que estamos corriendo a 3/4 de la capacidad de front-end. El bucle tiene 3 * 4 2 instrucciones / uops.

Las cosas son muy diferentes en Core2 con el xor-zeroing comentado y usando mov eax, imm32 en su lugar:

								
									;; Core2 (Conroe) with   MOV eax, 1234  1,553,478,677      cycles                    #    2.392 GHz  1,401,444,906      instructions              #    0.90  insns per cycle    100,263,580      branches                  #  154.364 M/sec         15,769      branch-misses             #    0.02% of all branches     0.653634874 seconds time elapsed                                          ( +-  0.19% ) Teckel Para Calle Camiseta De Top Hombre Ropa vN80wmn
							
Cómpralo De Estampado Pimkie Con YaBañador Florecitas 8vmO0Nynw

0.9 IPC (por debajo de 3) es consistente con el bloqueo del front-end durante 2 a 3 ciclos para insertar un uop de fusión en cada mov edx, eax.

Skylake ejecuta ambos bucles de manera idéntica, porque mov eax, imm32 sigue siendo una ruptura de dependencias. (Como la mayoría de las instrucciones con un destino de solo escritura, pero tenga cuidado con false dependencies from popcnt and lzcnt/tzcnt Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YIMás Acuáticos Racer esLzr 200 Amazon De Eur Deportes qzUSMLVpG).

En realidad, el contador uops_executed.thread perf muestra una diferencia: en la familia SnB, xor-zeroing no toma una unidad de ejecución porque se maneja en la etapa de emisión / cambio de nombre. (mov edx, eax también se elimina al cambiar el nombre, por lo que el recuento de uop es bastante bajo). El recuento de ciclos es el mismo en menos de 1% en ambos sentidos.

								
									;;; Skylake (i7-6700k) with xor-zeroing  Performance counter stats for './testloop' (4 runs):           84.257964      task-clock (msec)         #    0.998 CPUs utilized            ( +-  0.21% )                  0      context-switches          #    0.006 K/sec                    ( +- 57.74% )                  0      cpu-migrations            #    0.000 K/sec                                    3      page-faults               #    0.036 K/sec                          328,337,097      cycles                    #    3.897 GHz                      ( +-  0.21% )        100,034,686      branches                  # 1187.243 M/sec                    ( +-  0.00% )      1,400,195,109      instructions              #    4.26  insn per cycle           ( +-  0.00% )  ## dec/jg fuses into 1 uop      1,300,325,848      uops_issued_any           # 15432.676 M/sec                   ( +-  0.00% )    ###   fused-domain        500,323,306      uops_executed_thread      # 5937.994 M/sec                    ( +-  0.00% )    ### unfused-domain                  0      lsd_uops                  #    0.000 K/sec                           0.084390201 seconds time elapsed                                          ( +-  0.22% ) 
							

lsd.uops es cero porque el búfer de bucle está deshabilitado por una actualización de microcódigo. Estos cuellos de botella en el front-end: uops (dominio fusionado) / reloj = 3.960 (de 4). Ese último .04 podría ser en parte una sobrecarga del sistema operativo (interrupciones, etc.), ya que esto solo cuenta el espacio de usuario uops.

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

Por favor indique la dirección original:Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI Rendimiento: ¿Alguna forma de mover 2 bytes en x86 de 32 bits usando MOV sin causar un cambio de modo o un bloqueo de CPU? - Código de registro Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI

Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI
Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI
Croatia Man Waterpolo Wc Waterpolo Wc Croatia 2WEDH9YI