Sunday 18 December 2016

0x33 Binary Options

Publicado por Reena Gupta El 8 de julio de 2016 Cuando usted compra un gadget como un smartphone, tableta o incluso GPS, es probable que cambie al menos algunos de los ajustes de fábrica. Cambia los tonos de timbre, personaliza las alertas, etc. para adaptarte a tus preferencias y necesidades. Por lo tanto, ¿por qué es que la mayoría de la gente no se molestan en hacer estas mismas personalización de software? Específicamente, las soluciones de software de la empresa Cuando usted está buscando Leer más Publicado por Reena Gupta El 6 de julio 2016 Gestión de talentos es atraer, El primer paso crucial es atraer talento. Esto se hace mejor mediante el seguimiento de los solicitantes y las actividades de reclutamiento, que puede incluir medios de comunicación social, asistir a conferencias, la celebración de eventos de reclutamiento, etc Este primer paso va a ser cada vez más importante como la industria de reclutamiento Leer más Publicado por Reena Gupta El 1 de julio , 2016 Ser rápido en la detección de talento raro Los reclutadores de la Nueva Era deben ser muy agresivos en la detección de talentos en un individuo. Ellos deben ser simultáneamente altamente cualificados en el uso de Internet y la búsqueda de candidatos en múltiples redes sociales, portales de trabajo e incluso blogs. La tendencia de reclutamiento de hoy depende mucho de lo que está sucediendo en la economía y la Leer más Publicado por Reena Gupta El 27 de junio de 2016 La retención de talentos y la adquisición es cada vez más popular en las organizaciones. Las empresas para asegurarse de que la mejor adquisición de talento sucede insistir en el uso de programa de referencia de empleados para apoderarse de los mejores talentos disponibles. Sin embargo, muchos empleados internos son de una sola percepción, siempre funciona realmente. Sin embargo, la tendencia que ocurre en las empresas es que las referencias de los empleados son los preferidos Leer más Publicado por Reena Gupta El 24 de junio 2016 La calidad del alquiler está directamente vinculado a la medida de lo bien que una nueva persona satisface las necesidades de rendimiento del trabajo. El proceso de gestión del desempeño del trabajo y la participación del candidato es muy crucial aquí. Cuándo debe medir la calidad del alquiler Trate de medir su calidad de alquiler en 3 etapas de intervalo principalmente: Antes, durante Leer más Publicado por Reena Gupta El 22 de junio 2016 Durante algunos años, sitios como Mapquest estaban a la vanguardia de las herramientas de cartografía en línea, Pero como Google se hizo más grande y más capaz de mantener Google Maps y Google Earth, estaba claro que este estilo de tecnología y este nivel de accesibilidad necesitaba ser ampliado. Análisis de datos, cuando se aplica a la cartografía y la información geográfica, Leer más Publicado por Reena Gupta El 19 de junio 2016 Hay tres razones principales por las que la integración de nóminas no es sólo una buena idea, sino una buena práctica empresarial. La integración de los principales procesos (gestión de nóminas) y aplicaciones (procesamiento de nóminas) en la plataforma de reclutamiento en línea de una empresa de dotación de personal comenzó cuando la nube lo hizo extremadamente fácil. La mayoría de las empresas utilizan un proveedor de nómina como Leer más Publicado por Reena Gupta El 15 de junio de 2016 Live chat todavía tiene un aura de tiempo de juego asociado con él, incluso hoy en día, cuando se han introducido tantas plataformas sociales. Pero ¿sabía usted que hablar en el lugar de trabajo tiene un nuevo término y se considera excelente para los negocios? Sí, ahora se llama colaboración en tiempo real. El trabajo social está pagando apagado en muy grande Leer más Publicado por Reena Gupta El 10 de junio de 2016 Así que, lo que está en su sistema de seguimiento de solicitante Weve enumerados 5 must-haves cuando se trata de estar equipado con la más alta calidad, . Funciones avanzadas de la búsqueda del candidato: En un día y una edad en donde buscar (y encontrar fácilmente) a candidatos calificados dentro de su propia base de datos es tan importante como la capacidad. Leer más Publicado por Jessica Nelson El 2 de junio 2016 Especialización y el arte de hacer negocios Y la división del trabajo como una forma de hacer negocios han existido por mucho tiempo. La idea de la especialización de la producción condujo al desarrollo de las primeras líneas automáticas totalmente automáticas del montaje del automóvil de los 1900s tempranos, y el mismo concepto fue aplicado eventual a ... Leer más Publicado por Jessica Nelson El 28 de abril 2016 Es un reto para hacer crecer cualquier negocio sin acceso A informes informativos y analíticos, y no es útil si tiene acceso, pero tiene datos incorrectos o datos faltantes. Cuando las empresas recopilan datos, es una oportunidad para obtener información sobre cómo funciona el negocio. Y los mejores resultados provienen de un completo digital, de extremo a extremo. Leer más Publicado por Rita El 21 de abril 2016 Si usted necesita para llenar una posición por un plazo determinado, no están atrayendo el tipo de candidatos adecuados para puestos específicos o experiencia La dificultad para mover candidatos a través del proceso de pre-contratación, descubrirá los muchos beneficios de la implementación de una solución de plataforma de extremo a extremo. Este tipo de problemas requieren reclutadores y profesionales de recursos humanos Leer más Publicado por Jessica Nelson El 14 de abril de 2016 En cualquier momento que hacemos algo bien o estamos entusiasmados con algo específico, queremos decirle a la gente sobre itits una reacción humana natural. Es similar a encontrar el talento adecuado y llenar posiciones rápidamente como se necesitan. El reclutamiento es en muchos sentidos una función de ventas. Leer más Publicado por Jessica Nelson El 24 de marzo 2016 La comunidad de Mompreneur está creciendo rápidamente, específicamente alrededor de mujeres en tecnología, trabajo remoto y start ups. Reena Gupta, fundadora y directora ejecutiva de TargetRecruit y Avankia, ejemplifica el término acuñado Mompreneur, y ha participado activamente en guiar a las mujeres basándose en su propia experiencia y logros en su carrera y vida personal. De sus esfuerzos continuos Leer más Publicado por Jessica Nelson El 17 de marzo de 2016 Muchas organizaciones todavía utilizan procesos manuales o basados ​​en papel, que son lentos, costosos y propensos a errores, lo que resulta en operaciones ineficientes y riesgos de cumplimiento. Invertir en operaciones digitales de atención médica reduce el tiempo y los costos de búsqueda mientras deleita a los candidatos y mejora la seguridad y el cumplimiento. Para que una empresa de dotación de personal sanitaria tenga éxito, la conectividad es imprescindible para el crecimiento a largo plazo y la capacidad. Leer más ArchivosPor los códigos binarios generados por Intel C compilador es 42 más lento El rendimiento de los códigos generados por Intel C compilador es 42 más lento que el rendimiento de los códigos generados por MinGW, Microsoft y los compiladores de Watcom C legados. Esto se debe a que el compilador de Intel C reordenó una secuencia de instrucciones asumiendo erróneamente que mejorará el rendimiento debido a la canalización de una unidad de procesamiento. Una prueba intensiva de algunos códigos C mostró que el reordenamiento de las instrucciones no mejoraba el rendimiento. El compilador C moderno hace un montón de optimizaciones detrás de las escenas, pero los ingenieros de software C / C deben tener un mayor control de todas las acciones relacionadas con el reordenamiento de las instrucciones generadas, es decir, los códigos binarios. Consideraría tres opciones: - Un mensaje de advertencia en el nivel / W5 (no en otros niveles) debe mostrarse cuando hay un reordenamiento - Introducción una directiva de no-reordenación pragma para un pedazo de códigos críticos para evitar cualquier re - Ordena una opción de compilador de línea de comandos similar a la opción del compilador Watcom C - o (Reordenará instrucciones para evitar los puestos) IrtClflush (amppiAddress00) CrtClflush (amppiAddress10) CrtPrefetchData ((RTchar) amppiAddress00) // Todas las prefetches son T0-type CrtPrefetchData RTchar) amppiAddress10) CrtPrefetchData ((RTchar) amppiAddress20) CrtPrefetchData ((RTchar) amppiAddress30) CrtPrefetchData ((RTchar) amppiAddress40) CrtPrefetchData ((RTchar) amppiAddress50) CrtPrefetchData ((RTchar) amppiAddress60) CrtPrefetchData ((RTchar) amppiAddress70) CrtPrefetchData ((RTchar ) amppiAddress80) CrtPrefetchData ((RTchar) amppiAddress90) RTuint64 uiClock1 CrtRdtsc () CrtClflush (amppiAddress00) CrtClflush (amppiAddress10) CrtClflush (amppiAddress20) CrtClflush (amppiAddress30) CrtClflush (amppiAddress40) CrtClflush (amppiAddress50) CrtClflush (amppiAddress60) CrtClflush (amppiAddress70) CrtClflush (amppiAddress80 ) CrtClflush (amppiAddress90) RTuint64 uiClock2 CrtRdtsc () CrtPrintf (RTU (CrtClflush - Ejecutado en cyclesn reloj u), (RTuint) (uiClock2 - uiClock1) / 10) CrtPrintf (RTU (IrtClflush amp CrtClflushn)). Sun, 25/09/2016 - 20:57 Pruebas de tiempo de ejecución - Rastreo extendido - No compilador Intel C CrtClflush - Ejecutado en 20 ciclos de reloj CrtClflush - Ejecutado en 23 ciclos de reloj CrtClflush - Ejecutado en 24 ciclos de reloj CrtClflush - Ejecutado en 24 reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 18 ciclos de reloj. Una pregunta es por qué lo hace más lento que el de Microsoft o Watcom compiladores de C Aquí se generan códigos binarios: 0040365C 0040365E RDTSC clflush ebp-8B8h 00403665 mov ecx, eax 00403667 clflush ebp-878h 0040366E clflush ebp-838h 00403675 clflush ebp-7F8h 0040367C clflush EBP - 7B8h 00403683 clflush ebp-778h 0040368A clflush ebp-738h 00403691 clflush ebp-6F8h 00403698 clflush ebp-6B8h 0040369F clflush ebp-678h 004036A6 rdtsc. 1. El compilador Intel C reordenó una secuencia de instrucciones. 2. Mov ecx, eax se coloca después del primer clflush ebp-8B8h para guardar un valor devuelto de RDTSC en el registro de propósito general eax. 3. Es posible que el pipelining esté afectado (muy probable). 4. Echa un vistazo a los códigos binarios perfectamente generados por Watcom C compilador (véase más adelante). 5. Casi el mismo reordenamiento es realizado por el compilador Microsoft C. CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj. Aquí se generan códigos binarios: 00403791 RDTSC 00403793 mov ecx, eax 00403795 lea eax, ebp-8AEh 0040379B clflush EAX EAX 0040379E lea, ebp-86Eh 004037A4 clflush eax 004037A7 lea eax, ebp-82Eh 004037AD clflush eax 004037B0 lea eax, ebp-7EEh 004037B6 clflush eax 004037B9 lea eax, ebp-7AEh 004037BF clflush eax 004037C2 lea eax, ebp-76Eh 004037C8 clflush eax 004037CB lea eax, ebp-72Eh 004037D1 clflush eax 004037D4 lea eax, ebp-6EEh 004037DA clflush eax 004037DD lea eax, ebp-6AEh 004037E3 clflush eax 004037E6 lea eax, ebp-66Eh 004037EC clflush eax 004037EF rdtsc. Perfecta generación de códigos binarios. CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj En 12 ciclos de reloj CrtClflush - Ejecutada en 12 ciclos de reloj CrtClflush - Ejecutada en 12 ciclos de reloj CrtClflush - Ejecutada en 12 ciclos de reloj CrtClflush - Ejecutada en 12 ciclos de reloj. códigos binarios que aquí se generan: 00244486 RDTSC 00244488 clflush ebp-300h 0024448F clflush ebp-240h 00244496 clflush ebp-180h 0024449D mov dword ptr ebp-48h, eax 002444A0 clflush ebp-340h 002444A7 clflush ebp-280H 002444AE clflush ebp-1C0h 002444B5 clflush ebp -100h 002444BC movimiento dword ptr ebp-44h, edx 002444BF clflush ebp-2C0h 002444C6 clflush ebp-200h 002444CD clflush ebp-140h 002444D4 rdtsc. 1. Incluso si el compilador de Microsoft C también reordenó los códigos binarios no afecta al rendimiento y al rendimiento de un bloque de códigos con un conjunto de instrucciones CLFLUSH. Rendimiento y rendimiento fue como se esperaba, es decir, 12 ciclos de reloj por instrucción ejecutada. 2. Además, el compilador de Microsoft C almacena valores de los registros de propósito general EDX y EAX, número de ciclos de reloj devueltos desde la instrucción RDTSC, a una variable creada en la pila. A modo de comparación, el compilador Intel C almacena un valor en el registro EAX en el registro ECX. Teóricamente debería ser más rápido que almacenar el valor en la RAM, es decir, en una variable creada en la pila. En realidad, los resultados de las pruebas son opuestos. El problema tiene dos partes, es decir: - La instrucción RDTSC no estaba alineada en un límite de 16 bytes para el compilador Intel C - La modificación de una serie de instrucciones CLFLUSH se ve afectada cuando se inserta una instrucción MOV después de la primera instrucción CLFLUSH Por cierto, Los compiladores Watcom C binarios de códigos no están alineados en un límite de 16 bytes y no tiene ningún problema Así que decidí usar una solución forzando una alineación en un límite de 16 bytes (DEFAULTCODEALIGN16 es una macro basada en asm ALIGN 16 assembler Directiva). Códigos omitidos. DEFAULTCODEALIGN16 RTuint64 uiClock1 CrtRdtsc () CrtClflush (amppiAddress00) CrtClflush (amppiAddress10) CrtClflush (amppiAddress20) CrtClflush (amppiAddress30) CrtClflush (amppiAddress40) CrtClflush (amppiAddress50) CrtClflush (amppiAddress60) CrtClflush (amppiAddress70) CrtClflush (amppiAddress80) CrtClflush (amppiAddress90) RTuint64 uiClock2 CrtRdtsc ( ). Aquí hay estadísticas para una dirección de memoria de la primera instrucción RDTSC: MSC - 00244490 0x10 0 - Alineado en el límite de 16 bytes - Sí (forzado por DEFAULTCODEALIGN16) ICC - 00403660 0x10 0 - Alineado en el límite de 16 bytes - Sí (forzado por DEFAULTCODEALIGN16) BCC - 0040417A 0x10 10 - Alineado en el límite de 16 bytes - No (la solución es N / D) WCC - 00403791 0x10 11 - Alineado en el límite de 16 bytes - Sí (forzado por DEFAULTCODEALIGN16) CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj. Esto es lo que quería ver antes de pasar a otra tarea. GtgtWhats su procesador de orientación Y la opción de optimización que utilizó Es predeterminado - mSSE2 Considero que el problema con Re-ordenaciones como un fundamental y no deberíamos tener ninguna limitación relacionada con CPUs, ISAs, etc gtgtBesides los ciclos clflush, ha contado el rdtsc Latencia No porque no es necesario en ese caso. En general, hay tres casos posibles de uso de RDTSC (el mismo se aplica a cualquier API de temporización): Caso 1: - Una instrucción RDTSC se llamó después de algún bloque de códigos y devuelve un número de ciclos de reloj Cuando el bloque ha completado el procesamiento - RDTSC (80 ciclos de reloj) Caso 2: - Una instrucción RDTSC será llamada antes de algún bloque de códigos y devuelve un número de ciclos de reloj Cuando el bloque está a punto de comenzar Procesamiento - latencia de RDTSC s Caso 3: - Dos instrucciones RDTSC serán llamadas antes (será T1) y después (será T2) algún Bloque de Códigos y diferencia de (T2 - T1 ) Es un número de ciclos de reloj que llevó a Completar Procesamiento - No hay ninguna corrección debe tenerse en cuenta (Nota: 3 º caso es el más común como usted sabe) optimización gtgtCompiler puede volver a ordenar las instrucciones basadas en la instrucción de latencia / Micro-arquitectura. Lo entiendo pero mi punto es: Intel C compilador debe darnos un mayor control en similar a mis casos. Si un ingeniero de software tiene algunas especificaciones, sabe cómo se debe hacer algún procesamiento (su orden, número de instrucciones, el número estimado de ciclos de reloj para completar el procesamiento, etc), entonces el compilador Intel C no debe interferir con los códigos de Software Engineers. Por supuesto, la implementación con ensamblador resuelve todos estos problemas, pero es más tiempo para implementar y rompe la portabilidad de los códigos fuente C / C. Estoy bastante seguro de que los gastos generales de múltiples llamadas a RDTSC cant cancelar como se sugiere en el mensaje 14 anterior (software. intel/en-us/forums/intel-c-compiler/topic/697062co.). Esto requeriría que la primera llamada a RDTSC devuelva el recuento de ciclos al final de su ejecución, mientras que la segunda llamada a RDTSC tendría que devolver el recuento de ciclos al comienzo de su ejecución. Esto no tiene sentido. Miré la superposición de RDTSC y RDTSCP instrucciones con código de usuario con algún detalle en un nuevo puesto en software. intel/en-us/forums/software-tuning-performance-opti. John D. McCalpin, PhD Dr. Ancho de banda Wed, 09/28/2016 - 12:11 gtgt. Si coloca su código de prueba de desempeño en un bucle, ¿cuál es el momento excluyendo el primer viaje a través del código de prueba Jim, aquí están los resultados de rendimiento cuando el caso de prueba de serie se convirtió en un caso de prueba . Resultados del rendimiento de lo mejor a lo peor: MinGW C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 120 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 84 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 3 reloj Ciclos Intel C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 196 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 152 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 4 reloj Ciclos Watcom C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 212 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 128 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 8 reloj Ciclos Microsoft C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 192 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 88 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 10 reloj Ciclos Borland C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 964 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 264 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 70 reloj Ciclos Los resultados son muy reproducibles y veo que en el caso de los compiladores MinGW e Intel C era capaz de obtener números de límite bajo para la instrucción CLFLUSH indicada por Intel en Intel 64 e IA-32 Architectures Optimization Reference Manual Referencia: 248966-033 Junio 2016 Capítulo: LATENCIA DE INSTRUCCIONES Y TRAVESA Tabla C-17. Instrucciones de uso general (Página C-17) Las salidas de CLFLUSH para diferentes CPUs son de 5 a 50 ciclos de reloj. . Estoy de acuerdo con su punto de que si un ingeniero de software tiene algunas especificaciones, sabe cómo algún procesamiento debe hacerse (su orden, el número de instrucciones, el número estimado de ciclos de reloj para completar el procesamiento, etc), entonces el compilador Intel C no debe interferir Con los códigos de Software Engineers. A partir de este caso específico, me parece que la latencia clflush es causada por el problema de alineación en lugar de volver a ordenar. ¿Ha confirmado el impacto de volver a ordenar después de forzado alineado Para los casos reordenación no se desea, será-O0 para deshabilitar la optimización ayuda Sería genial con un ejemplo de reordenación de compilador disminuir el rendimiento y requiere de control de ingenieros. Yolanda Chen Intel Developer Herramientas de Soporte Base de Conocimiento: software. intel/en-us/articles/tools Aquí está una Lista de Características / Propuestas relacionadas con la generación de códigos binarios por el compilador Intel C cuando algunos códigos críticos se implementan en lenguaje C: 1. Introducción una directiva pragma no-reorden para un pedazo de códigos críticos de C para prevenir cualquier re-órdenes de códigos binarios 2. Se debe mostrar un mensaje de advertencia en el nivel / W5 (no en otros niveles) cuando hay un reordenamiento (s) 3. Una opción de compilador de línea de comandos para controlar órdenes de instrucciones 4. Si se llama a la instrucción RDTSC, entonces las instrucciones MOV, para guardar los valores EDX: EAX o RDX: RAX de los registros de propósito general, no deben ser reordenadas 5. Si la instrucción RDTSCP es llamada entonces las instrucciones de MOV, para guardar los valores EDX: EAX o RDX: RAX de los registros de propósito general, no deben ser reordenadas 6. Hay que considerar cuatro casos de uso posibles para la función intrínseca de rdtscp. La función se declara de la siguiente manera:. Extern unsigned int64 ICLINTRINCC rdtscp (unsigned int). Nota . Permite denotar uiTscValue como primer valor. Y iRetValue como segundo valor. Caso de uso 1 - 1er valor usado / 2do valor utilizado: unsigned int iRetValue 0 sin signo int64 uiTscValue rdtscp (ampiRetValue). El compilador C debe generar instrucciones MOV ordenadas para guardar el primer valor y el segundo valor en algunas direcciones. Caso de uso 2 - 1er valor usado / 2do valor no utilizado: unsigned int64 uiTscValue rdtscp (NULL). Compilador C no debe generar instrucciones MOV para guardar segundo valor en NULL dirección. En la actualidad, el compilador Intel C intenta guardar segundo valor en dirección NULL y se genera una excepción de infracción de acceso. Caso de uso 3 - 1er valor no utilizado / 2º valor utilizado: unsigned int iRetValue 0 rdtscp (ampiRetValue). El compilador C no debe generar instrucciones MOV para guardar el primer valor en alguna dirección. Caso de uso 4 - 1er valor no utilizado / 2º valor no utilizado: El compilador C no debe generar instrucciones MOV para guardar el primer valor y el segundo valor en algunas direcciones. Las instrucciones RDTSC / RDTSCP o las funciones intrínsecas rdtsc / rdtscp permiten realizar mediciones de intervalo de tiempo muy precisas. Considere un caso de prueba (pseudo-código): SETPRIORITYTOREALTIME. // Parte 1 TSCVALUE1 RDTSC () GUARDAR TSCVALUE1HIGHPART GUARDAR TSCVALUE1LOWPART. // Parte 2 Tratamiento crítico. . // Parte 3 TSCVALUE2 RDTSC () GUARDAR TSCVALUE2HIGHPART GUARDAR TSCVALUE2LOWPART. Parte 4 TSCDIFF TSCVALUE2 - TSCVALUE1. SETPRIORITYTONORMAL. A continuación, las partes 1 y 3 podrían considerarse como algún tipo de transacciones de medición de intervalos y las instrucciones binarias deben generarse sin reordenamientos para minimizar. Tanto como sea posible, la ejecución fuera de orden por una CPU. Sé que algunos problemas relacionados con RDTSC son resueltos por la instrucción RDTSCP, pero requiere una CPU con soporte de conjunto de instrucciones AVX. Perdón por contestar tarde. He escalado sus peticiones a los ingenieros y tengo algunos comentarios. Id elaborar uno por uno: 1. Introducción a pragma no reordenar la directiva de un pedazo de crítico C códigos para evitar cualquier re-pedidos de códigos binarios El uso de pragma para desactivar la programación es demasiado pesada herramienta para utilizar para el ajuste de rendimiento. Especialmente en el nivel C, las instrucciones de montaje y los registros no son visibles en el programa C. Será muy difícil para el usuario controlar incluso tenemos tal pragma. O tal vez usted realmente quiere que el pragma se optimice en este caso 2. Un mensaje de advertencia en el nivel / W5 (no en otros niveles) debe mostrarse cuando hay un reorden (s) El reorden puede ocurrir en 99.99 casos Después de la optimización, por lo tanto los mensajes serían demasiados y lo harán inútil. Sin embargo, puede ser razonable agregar una opción de línea de comandos, pero sólo porque hace que el código se parezca más a lo que el cliente puede leer (no por razones de rendimiento). Para 4, 5, 6 en este caso específico, estamos interesados ​​en reproducir el problema y fijado desde el lado del compilador. Las piezas de código no pueden proporcionar suficiente información para demostrar el problema y buscar una resolución. ¿Podría proporcionar un reproductor para la raíz de causar y seguir investigando el problema Espero que esto ayude. Yolanda Chen Intel Developer Herramientas de soporte Base de conocimientos: software. intel/en-us/articles/toolsThroughput de códigos binarios generados por Intel C compilador es 42 más lento El rendimiento de los códigos generados por Intel C compilador es 42 más lento que el rendimiento de los códigos generados por MinGW, Microsoft y los compiladores Watcom C legados. Esto se debe a que el compilador de Intel C reordenó una secuencia de instrucciones asumiendo erróneamente que mejorará el rendimiento debido a la canalización de una unidad de procesamiento. Una prueba intensiva de algunos códigos C mostró que el reordenamiento de las instrucciones no mejoraba el rendimiento. El compilador C moderno hace un montón de optimizaciones detrás de las escenas, pero los ingenieros de software C / C deben tener un mayor control de todas las acciones relacionadas con el reordenamiento de las instrucciones generadas, es decir, los códigos binarios. Consideraría tres opciones: - Un mensaje de advertencia en el nivel / W5 (no en otros niveles) debe mostrarse cuando hay un reordenamiento - Introducción una directiva de no-reordenación pragma para un pedazo de códigos críticos para evitar cualquier re - Ordena una opción de compilador de línea de comandos similar a la opción del compilador Watcom C - o (Reordenará instrucciones para evitar los puestos) IrtClflush (amppiAddress00) CrtClflush (amppiAddress10) CrtPrefetchData ((RTchar) amppiAddress00) // Todas las prefetches son T0-type CrtPrefetchData RTchar) amppiAddress10) CrtPrefetchData ((RTchar) amppiAddress20) CrtPrefetchData ((RTchar) amppiAddress30) CrtPrefetchData ((RTchar) amppiAddress40) CrtPrefetchData ((RTchar) amppiAddress50) CrtPrefetchData ((RTchar) amppiAddress60) CrtPrefetchData ((RTchar) amppiAddress70) CrtPrefetchData ((RTchar ) amppiAddress80) CrtPrefetchData ((RTchar) amppiAddress90) RTuint64 uiClock1 CrtRdtsc () CrtClflush (amppiAddress00) CrtClflush (amppiAddress10) CrtClflush (amppiAddress20) CrtClflush (amppiAddress30) CrtClflush (amppiAddress40) CrtClflush (amppiAddress50) CrtClflush (amppiAddress60) CrtClflush (amppiAddress70) CrtClflush (amppiAddress80 ) CrtClflush (amppiAddress90) RTuint64 uiClock2 CrtRdtsc () CrtPrintf (RTU (CrtClflush - Ejecutado en cyclesn reloj u), (RTuint) (uiClock2 - uiClock1) / 10) CrtPrintf (RTU (IrtClflush amp CrtClflushn)). Sun, 25/09/2016 - 20:57 Pruebas de tiempo de ejecución - Rastreo extendido - No compilador Intel C CrtClflush - Ejecutado en 20 ciclos de reloj CrtClflush - Ejecutado en 23 ciclos de reloj CrtClflush - Ejecutado en 24 ciclos de reloj CrtClflush - Ejecutado en 24 reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 19 ciclos de reloj CrtClflush - Ejecutado en 18 ciclos de reloj. Una pregunta es por qué lo hace más lento que el de Microsoft o Watcom compiladores de C Aquí se generan códigos binarios: 0040365C 0040365E RDTSC clflush ebp-8B8h 00403665 mov ecx, eax 00403667 clflush ebp-878h 0040366E clflush ebp-838h 00403675 clflush ebp-7F8h 0040367C clflush EBP - 7B8h 00403683 clflush ebp-778h 0040368A clflush ebp-738h 00403691 clflush ebp-6F8h 00403698 clflush ebp-6B8h 0040369F clflush ebp-678h 004036A6 rdtsc. 1. El compilador Intel C reordenó una secuencia de instrucciones. 2. Mov ecx, eax se coloca después del primer clflush ebp-8B8h para guardar un valor devuelto de RDTSC en el registro de propósito general eax. 3. Es posible que el pipelining esté afectado (muy probable). 4. Echa un vistazo a los códigos binarios perfectamente generados por Watcom C compilador (véase más adelante). 5. Casi el mismo reordenamiento es realizado por el compilador Microsoft C. CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj. Aquí se generan códigos binarios: 00403791 RDTSC 00403793 mov ecx, eax 00403795 lea eax, ebp-8AEh 0040379B clflush EAX EAX 0040379E lea, ebp-86Eh 004037A4 clflush eax 004037A7 lea eax, ebp-82Eh 004037AD clflush eax 004037B0 lea eax, ebp-7EEh 004037B6 clflush eax 004037B9 lea eax, ebp-7AEh 004037BF clflush eax 004037C2 lea eax, ebp-76Eh 004037C8 clflush eax 004037CB lea eax, ebp-72Eh 004037D1 clflush eax 004037D4 lea eax, ebp-6EEh 004037DA clflush eax 004037DD lea eax, ebp-6AEh 004037E3 clflush eax 004037E6 lea eax, ebp-66Eh 004037EC clflush eax 004037EF rdtsc. Perfecta generación de códigos binarios. CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj En 12 ciclos de reloj CrtClflush - Ejecutada en 12 ciclos de reloj CrtClflush - Ejecutada en 12 ciclos de reloj CrtClflush - Ejecutada en 12 ciclos de reloj CrtClflush - Ejecutada en 12 ciclos de reloj. códigos binarios que aquí se generan: 00244486 RDTSC 00244488 clflush ebp-300h 0024448F clflush ebp-240h 00244496 clflush ebp-180h 0024449D mov dword ptr ebp-48h, eax 002444A0 clflush ebp-340h 002444A7 clflush ebp-280H 002444AE clflush ebp-1C0h 002444B5 clflush ebp -100h 002444BC movimiento dword ptr ebp-44h, edx 002444BF clflush ebp-2C0h 002444C6 clflush ebp-200h 002444CD clflush ebp-140h 002444D4 rdtsc. 1. Incluso si el compilador de Microsoft C también reordenó los códigos binarios no afecta al rendimiento y al rendimiento de un bloque de códigos con un conjunto de instrucciones CLFLUSH. Rendimiento y rendimiento fue como se esperaba, es decir, 12 ciclos de reloj por instrucción ejecutada. 2. Además, el compilador de Microsoft C almacena valores de los registros de propósito general EDX y EAX, número de ciclos de reloj devueltos desde la instrucción RDTSC, a una variable creada en la pila. A modo de comparación, el compilador Intel C almacena un valor en el registro EAX en el registro ECX. Teóricamente debería ser más rápido que almacenar el valor en la RAM, es decir, en una variable creada en la pila. En realidad, los resultados de las pruebas son opuestos. El problema tiene dos partes, es decir: - La instrucción RDTSC no estaba alineada en un límite de 16 bytes para el compilador Intel C - La modificación de una serie de instrucciones CLFLUSH se ve afectada cuando se inserta una instrucción MOV después de la primera instrucción CLFLUSH Por cierto, Los compiladores Watcom C binarios de códigos no están alineados en un límite de 16 bytes y no tiene ningún problema Así que decidí usar una solución forzando una alineación en un límite de 16 bytes (DEFAULTCODEALIGN16 es una macro basada en asm ALIGN 16 assembler Directiva). Códigos omitidos. DEFAULTCODEALIGN16 RTuint64 uiClock1 CrtRdtsc () CrtClflush (amppiAddress00) CrtClflush (amppiAddress10) CrtClflush (amppiAddress20) CrtClflush (amppiAddress30) CrtClflush (amppiAddress40) CrtClflush (amppiAddress50) CrtClflush (amppiAddress60) CrtClflush (amppiAddress70) CrtClflush (amppiAddress80) CrtClflush (amppiAddress90) RTuint64 uiClock2 CrtRdtsc ( ). Aquí hay estadísticas para una dirección de memoria de la primera instrucción RDTSC: MSC - 00244490 0x10 0 - Alineado en el límite de 16 bytes - Sí (forzado por DEFAULTCODEALIGN16) ICC - 00403660 0x10 0 - Alineado en el límite de 16 bytes - Sí (forzado por DEFAULTCODEALIGN16) BCC - 0040417A 0x10 10 - Alineado en el límite de 16 bytes - No (la solución es N / D) WCC - 00403791 0x10 11 - Alineado en el límite de 16 bytes - Sí (forzado por DEFAULTCODEALIGN16) CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj CrtClflush - Ejecutado en 12 ciclos de reloj. Esto es lo que quería ver antes de pasar a otra tarea. GtgtWhats su procesador de orientación Y la opción de optimización que utilizó Es predeterminado - mSSE2 Considero que el problema con Re-ordenaciones como un fundamental y no deberíamos tener ninguna limitación relacionada con CPUs, ISAs, etc gtgtBesides los ciclos clflush, ha contado el rdtsc Latencia No porque no es necesario en ese caso. En general, hay tres casos posibles de uso de RDTSC (el mismo se aplica a cualquier API de temporización): Caso 1: - Una instrucción RDTSC se llamó después de algún bloque de códigos y devuelve un número de ciclos de reloj Cuando el bloque ha completado el procesamiento - RDTSC (80 ciclos de reloj) Caso 2: - Una instrucción RDTSC será llamada antes de algún bloque de códigos y devuelve un número de ciclos de reloj Cuando el bloque está a punto de comenzar Procesamiento - latencia de RDTSC s Caso 3: - Dos instrucciones RDTSC serán llamadas antes (será T1) y después (será T2) algún Bloque de Códigos y diferencia de (T2 - T1 ) Es un número de ciclos de reloj que llevó a Completar Procesamiento - No hay ninguna corrección debe tenerse en cuenta (Nota: 3 º caso es el más común como usted sabe) optimización gtgtCompiler puede volver a ordenar las instrucciones basadas en la instrucción de latencia / Micro-arquitectura. Lo entiendo pero mi punto es: Intel C compilador debe darnos un mayor control en similar a mis casos. Si un ingeniero de software tiene algunas especificaciones, sabe cómo se debe hacer algún procesamiento (su orden, número de instrucciones, el número estimado de ciclos de reloj para completar el procesamiento, etc), entonces el compilador Intel C no debe interferir con los códigos de Software Engineers. Por supuesto, la implementación con ensamblador resuelve todos estos problemas, pero es más tiempo para implementar y rompe la portabilidad de los códigos fuente C / C. Estoy bastante seguro de que los gastos generales de múltiples llamadas a RDTSC cant cancelar como se sugiere en el mensaje 14 anterior (software. intel/en-us/forums/intel-c-compiler/topic/697062co.). Esto requeriría que la primera llamada a RDTSC devuelva el recuento de ciclos al final de su ejecución, mientras que la segunda llamada a RDTSC tendría que devolver el recuento de ciclos al comienzo de su ejecución. Esto no tiene sentido. Miré la superposición de RDTSC y RDTSCP instrucciones con código de usuario con algún detalle en un nuevo puesto en software. intel/en-us/forums/software-tuning-performance-opti. John D. McCalpin, PhD Dr. Ancho de banda Wed, 09/28/2016 - 12:11 gtgt. Si coloca su código de prueba de desempeño en un bucle, ¿cuál es el momento excluyendo el primer viaje a través del código de prueba Jim, aquí están los resultados de rendimiento cuando el caso de prueba de serie se convirtió en un caso de prueba . Resultados del rendimiento de lo mejor a lo peor: MinGW C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 120 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 84 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 3 reloj Ciclos Intel C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 196 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 152 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 4 reloj Ciclos Watcom C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 212 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 128 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 8 reloj Ciclos Microsoft C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 192 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 88 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 10 reloj Ciclos Borland C compilador. Sub-Test002.21.B - Procesamiento de 10 llamadas - Ejecutado en 964 ciclos de reloj Sub-Test002.21.B - Para-Loop Overhead - Ejecutado en 264 ciclos de reloj Sub-Test002.21.B - CrtClflush - Ejecutado en 70 reloj Ciclos Los resultados son muy reproducibles y veo que en el caso de los compiladores MinGW e Intel C era capaz de obtener números de límite bajo para la instrucción CLFLUSH indicada por Intel en Intel 64 e IA-32 Architectures Optimization Reference Manual Referencia: 248966-033 Junio 2016 Capítulo: LATENCIA DE INSTRUCCIONES Y TRAVESA Tabla C-17. Instrucciones de uso general (Página C-17) Las salidas de CLFLUSH para diferentes CPUs son de 5 a 50 ciclos de reloj. . Estoy de acuerdo con su punto de que si un ingeniero de software tiene algunas especificaciones, sabe cómo algún procesamiento debe hacerse (su orden, el número de instrucciones, el número estimado de ciclos de reloj para completar el procesamiento, etc), entonces el compilador Intel C no debe interferir Con los códigos de Software Engineers. A partir de este caso específico, me parece que la latencia clflush es causada por el problema de alineación en lugar de volver a ordenar. ¿Ha confirmado el impacto de volver a ordenar después de forzado alineado Para los casos reordenación no se desea, será-O0 para deshabilitar la optimización ayuda Sería genial con un ejemplo de reordenación de compilador disminuir el rendimiento y requiere de control de ingenieros. Yolanda Chen Intel Developer Herramientas de Soporte Base de Conocimiento: software. intel/en-us/articles/tools Aquí está una Lista de Características / Propuestas relacionadas con la generación de códigos binarios por el compilador Intel C cuando algunos códigos críticos se implementan en lenguaje C: 1. Introducción una directiva pragma no-reorden para un pedazo de códigos críticos de C para prevenir cualquier re-órdenes de códigos binarios 2. Se debe mostrar un mensaje de advertencia en el nivel / W5 (no en otros niveles) cuando hay un reordenamiento (s) 3. Una opción de compilador de línea de comandos para controlar órdenes de instrucciones 4. Si se llama a la instrucción RDTSC, entonces las instrucciones MOV, para guardar los valores EDX: EAX o RDX: RAX de los registros de propósito general, no deben ser reordenadas 5. Si la instrucción RDTSCP es llamada entonces las instrucciones de MOV, para guardar los valores EDX: EAX o RDX: RAX de los registros de propósito general, no deben ser reordenadas 6. Hay que considerar cuatro casos de uso posibles para la función intrínseca de rdtscp. La función se declara de la siguiente manera:. Extern unsigned int64 ICLINTRINCC rdtscp (unsigned int). Nota . Permite denotar uiTscValue como primer valor. Y iRetValue como segundo valor. Caso de uso 1 - 1er valor usado / 2do valor utilizado: unsigned int iRetValue 0 sin signo int64 uiTscValue rdtscp (ampiRetValue). El compilador C debe generar instrucciones MOV ordenadas para guardar el primer valor y el segundo valor en algunas direcciones. Caso de uso 2 - 1er valor usado / 2do valor no utilizado: unsigned int64 uiTscValue rdtscp (NULL). Compilador C no debe generar instrucciones MOV para guardar segundo valor en NULL dirección. En la actualidad, el compilador Intel C intenta guardar segundo valor en dirección NULL y se genera una excepción de infracción de acceso. Caso de uso 3 - 1er valor no utilizado / 2º valor utilizado: unsigned int iRetValue 0 rdtscp (ampiRetValue). El compilador C no debe generar instrucciones MOV para guardar el primer valor en alguna dirección. Caso de uso 4 - 1er valor no utilizado / 2º valor no utilizado: El compilador C no debe generar instrucciones MOV para guardar el primer valor y el segundo valor en algunas direcciones. Las instrucciones RDTSC / RDTSCP o las funciones intrínsecas rdtsc / rdtscp permiten realizar mediciones de intervalo de tiempo muy precisas. Considere un caso de prueba (pseudo-código): SETPRIORITYTOREALTIME. // Parte 1 TSCVALUE1 RDTSC () GUARDAR TSCVALUE1HIGHPART GUARDAR TSCVALUE1LOWPART. // Parte 2 Tratamiento crítico. . // Parte 3 TSCVALUE2 RDTSC () GUARDAR TSCVALUE2HIGHPART GUARDAR TSCVALUE2LOWPART. Parte 4 TSCDIFF TSCVALUE2 - TSCVALUE1. SETPRIORITYTONORMAL. A continuación, las partes 1 y 3 podrían considerarse como algún tipo de transacciones de medición de intervalos y las instrucciones binarias deben generarse sin reordenamientos para minimizar. Tanto como sea posible, la ejecución fuera de orden por una CPU. Sé que algunos problemas relacionados con RDTSC son resueltos por la instrucción RDTSCP, pero requiere una CPU con soporte de conjunto de instrucciones AVX. Perdón por contestar tarde. He escalado sus peticiones a los ingenieros y tengo algunos comentarios. Id elaborar uno por uno: 1. Introducción a pragma no reordenar la directiva de un pedazo de crítico C códigos para evitar cualquier re-pedidos de códigos binarios El uso de pragma para desactivar la programación es demasiado pesada herramienta para utilizar para el ajuste de rendimiento. Especialmente en el nivel C, las instrucciones de montaje y los registros no son visibles en el programa C. Será muy difícil para el usuario controlar incluso tenemos tal pragma. O tal vez usted realmente quiere que el pragma se optimice en este caso 2. Un mensaje de advertencia en el nivel / W5 (no en otros niveles) debe mostrarse cuando hay un reorden (s) El reorden puede ocurrir en 99.99 casos Después de la optimización, por lo tanto los mensajes serían demasiados y lo harán inútil. Sin embargo, puede ser razonable agregar una opción de línea de comandos, pero sólo porque hace que el código se parezca más a lo que el cliente puede leer (no por razones de rendimiento). Para 4, 5, 6 en este caso específico, estamos interesados ​​en reproducir el problema y fijado desde el lado del compilador. Las piezas de código no pueden proporcionar suficiente información para demostrar el problema y buscar una resolución. ¿Podría proporcionar un reproductor para la raíz de causar y seguir investigando el problema Espero que esto ayude. Yolanda Chen Intel Developer Herramientas de soporte Base de conocimientos: software. intel/en-us/articles/tools


No comments:

Post a Comment