Welche Standardtechniken gibt es für die Verwendung von CPU-spezifischen Funktionen in DLLs?

StackOverflow https://stackoverflow.com/questions/131128

  •  02-07-2019
  •  | 
  •  

Frage

Kurzversion: Ich frage mich, ob es möglich ist, und wie sie am besten nutzen CPU spezifische innerhalb einer DLL Anweisungen?

Etwas längere Version: Beim Herunterladen (32bit) DLLs von, sagen wir, Microsoft scheint es, dass eine Größe alle Prozessoren passt.

Bedeutet dies, dass sie ausschließlich für den kleinsten gemeinsamen Nenner aufgebaut sind (dh. Die Mindest Plattform durch das Betriebssystem unterstützt)? Oder gibt es eine Technik, die verwendet wird, eine einzige Schnittstelle in der DLL zu exportieren, sondern nutzen CPU-spezifischer Code hinter den Kulissen eines optimale Leistung zu bekommen? Und wenn ja, wie wird es gemacht?

War es hilfreich?

Lösung

Ich weiß nicht, von jedem Standard Technik, aber wenn ich so etwas zu machen hätte, würde ich einen Code in der DllMain () Funktion schreiben Sie den CPU-Typ zu erkennen und eine Sprungtabelle füllen mit Funktionszeigern auf CPU-optimierte Versionen der einzelnen Funktionen.

Es wäre auch eine kleinste gemeinsame Nenner Funktion für sein muß, wenn der CPU-Typ ist nicht bekannt.

Sie können die aktuelle CPU-Info in der Registrierung finden Sie hier:

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor

Andere Tipps

Die DLL wird erwartet, dass auf jedem Computer arbeiten WIN32 läuft auf, damit Sie den i386-Befehl in der Regel eingestellt stecken geblieben sind. Es gibt keine offizielle Methode der Funktionalität / Code für bestimmte Befehlssätze auszusetzen. Man muss es von Hand machen und transparent.

Die verwendete Technik ist im Grunde wie folgt:  - CPU-Funktionen wie MMX, SSE in Laufzeit bestimmen  - wenn sie vorhanden sind, verwenden Sie sie, wenn nicht, Notfallcode bereit

Weil Sie nicht Ihre Compiler optimize für etwas anderes als i386 lassen können, werden Sie den Code mit den spezifischen Befehlssätze in Inline-Assembler zu schreiben. Ich weiß nicht, ob es mit höherer Sprache Toolkits für diese ist. die CPU-Funktionen bestimmen, ist gerade nach vorne, konnte aber auch in Assembler durchgeführt werden müssen.

Eine einfache Möglichkeit, die SSE / SSE2 Optimierungen zu erhalten, ist nur das /arch Argument für MSVC zu verwenden. Ich würde nicht über Rückfall Sorge -. Es gibt keinen Grund, etwas unter dem zu unterstützen, wenn Sie eine sehr Nischenanwendung haben

http://msdn.microsoft.com/en-us/library /7t5yh4fd.aspx

Ich glaube, gcc / g ++ äquivalente Flaggen.

Intel ICC können Code zweimal, für verschiedene Architekturen kompilieren. Auf diese Weise können Sie Ihren Kuchen haben und ihn essen. (OK, Sie zwei Kuchen bekommen - Ihre DLL wird größer sein). Und selbst MSVC2005 kann es tun, für ganz bestimmte Fälle (z memcpy () kann SSE4 verwenden)

Es gibt viele Möglichkeiten zwischen verschiedenen Versionen zu wechseln. Eine DLL geladen wird, da der Ladevorgang Funktionen die es braucht. Funktionsnamen werden in Adressen umgewandelt. Eine Lösung ist, diese Lookup zu lassen, hängt von nicht nur Namen funktionieren, sondern auch Prozessorfunktionen. Ein anderes Verfahren nutzt die Tatsache, dass der Name-Adresse-Funktion eine Tabelle von Zeigern in einem Zwischenschritt verwendet; Sie können die gesamte Tabelle wechseln aus. Oder Sie könnten sogar einen Zweig innerhalb kritischen Funktionen haben; so foo () ruft foo__sse4 wenn das schneller ist.

DLLs Sie von Microsoft herunterladen werden für die allgemeine x86-Architektur aus dem einfachen Grunde, dass es gezielt über die ganze Vielzahl von Maschinen zu arbeiten, hat da draußen.

Bis zum Visual Studio 6.0 Zeitrahmen (ich weiß nicht, ob sie sich geändert hat) Microsoft verwendet, um seine DLLs für Größe zu optimieren, anstatt Geschwindigkeit. Dies liegt daran, die Verringerung der Gesamtgröße der DLL eine höhere Leistungssteigerung als jede andere Optimierung, die die Compiler generieren konnten gab. Dies liegt daran, Geschwindigkeit ups von Mikro-Optimierung entschieden gering wäre im Vergleich zu Geschwindigkeit ups von nicht für den Speicher die CPU warten. Echte Verbesserungen in der Geschwindigkeit kommen von der Reduzierung I / O oder der Verbesserung der Basisalgorithmus.

Nur wenig kritischen Schleifen, die im Mittelpunkt des Programms laufen wegen der großen Anzahl von Malen von Mikro-Optimierungen einfach profitieren könnte sie aufgerufen werden. Nur etwa 5-10% des Codes könnte in diese Kategorie fallen. Sie könnten sich darauf verlassen, dass eine solche kritische Schleifen würden bereits von den Microsoft-Software-Ingenieure zu einem gewissen Niveau und nicht verlassen viel hinter der Compiler zu finden in Assembler optimiert werden. (Ich weiß, dass es zu viel erwartet, aber ich hoffe, dass sie dies tun)

Wie Sie sehen können, würde es von dem erhöhten DLL-Code nur Nachteile, die zusätzliche Versionen von Code enthält, die für verschiedene Architekturen abgestimmt werden, wenn die meisten dieser Codes nur selten / verwendet wird, sind nie Teil des kritischen Code, der am meisten verbraucht die Ihre CPU-Zyklen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top