Decimal / Twos Complement Converter Über den Decimal / Two8217s Complement Converter Dies ist ein dezimaler bis two8217s Komplement-Wandler und ein two8217s Komplement zum dezimalen Wandler. Diese Konverter ergänzen ihre Eingaben nicht, sie werden nicht negiert. Sie konvertieren es nur zu oder von two8217s Komplement Form. Zum Beispiel konvertiert -7 zu 11111001 (zu 8 Bits), was -7 in two8217s-Komplement ist. (Ergänzung würde es machen 7, oder 00000111 bis 8 Bits.) Ebenso konvertiert 0011 zu 3, nicht -3. Verwenden der Decimal / Two8217s Complement Converter Decimal to Two8217s Complement Geben Sie eine positive oder negative Ganzzahl ein. Legen Sie die Anzahl der Bits für die two8217s-Komplementdarstellung fest (falls anders als die Standardeinstellung). Klicken Sie auf lsquoConvertrsquo zu konvertieren. Klicken Sie auf lsquoClearrsquo, um das Formular zurückzusetzen und neu zu starten. Wenn Sie eine andere Zahl konvertieren möchten, geben Sie einfach über die ursprüngliche Zahl und klicken Sie lsquoConvertrsquo 8212 gibt es keine Notwendigkeit, zuerst lsquoClearrsquo klicken. Wenn die Zahl, die Sie eingeben, zu groß ist, um in der angeforderten Anzahl von Bits dargestellt zu werden, erhalten Sie eine Fehlermeldung, die Sie so (es wird Ihnen sagen, wie viele Bits Sie benötigen). Two8217s Ergänzung zu Decimal Geben Sie eine two8217s Komplementnummer 8212 ein Zeichenfolge von 0s und 1s ein. Stellen Sie die Anzahl der Bits so ein, dass sie der Länge des Eingangssignals entsprechen (falls abweichend von der Voreinstellung). Klicken Sie auf lsquoConvertrsquo zu konvertieren. Klicken Sie auf lsquoClearrsquo, um das Formular zurückzusetzen und neu zu starten. Der Ausgang ist eine positive oder negative Dezimalzahl. Exploring-Eigenschaften von Two8217s Komplement-Konvertierung Der beste Weg, um two8217s Komplement-Konvertierung zu erkunden ist, mit einer kleinen Anzahl von Bits beginnen. Zum Beispiel beginnen let8217s mit 4 Bits, die 16 Dezimalzahlen, den Bereich -8 bis 7 darstellen können. Hier8217s, was der dezimale bis two8217s-Komplementwandler für diese 16 Werte zurückgibt: Four-Bit Two8217s Komplementwerte Egal, wie viele Bits Sie verwenden In Ihrer two8217s Komplementdarstellung ist -1 decimal immer ein String von 1s in binär. Konvertieren von Two8217s Komplement Festpunkt zu Dezimal Sie können die two8217s Komplement zum dezimalen Wandler verwenden, um Zahlen zu konvertieren, die in Fixpunkt two8217s Komplement Notation sind. Zum Beispiel, wenn Sie 16-Bit-Nummern im Q7.8-Format haben. Geben Sie den two8217s-Komplementwert ein, und teilen Sie dann nur die Dezimalantwort mit 2 8 auf. (Zahlen im Q7.8-Formatbereich von -2 15/2 8 -128 bis (2 15 -1) / 2 8 127.99609375.) Hier einige Beispiele: 0101111101010101 konvertiert in 24405 und 24405/2 8 95.33203125 1101010101110111 wandelt in -10889 um, und -10889/2 8 -42.53515625 Implementierung Dieser Konverter wird in einer beliebigen Genauigkeits-Dezimalarithmetik implementiert. Anstatt auf die Binärdarstellung der Eingänge 8212 in dem üblichen ldquoflip die Bits zu betreiben und den 1rdquo-Weg 8212 hinzuzufügen, führt sie Operationen auf der dezimalen Darstellung der Eingänge aus, addiert oder subtrahiert eine Potenz von zwei. Genauer gesagt, dies ist was8217s getan und wenn: Decimal to two8217s komplementieren Nonnegative Eingang: Einfach in Binär-und Pad mit führenden 0s konvertieren. Negative Eingabe (lsquo-rsquo-Zeichen): Add 2 numBits. Dann in binär. Two8217s Komplement zum dezimalen nichtnegativen Eingang (führendes lsquo0rsquo-Bit): Einfach in dezimal konvertieren. Negative Eingabe (führendes lsquo1rsquo-Bit): In Dezimalzahl umwandeln, eine positive Zahl erhalten, dann 2 numBits subtrahieren. Aus praktischen Gründen setzt I8217ve eine beliebige Grenze von 512 Bits auf die Eingänge. Der Durchsatz der binären Codes, die von Intel C-Compiler generiert wird, ist 42 langsamer Der Durchsatz von Codes, die von Intel C-Compiler generiert werden, ist 42 langsamer als der Durchsatz von Codes, die von MinGW, Microsoft und Legacy generiert wurden Watcom C-Compiler. Dies liegt daran, dass der Intel C-Compiler eine Folge von Anweisungen falsch anordnete, vorausgesetzt, dass es die Leistung aufgrund einer Pipeline-Verarbeitung einer Verarbeitungseinheit verbessert. Eine intensive Prüfung einiger C-Codes zeigte, dass eine erneute Bestellung von Befehlen die Leistung nicht verbessert hat. Moderne C-Compiler tun viele Optimierungen hinter den Kulissen, aber C / C-Software-Ingenieure sollten eine größere Kontrolle über alle Aktionen im Zusammenhang mit der Neuordnung von generierten Anweisungen, dh binäre Codes. Ich würde drei Optionen betrachten: - Eine Warnmeldung auf / W5-Ebene (Nicht auf anderen Ebenen) muss angezeigt werden, wenn es eine Nachbestellung - Einführung einer pragma keine Neuordnung Richtlinie für einen Teil der kritischen Codes, um zu verhindern, Reihenfolgen - Ein ähnlicher Compiler-Option Befehlszeile Watcom C-Compiler-Option - oder (Re-Order Anweisungen Stände zu vermeiden) IrtClflush (amppiAddress00) CrtClflush (amppiAddress10) CrtPrefetchData ((RTchar) amppiAddress00) // Alle Prefetch-sind T0-Typ 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 - in u Uhr cyclesn ausgeführt), (RTuint) (uiClock2 - uiClock1) / 10) CrtPrintf (RTU (IrtClflush amp CrtClflushn)). Sun, 09/25/2016 - 20:57 Run-Time-Tests - Extended Tracing - Kein Intel C-Compiler CrtClflush - Wird in 20 Taktzyklen ausgeführt CrtClflush - Ausführung in 23 Taktzyklen CrtClflush - Ausführung in 24 Taktzyklen CrtClflush - Ausführung in 24 Takten Zyklen CrtClflush - Ausführung in 20 Taktzyklen CrtClflush - Ausführung in 19 Taktzyklen CrtClflush - Ausführung in 19 Taktzyklen CrtClflush - Ausführung in 22 Taktzyklen CrtClflush - Ausführung in 19 Taktzyklen CrtClflush - Ausführung in 18 Taktzyklen. Eine Frage ist, warum es funktioniert langsamer als Microsoft oder Watcom C-Compiler Hier binäre Codes erzeugt werden: 0040365C RDTSC 0040365E CLFLUSH EBP-8B8h 00.403.665 mov ECX, EAX 00.403.667 CLFLUSH EBP-878h 0040366E CLFLUSH EBP-838h 00.403.675 CLFLUSH EBP-7F8h 0040367C CLFLUSH ebp - 7B8h 00.403.683 CLFLUSH EBP-778h 0040368A CLFLUSH EBP-738h 00.403.691 CLFLUSH EBP-6F8h 00.403.698 CLFLUSH EBP-6B8h 0040369F CLFLUSH EBP-678h 004036A6 RDTSC. 1 ist. Intel C-Compiler ordnete eine Folge von Befehlen nach. 2. Mov ecx, eax wird nach dem 1. clflush ebp-8B8h platziert, um einen Wert zu speichern, der von RDTSC im eax-Allzweckregister zurückgegeben wird. 3 . Es ist möglich, dass Pipelining betroffen ist (sehr wahrscheinlich). 4. Werfen Sie einen Blick auf eine perfekt generierte Binärcodes von Watcom C-Compiler (siehe unten). 5. Fast die gleiche Re-Reihenfolge wird von Microsoft C-Compiler durchgeführt. CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen. Hier sind binäre Codes generiert: 00403791 RDTSC 00403793 mov ECX, EAX 00403795 lea eax, EBP-8AEh 0040379B CLFLUSH EAX 0040379E lea eax, 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. Perfekte binäre Codes Generation. Laufzeittests - Erweiterter Tracing - keine Microsoft C-Compiler CrtClflush - Ausgeführt in 12 Taktzyklen CrtClflush - Ausgeführt in 12 Taktzyklen CrtClflush - Ausgeführt in 12 Taktzyklen CrtClflush - Ausgeführt in 12 Taktzyklen CrtClflush - Ausgeführt in 12 Taktzyklen CrtClflush - Ausgeführt In 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen. Hier erzeugt binäre Codes: 00244486 RDTSC 00244488 CLFLUSH EBP-300h 0024448F CLFLUSH EBP-240h 00.244.496 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 Bewegliches Wort ptr ebp-44h, edx 002444BF clflush ebp-2C0h 002444C6 clflush ebp-200h 002444CD clflush ebp-140h 002444D4 rdtsc. 1 ist. Selbst wenn Microsoft C-Compiler auch binäre Codes nachbestellt hat, wirkt es nicht auf Leistung und Durchsatz eines Blocks von Codes mit einem Satz von CLFLUSH-Anweisungen. Leistung und Durchsatz waren wie erwartet, dh 12 Taktzyklen pro Anweisung ausgeführt. 2. Außerdem speichert Microsoft C-Compiler Werte aus den Allzweck-Registern EDX und EAX, Anzahl der Taktzyklen, die von der RDTSC-Anweisung zurückgegeben werden, in eine Variable, die auf dem Stapel erzeugt wird. Zum Vergleich: Der Intel C-Compiler speichert einen Wert im EAX-Register im ECX-Register. Theoretisch sollte es schneller als das Speichern des Werts zum RAM sein, dh zu einer auf dem Stapel erzeugten Variablen. In Wirklichkeit sind die Ergebnisse der Tests entgegengesetzt. Das Problem besteht aus zwei Teilen: - RDTSC-Befehl wurde nicht auf einer 16-Byte-Grenze für Intel C-Compiler ausgerichtet - Pipelining einer Reihe von CLFLUSH-Befehlen ist betroffen, wenn eine MOV-Anweisung nach dem ersten CLFLUSH-Befehl eingefügt wird By the way, Watcom C-Compiler binär von Codes sind nicht auf einer 16-Byte-Grenze ausgerichtet und es hat keine Probleme Also habe ich beschlossen, eine Workaround verwenden, indem Sie eine Ausrichtung auf einer 16-Byte-Grenze (DEFAULTCODEALIGN16 ist ein Makro auf asm ALIGN 16 Assembler basiert Richtlinie). Codes übersprungen. 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 ( ). Hier ist die Statistik für eine Speicheradresse der 1. RDTSC-Anweisung: MSC - 00244490 0x10 0 - An der 16-Byte-Grenze ausgerichtet - Ja (erzwungen durch DEFAULTCODEALIGN16) ICC - 00403660 0x10 0 - An der 16-Byte-Grenze ausgerichtet - Ja (erzwungen durch DEFAULTCODEALIGN16) MGW - 00402490 0x10 0 - Ausgerichtet auf 16-Byte-Grenze - Ja (von DEFAULTCODEALIGN16 erzwungen) BCC - 0040417A 0x10 10 - Ausgerichtet auf 16-Byte-Grenze - Nein (Abhilfe ist N / A) WCC - 00403791 0x10 11 - Byte-Grenze - Nein (Workaround ist N / A) Laufzeittest - Extended Tracing - Kein Intel C-Compiler - AFTER Ausrichtung wurde angewendet CrtClflush - Ausgeführt in 12 Taktzyklen CrtClflush - Ausgeführt in 12 Taktzyklen CrtClflush - Wird in 12 Taktzyklen ausgeführt CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen CrtClflush - Ausführung in 12 Taktzyklen. Dies ist, was ich sehen wollte, bevor ich auf eine andere Aufgabe zu bewegen. GtgtWhats Ihre Targeting-Prozessor Und die Optimierungsoption, die Sie verwendet Ist es Standard-mSSE2 Ich halte dieses Problem mit Re-Ordnungen als grundlegende und wir sollten keine Einschränkungen im Zusammenhang mit CPUs, ISAs, etc. gtgtBesides die Clflush-Zyklen, haben Sie die rdtsc gezählt Latenz Nein, weil es in diesem Fall nicht benötigt wird. Im Allgemeinen gibt es drei mögliche Fälle der Verwendung von RDTSC (das gleiche gilt für alle zeitgesteuerten APIs): Fall 1: - Eine RDTSC-Anweisung wurde nach einem Block von Codes aufgerufen und gibt eine Anzahl von Taktzyklen zurück, wenn der Block abgeschlossen ist - RDTSC (80 Taktzyklen) Fall 2: - Eine RDTSC-Anweisung wird vor einem Block von Codes aufgerufen und gibt eine Anzahl von Taktzyklen zurück, wenn der Block zu Beginn der Verarbeitung - RDTSC-Latenz beginnt (80 Taktzyklen) Fall 3: - Zwei RDTSC-Befehle werden vor (es wird T1 genannt) und nach (es wird T2 sein) einige Block von Codes und Differenz von (T2 - T1 ) Ist eine Anzahl von Taktzyklen, die es bis zur vollständigen Verarbeitung getan hat - keine Korrekturen müssen berücksichtigt werden (Anmerkung: 3. Fall ist die häufigste, wie Sie wissen) gtgtCompiler Optimierung kann Befehle auf Anweisung Latenz / Mikroarchitektur. Ich verstehe, aber mein Punkt ist: Intel C-Compiler sollte uns eine größere Kontrolle in ähnlich wie in meinen Fällen. Wenn ein Software-Ingenieur einige Spezifikationen hat, weiß er, wie einige Verarbeitungen durchgeführt werden müssen (Reihenfolge, Anzahl der Anweisungen, geschätzte Anzahl von Taktzyklen, um die Verarbeitung abzuschließen, usw.), dann sollte Intel C-Compiler nicht die Software Engineers Codes stören. Natürlich löst die Implementierung mit assembler alle diese Probleme, aber es ist zeitaufwendiger zu implementieren und es bricht die Portabilität von C / C-Quellcodes. Ich bin mir ziemlich sicher, dass die Gemeinkosten von mehreren Anrufen auf RDTSC cant abbrechen, wie in Nachricht 14 oben (Software. intel/en-us/forums/intel-c-compiler/topic/697062co) vorgeschlagen. Dies würde erfordern, dass der erste Aufruf von RDTSC die Zykluszählung am Ende seiner Ausführung zurückgibt, während der zweite Aufruf von RDTSC die Zykluszählung am Beginn seiner Ausführung zurückgeben muss. Das macht keinen Sinn. Ich betrachtete die Überlappung von RDTSC - und RDTSCP-Befehlen mit Benutzercode im Detail in einem neuen Beitrag unter software. intel/en-us/forums/software-tuning-performance-opti. John D. McCalpin, PhD Dr. Bandwidth Wed, 28.09.2016 - 12:11 Uhr gtgt. Wenn Sie den Performance-Test-Code in einer Schleife platzieren, was ist das Timing ohne die erste Reise durch den Test-Code Jim, Hier sind Leistungsergebnisse, wenn das Serial-Test-Fall wurde zu einem 10-Interaktionen For-Loop-Test-Fall konvertiert . Leistung vom besten bis zum schlechtesten: MinGW C-Compiler. Sub-Test002.21.B - Bearbeitung von 10 Anrufen - Ausführung in 120 Taktzyklen Sub-Test002.21.B - For-Loop Overhead - Wird in 84 Taktzyklen ausgeführt Sub-Test002.21.B - CrtClflush - Wird in 3 Clocks ausgeführt Fahrräder . Intel C-Compiler. Sub-Test002.21.B - Verarbeitung von 10 Anrufen - Ausführung in 196 Taktzyklen Sub-Test002.21.B - For-Loop Overhead - Ausführung in 152 Taktzyklen Sub-Test002.21.B - CrtClflush - Ausführung in 4 Uhr Fahrräder . Watcom C-Compiler. Sub-Test002.21.B - Bearbeitung von 10 Anrufen - Ausführung in 212 Taktzyklen Sub-Test002.21.B - For-Loop Overhead - Ausführung in 128 Taktzyklen Sub-Test002.21.B - CrtClflush - Ausführung in 8 Takten Fahrräder . Microsoft C-Compiler. Sub-Test002.21.B - Bearbeitung von 10 Anrufen - Ausführung in 192 Taktzyklen Sub-Test002.21.B - For-Loop Overhead - Ausführung in 88 Taktzyklen Sub-Test002.21.B - CrtClflush - Ausführung in 10 Takten Fahrräder . Borland C-Compiler. Sub-Test002.21.B - Verarbeitung von 10 Anrufen - Ausführung in 964 Taktzyklen Sub-Test002.21.B - For-Loop Overhead - Wird in 264 Taktzyklen ausgeführt Sub-Test002.21.B - CrtClflush - Ausgeführt in 70 Takten Fahrräder . Die Ergebnisse sind sehr reproduzierbar und ich sehe, dass ich im Falle von MinGW - und Intel C-Compilern niedrig gebundene Nummern für CLFLUSH-Anweisungen von Intel in: Intel 64 und IA-32-Architekturen optimieren konnte Referenzhandbuch Bestellnummer: 248966-033 Juni 2016 Kapitel: BETRIEBSLATENZ UND DURCHFÜHRUNG Tabelle C-17. Allzweckanweisungen (Seite C-17) CLFLUSH-Durchsätze für verschiedene CPUs sind 5 bis 50 Taktzyklen. . Ich bin mit deiner Meinung einverstanden, dass, wenn ein Software-Ingenieur einige Spezifikationen hat, weiß, wie einige Verarbeitung durchgeführt werden muss (seine Reihenfolge, Anzahl der Anweisungen, geschätzte Anzahl der Taktzyklen, um die Verarbeitung abzuschließen, usw.), dann sollte Intel C-Compiler nicht stören Mit den Software Engineers Codes. Von diesem spezifischen Fall, es sieht zu mir die Clflush-Latenz wird durch Ausrichtung Problem anstelle von Neuordnung verursacht. Haben Sie die Auswirkungen der Nachbestellung nach erzwungenen ausgerichtet bestätigt Für Fälle Nachbestellung ist nicht erwünscht, wird - O0 zu deaktivieren Optimierung hilft Es wäre großartig mit einem Beispiel, wo Neuordnung von Compiler verringern Leistung und erfordert Ingenieure Kontrolle. Yolanda Chen Intel Entwickler-Support-Tools Wissensdatenbank: software. intel/en-us/articles/tools Hier ist eine Liste von Funktionen / Vorschlägen in Bezug auf binäre Codes Generation von Intel C-Compiler, wenn einige Critical Codes in C-Sprache implementiert sind: 1. Einführung einer pragma-no-reorder-Direktive für ein Stück Critical C-Codes zur Verhinderung von Nachbestellungen von binären Codes 2. Eine Warnmeldung auf / W5-Ebene (Nicht auf anderen Ebenen) muss bei einer Nachbestellung angezeigt werden 3. Eine Befehlszeilen-Compileroption zur Steuerung von Nachbestellungen von Befehlen 4. Wenn RDTSC-Befehl aufgerufen wird, sollten MOV-Befehle, um EDX: EAX oder RDX: RAX-Werte von Mehrzweckregistern zu speichern, nicht nachbestellt werden 5. Wenn RDTSCP-Befehl aufgerufen wird, sollten MOV-Befehle, um EDX: EAX oder RDX: RAX-Werte von Allzweckregistern zu speichern, nicht nachbestellt werden 6. Es sind vier mögliche Anwendungsfälle für die intrinsische Funktion von rdtscp zu berücksichtigen. Die Funktion ist wie folgt deklariert:. Extern unsigned int64 ICLINTRINCC rdtscp (unsigned int). Hinweis . UiTscValue als 1. Wert bezeichnen. Und iRetValue als 2. Wert. Verwendung Fall 1 - 1. Wert verwendet / 2. Wert verwendet: unsigned int iRetValue 0 unsigned int64 uiTscValue rdtscp (ampiRetValue). C-Compiler sollte geordnete MOV-Anweisungen erzeugen, um den ersten Wert und den zweiten Wert an einigen Adressen zu speichern. Use Case 2 - 1. Wert verwendet / 2. Wert nicht verwendet: unsigned int64 uiTscValue rdtscp (NULL). C-Compiler sollte keine MOV-Befehle generieren, um den 2. Wert an der NULL-Adresse zu speichern. Derzeit versucht Intel C-Compiler, 2. Wert zu NULL-Adresse zu speichern und Access Violation-Ausnahme generiert wird. Use Case 3 - 1. Wert nicht verwendet / 2. Wert verwendet: unsigned int iRetValue 0 rdtscp (ampiRetValue). C-Compiler sollte keine MOV-Befehle generieren, um den 1. Wert an einer Adresse zu speichern. Anwendungsfall 4 - 1. Wert nicht verwendet / 2. Wert nicht verwendet: C-Compiler sollte keine MOV-Anweisungen erzeugen, um den 1. Wert und den 2. Wert bei einigen Adressen zu speichern. RDTSC / RDTSCP-Befehle oder rdtsc / rdtscp-intrinsische Funktionen ermöglichen sehr genaue Zeitintervallmessungen. Betrachten Sie einen Testfall (Pseudocode): SETPRIORITYTOREALTIME. // Teil 1 TSCVALUE1 RDTSC () SAVE TSCVALUE1HIGHPART SPEICHERN TSCVALUE1LOWPART. // Teil 2 Kritische Verarbeitung. . // Teil 3 TSCVALUE2 RDTSC () SAVE TSCVALUE2HIGHPART SPEICHERN TSCVALUE2LOWPART. // Teil 4 TSCDIFF TSCVALUE2 - TSCVALUE1. SETPRIORITYTONORMAL. Dann könnten die Teile 1 und 3 als irgendeine Art von Intervallmessungstransaktionen betrachtet werden und binäre Anweisungen müssen ohne Nachbestellungen erzeugt werden, um zu minimieren. So viel wie möglich, out-of-order Ausführung durch eine CPU. Ich weiß, dass einige Probleme im Zusammenhang mit RDTSC durch RDTSCP-Befehl gelöst werden, aber es erfordert eine CPU mit Unterstützung der AVX-Befehlssatz. Entschuldige meine späte Antwort. Ich habe Ihre Anfragen an Ingenieure eskaliert und bekam ein Feedback. ID erarbeiten sie nacheinander: 1. Einführung einer pragma-no-reorder-Direktive für ein Stück Critical C-Codes zur Verhinderung von Nachbestellungen von binären Codes Mit Hilfe von pragma, um die Terminierung abzuschalten, ist viel zu schweres Tool für die Leistungsoptimierung zu verwenden. Insbesondere auf der C-Ebene sind die Montageanleitungen und Register im C-Programm nicht sichtbar. Es wird sehr schwierig für den Benutzer zu kontrollieren, auch wir haben ein solches Pragma. Oder vielleicht wollen Sie tatsächlich wollen, dass Pragma in diesem Fall optimieren 2. Eine Warnmeldung auf / W5-Ebene (Nicht auf anderen Ebenen) muss angezeigt werden, wenn es eine Neuordnung (en) Die Wiederbestellung kann in 99,99 Fällen passieren Nach Optimierung, so dass die Nachrichten zu viele und machen es nutzlos. 3. Eine Befehlszeilen-Compileroption zur Steuerung von Befehlszeilenanweisungen Es kann sinnvoll sein, eine Befehlszeilenoption hinzuzufügen, aber nur, weil sie den Code besser aussehen lässt, was der Kunde lesen und verstehen kann (nicht aus Performancegründen). Für 4, 5, 6 in diesem speziellen Fall, sind wir daran interessiert, das Problem zu reproduzieren und feste von Compiler-Seite. Die Code-Stücke können nicht genug Informationen liefern, um das Problem zu demonstrieren und nach einer Lösung zu suchen. Könnten Sie einen Reproduzierer für Wurzel-verursachen und weiter untersuchen das Problem Hope dies hilft. Yolanda Chen Intel Developer Support-Tools Wissensdatenbank: software. intel/en-us/articles/toolsGenDepex. exe GenDepex. exe oder GenDepex. py - Konvertieren Sie die Abhängigkeitszeichenfolge der Datei in den binären PI-Abhängigkeitsausdruck. Beschreibung GenDepex generiert den binären PI-Abhängigkeitsausdruck entsprechend dem Modultyp durch Analysieren der inputabhängigen Ausdruckszeichenfolge oder der vorverarbeiteten dxs-Datei. Für den PEIM-Modultyp wird der PEI-Abhängigkeitsausdruck erzeugt. Für DXEDRIVER, UEFIDRIVER, DXERUNTIMEDRIVER, DXESALDRIVER und DXESMMDRIVER. Wird der DXE-Abhängigkeitsausdruck erzeugt. GenDepex-Tool ist kein eigenständiges Tool. Wenn Depex-Abschnitt in Modul INF angegeben wird, wird es von dem Build-Tool verwendet. Das Build-Tool analysiert zuerst den Inhalt in depex Abschnitt, um die Abhängigkeit Ausdruck Ausdruck String, dann GenDepex analysiert die generierte Zeichenfolge. Wenn ein depex-Abschnitt nicht angegeben ist, aber File. dxs-Datei existiert, wird das GenDepex-Tool zusammen mit dem Compiler und dem EDKII-Trimmwerkzeug verwendet. Das File. dxs zuerst wird von Compiler vorverarbeitet und dann durch das Trim-Tool verarbeitet, um alle anderen Code mit Ausnahme des Abhängigkeitsinhalts zu entfernen, zuletzt wird das GenPepex die vorverarbeitete Abhängigkeitsdatei verarbeiten. Wenn keine Optionen angegeben sind, gibt das Werkzeug eine Fehlermeldung aus. Statuscodes zurückgegeben Die Aktion wurde wie gewünscht abgeschlossen. Die Aktion ist fehlgeschlagen. Analysieren Sie die Eingabeabhängigkeitszeichenfolge basierend auf dem DXEDRIVER-Modultyp, um den binären PI-Abhängigkeitsausdruck in die test. depex-Ausgabedatei zu generieren. Analysieren Sie die Eingabeabhängigkeitszeichenfolge basierend auf dem DXEDRIVER-Modultyp, um den binären PI-Abhängigkeitsausdruck in die Ausgabe test. depex-Datei im Optimierungsmodus zu generieren. Analysieren Sie die vorgegebene, vorverarbeitete Abhängigkeitsdatei (test. iii) basierend auf dem DXEDRIVER-Modultyp, um den binären PI-Abhängigkeitsausdruck in die Ausgabe test. depex zu erzeugen. Test. iii-Datei ist die vorverarbeitete dxs-Datei wie: Copyright (c) 2007 - 2016, Intel Corporation. Alle Rechte vorbehalten. Dieses Programm und die begleitenden Materialien werden unter den Bedingungen der BSD-Lizenz, die dieser Verteilung beiliegt, lizenziert und zur Verfügung gestellt. Der vollständige Wortlaut der Lizenz ist zu finden unter: DAS PROGRAMM IST UNTER DER BSD-LIZENZ ÜBER EIN QUALIFIZIERTES ISQUOT-BASIS OHNE GEWÄHRLEISTUNGEN ODER VERTRETUNGEN JEGLICHER ART, WEDER AUSDRÜCKLICH ODER STILLSCHWEIGEND, AUSGESTATTET.
No comments:
Post a Comment