El documento del CCG aquí especifica el uso de _buitin_prefetch.
El tercer argumento es perfecto. Si es 0, el compilador genera la instrucción prefetchtnta (%rax) Si es 1, el compilador genera la instrucción prefetcht2 (%rax) Si es 2, el compilador genera la instrucción prefetcht1 (%rax) Si es 3 (predeterminado), el compilador genera prefetcht0 (%rax) instrucción.
Si variamos el tercer argumento, el código de operación ya cambió en consecuencia.
Pero el segundo argumento no parece tener ningún efecto.
__builtin_prefetch(&x,1,2);
__builtin_prefetch(&x,0,2);
__builtin_prefetch(&x,0,1);
__builtin_prefetch(&x,0,0);
Lo anterior es el fragmento de código de muestra, que generó:
El siguiente es el montaje:
27: 0f 18 10 prefetcht1 (%rax)
2a: 48 8d 45 fc lea -0x4(%rbp),%rax
2e: 0f 18 10 prefetcht1 (%rax)
31: 48 8d 45 fc lea -0x4(%rbp),%rax
35: 0f 18 18 prefetcht2 (%rax)
38: 48 8d 45 fc lea -0x4(%rbp),%rax
3c: 0f 18 00 prefetchnta (%rax)
Uno puede observar el cambio en los códigos de operación con el tercer argumento. Pero incluso si cambié el segundo argumento (que especifica lectura o escritura), el código ensamblador sigue siendo el mismo. <27,2a> y <2e,31>. Entonces no le da ninguna información a la máquina. Entonces, ¿cuál es el propósito del segundo argumento?
La documentación es muy clara. Las instrucciones que genera para una arquitectura específica, por supuesto, dependen de las funciones disponibles. Para algunas arquitecturas, no emitirá ninguna instrucción. Entonces, ¿verificó qué instrucciones de captación previa proporciona su destino x86 específico? ¿Qué es lo que realmente hacen? ¿Y cómo se relacionan con los argumentos? Los manuales de instrucciones para Intel y AMD están disponibles para su descarga gratuita.
– demasiado honesto para este sitio
9 de noviembre de 2016 a las 18:13