Beschreibung | Diese Funktion initialisiert die für Mehrkern-Prozessoren optimierten Bibliotheken. Sie liest die Zahl der zur Verfügung stehenden Prozessor-Kerne als Argument und generiert die passende Anzahl von Arbeits-Threads, so dass folgende Aufrufe von OptiVec-Funktionen ihre Berechnungen über die vorhandenen Prozessoren verteilen können. Derzeit kann nProcCores Werte von 2 bis 128 annehmen. Sobald Intel, AMD oder andere Hersteller die Entwicklung von Systemen mit noch mehr Prozessor-Kernen ankündigen, werden auch künftige Versionen von OptiVec Vorkehrungen für so viele Prozessor-Kerne treffen, wie es dann geben mag.
V_initMT muss einmal (und genau einmal) aufgerufen werden, bevor irgendeine Vektor- oder Matrix-Funktion von OptiVec aus der Multi-Prozessor-Bibliothek ausgeführt werden kann. Andersherum schadet aber der Aufruf von V_initMT nicht, wenn Sie eine der (für single-thread optimierten) Allzweck-Bibliotheken verwenden. In diesen Bibliotheken ist V_initMT als leere Funktion enthalten, deren Aufruf nichts bewirkt. Auf diese Weise können Sie zu Test-Zwecken zwischen den verschiedenen Versionen der OptiVec-Bibliotheken hin- und herschalten, ohne sich um die Aktivierung und Deaktivierung von V_initMT kümmern zu müssen.
Auf Rechnern mit vielen Prozessor-Kernen (etwa ab 8 oder 16) ist es u.U. sinnvoll, die Zahl der von jeder einzelnen OptiVec-Funktion beanspruchbaren Threads zu begrenzen. Dies gilt vor allem, wenn eine Anwendung selbst mehrere Arbeits-Threads generiert und aus allen oder mehreren von ihnen OptiVec-Funktionen aufgerufen werden. Im Interesse einer optimalen Ausnutzung der Prozessor-Kapazitäten sollte durch Aufruf von V_limitThreadsPerFunc die Zahl der Threads festgelegt werden, die jeder Aufruf einer OptiVec-Funktion für sich beanspruchen darf. Es empfiehlt sich allerdings, relativ großzügig zu sein. Bei 16 Kernen und vier Anwendungs-Threads etwa sollte man den OptiVec-Funktionen nicht nur 16/4=4, sondern lieber 8 Threads erlauben. Das Betriebssystem wird sich dann um das optimale Scheduling aller Threads kümmern.
Falls Sie die Funktion V_setFPAccuracy verwenden, um die Fließkomma-Genauigkeit der FPU zu modifizieren, muss der Aufruf von V_initMT nach dem Aufruf von V_setFPAccuracy erfolgen. Der Grund hierfür ist, dass V_initMT die zusätzlichen Threads mit denjenigen FPU-Einstellungen erstellt, wie sie bei Aufruf dieser Funktion vorgefunden werden.
nProcCores muss nicht der tatsächlich vorhandenen Zahl der Prozessor-Kerne entsprechen. Zu Test-Zwecken können Sie jeden beliebigen zulässigen Wert eingeben. Optimale Ausführungsgeschwindigkeit wird natürlich nur bei der korrekten Zahl erreicht. Für Anwendungen, die auf Kunden-Systemen laufen, deren Konfiguration außerhalb Ihres Einflussbereiches liegt, sollte die tatsächlich vorhandene Zahl der Prozessor-Kerne durch eine Detektions-Routine ermittelt werden (siehe die Prozessor-Dokumentationen von Intel und AMD). Zur Not kann die automatische Detektion natürlich durch eine Benutzer-Eingabe ersetzt werden.
Obwohl nicht unbedingt erforderlich, empfiehlt es sich, am Programm-Ende die zusätzlichen Threads wieder zu schließen durch Aufruf von V_closeMT.
Die durch V_initMT gesetzte Anzahl der verwendeten Prozessor-Kerne wird in der öffentlichen Variable V_nProcCores abgelegt. Diese ist in C/C++ als (in C++ extern "C") unsigned definiert, in Delphi als UInt. Durch Überprüfung dieser Variablen lässt sich auch feststellen, ob V_initMT bereits aufgerufen wurde.
|