optimize_aopT_optimize_aopOptimizeAopOptimizeAopoptimize_aop (Operator)

Name

optimize_aopT_optimize_aopOptimizeAopOptimizeAopoptimize_aop — Überprüfen der Hardware bezüglich des Potentials zur automatischen Operator-Parallelisierung.

Signatur

optimize_aop( : : OperatorName, IconicType, FileName, GenParamName, GenParamValue : )

Herror T_optimize_aop(const Htuple OperatorName, const Htuple IconicType, const Htuple FileName, const Htuple GenParamName, const Htuple GenParamValue)

void OptimizeAop(const HTuple& OperatorName, const HTuple& IconicType, const HTuple& FileName, const HTuple& GenParamName, const HTuple& GenParamValue)

static void HSystem::OptimizeAop(const HTuple& OperatorName, const HTuple& IconicType, const HTuple& FileName, const HTuple& GenParamName, const HTuple& GenParamValue)

static void HSystem::OptimizeAop(const HString& OperatorName, const HString& IconicType, const HString& FileName, const HTuple& GenParamName, const HTuple& GenParamValue)

static void HSystem::OptimizeAop(const char* OperatorName, const char* IconicType, const char* FileName, const HTuple& GenParamName, const HTuple& GenParamValue)

static void HSystem::OptimizeAop(const wchar_t* OperatorName, const wchar_t* IconicType, const wchar_t* FileName, const HTuple& GenParamName, const HTuple& GenParamValue)   (Nur Windows)

static void HOperatorSet.OptimizeAop(HTuple operatorName, HTuple iconicType, HTuple fileName, HTuple genParamName, HTuple genParamValue)

static void HSystem.OptimizeAop(HTuple operatorName, HTuple iconicType, HTuple fileName, HTuple genParamName, HTuple genParamValue)

static void HSystem.OptimizeAop(string operatorName, string iconicType, string fileName, HTuple genParamName, HTuple genParamValue)

def optimize_aop(operator_name: MaybeSequence[str], iconic_type: MaybeSequence[str], file_name: Union[str, int], gen_param_name: Sequence[str], gen_param_value: Sequence[Union[str, float, int]]) -> None

Beschreibung

HALCON unterstützt die automatische Parallelisierung (AOP) für eine Reihe von Operatoren. Mit optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop lässt sich eine effiziente Ausführung der Parallelisierung unabhängig von der Rechnerarchitektur gewährleisten. Daher können alle HALCON-Programme ohne Anpassungen an die Multiprozessor-Hardware durch den Benutzer verwendet werden, so dass der Benutzer leicht von dem Potential paralleler Hardware profitiert. Standardmäßig verwendet HALCON einen Thread je Prozessor für die AOP. Allerdings kann abhängig von der Datenmenge und den Parametern eines Operators die Parallelisierung auf allen verfügbaren Threads zu überzogen und ineffizient sein. optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop testet die parallele Datenverarbeitung der Operatoren und optimiert die AOP hinsichtlich der Threadanzahl. Hierfür wird jeder Operator überprüft, wie er sich auf Tupel-, Kanal- oder Domain-Ebene parallelisieren lässt (die partielle Ebene wird nicht betrachtet). Jeder dieser Operatoren wird mehrere Male ausgeführt - sequentiell wie parallel - mit unterschiedlichen Eingabeparametern und wechselnden Bildgrößen. Dadurch können Abhängigkeiten der Laufzeit des Operators von Eingabeparametern und Parallelisierung ermittelt werden. Dies kann bis zu einigen Stunden dauern, abhängig von den Parameterwerten dieses Operators. Für eine korrekte Optimierung ist es wichtig, keine anderen rechenintensiven Anwendungen gleichzeitig auf dem Rechner laufen zu lassen, da dies die Zeitmessungen des Operators stark beeinflussen und zu verfälschten Ergebnissen führen würde.

optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop sammelt eine Menge Informationen für die aktuelle Rechnerarchitektur, die es HALCON im laufenden Betrieb ermöglicht die automatische Parallelisierung zu optimieren. Dieses Wissen über die Hardware kann in einer Binärdatei, gegeben durch FileNameFileNameFileNameFileNamefileNamefile_name, abgespeichert werden und in zukünftigen HALCON-Anwendungen wiederverwendet oder auf andere, ähnliche Rechner übertragen werden. Wenn ein leerer String ''"""""""""" als Dateiname übergeben wird, speichert optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop die gewonnenen Daten in die spezielle HALCON-System-Datei '.aop_info' unter Linux/macOS im HALCON-Installationsverzeichnis (siehe Umgebungsvariable $HALCONROOT) oder unter Windows in das Datenverzeichnis für gemeinsame Anwendungen. Diese Datei wird während der Initialisierungsphase beim Aufruf des ersten HALCON-Operators automatisch ausgelesen. Es ist zu beachten, dass die entsprechenden Zugriffsrechte für Lesen und Schreiben gesetzt sind. optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop überprüft die entsprechenden Zugriffsrechte vor dem Starten des Optimierungsprozesses und gibt im Falle des Scheiterns einen entsprechenden Fehler zurück. Die geschriebene Datei kann durch den Operator read_aop_knowledgeread_aop_knowledgeReadAopKnowledgeReadAopKnowledgeReadAopKnowledgeread_aop_knowledge wieder gelesen werden.

Es ist ausreichend, optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop einmal auf jedem Rechner auszuführen, auf dem die automatische Operator-Parallelisierung ausgeführt werden soll. Jedoch sollte der Operator erneut gestartet werden, wenn die Hardware des Rechners geändert wird, beispielsweise durch einen neue CPU, einen neuen Speicher oder ein verändertes Betriebssystem. Es ist notwendig optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop einmal für jede neue Laufzeitumgebung auszuführen, da sich das Zeitverhalten von Operatoren geändert haben könnte. Eine Veränderung der Laufzeitumgebung wird verursacht durch einen Wechsel des Betriebssystems, wie zum Beispiel Windows auf Linux, durch unterschiedliche HALCON-Architekturen, unterschiedliche HALCON-Varianten, d.h. HALCON und HALCON XL, oder wenn einen neue HALCON-Version oder -Revision aktualisiert wird. Diese Hardwareabhängigkeiten werden zusammen mit dem Computernamen gemeinsam mit den AOP-Optimierungsdaten in der Datei gespeichert. Diese Attribute ordnen einen gespeicherten AOP-Datensatz einem speziellen Rechner zu und ermöglichen somit, dass AOP-Datensätze von unterschiedlichen Rechnern in der selben Datei gespeichert werden.

optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop unterstützt einen Reihe von Parametern, um das Verhalten der Optimierung zu beeinflussen. Eine Auswahl von Operatornamen kann dem Parameter OperatorNameOperatorNameOperatorNameOperatorNameoperatorNameoperator_name übergeben werden. Dadurch lässt sich der Optimierungsprozess beispielsweise auf Operatoren mit problematischen Laufzeitverhalten beschränken. Wird ein leerer String ''"""""""""" übergeben, werden alle Operatoren getestet. Der Testumfang von ikonischen Typen kann mit Hilfe des Parameters IconicTypeIconicTypeIconicTypeIconicTypeiconicTypeiconic_type eingeschränkt werden. Der leere String ''"""""""""" bewirkt, dass alle unterstützten ikonischen Typen eines Operators getestet werden. Zusätzlich kann der Optimierungsprozess mit Hilfe des Parameterpaares GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name und GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value beeinflusst werden. GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name definiert dabei den Parameternamen, während GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value den jeweiligen Wert spezifiziert, so dass übergebene Tupel bei beiden Parametern die gleiche Länge haben müssen. Im Folgenden sind für alle Parameternamen von GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name alle unterstützten Parameterwerte von GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value beschrieben:

'none'"none""none""none""none""none"

für GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name hat keine Funktion, ignoriert aber den Parameter GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value.

'system_mode'"system_mode""system_mode""system_mode""system_mode""system_mode", 'file_mode'"file_mode""file_mode""file_mode""file_mode""file_mode"

setzen jeweils die Art und Weise, wie die Informationen im HALCON-System b.z.w. der Datei aktualisiert werden sollen.

'truncate'"truncate""truncate""truncate""truncate""truncate"

für GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value löscht alle bestehenden Informationen, bevor das neue Wissen hinzugefügt wird.

'renew'"renew""renew""renew""renew""renew"

überschreibt bestehendes Wissen und fügt neues hinzu (Standard).

'append'"append""append""append""append""append"

belässt bestehendes Operatorwissen und fügt ausschließlich Wissen hinzu, das noch nicht enthalten ist.

'nil'"nil""nil""nil""nil""nil"

führt den Optimierungsprozess durch, unterdrückt jedoch die Aktualisierung des Systems b.z.w. der Datei.

'parameters'"parameters""parameters""parameters""parameters""parameters"

testet auch laufzeitrelevante Parameter des entsprechenden Operators, falls der korrespondierende Wert in GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value auf 'true'"true""true""true""true""true" gesetzt ist. Es werden Parameter berücksichtigt, die bedeutenden Einfluss auf die Laufzeit haben, wie beispielsweise Parameter, die eine Methode oder einen Mode des Operators die Größe eines Filters setzen. 'false'"false""false""false""false""false" unterdrückt die Überprüfung der Parameter zu Gunsten eines schnelleren Optimierungsprozesses (Standard).

'model'"model""model""model""model""model"

Setzt das zugrunde liegende Modell vom Laufzeitverhalten des parallelisierten Operators auf der aktuellen Hardware. Die Modelle, die durch den Parameter GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value ausgewählt werden, unterscheiden sich in ihrer Adaptionsfähigkeit an Hardwareeigenheiten und dem Rechenaufwand sie zu bestimmen:

'threshold'"threshold""threshold""threshold""threshold""threshold"

ermittelt für einen Operator, ob es sich rentiert, ihn auf der maximalen Threadanzahl zu parallelisieren. Dieses Modell ist standardmäßig auf Dual-Prozessor-Systemen eingestellt.

'linear'"linear""linear""linear""linear""linear"

spezifiziert ein lineares Skalierungsmodell, um die effizienteste Threadanzahl für einen Operator mit einer gegebene Datenmenge und Parametersatz. Dies ist der Standard auf Multi-Prozessor-Systemen.

'mlp'"mlp""mlp""mlp""mlp""mlp"

ist das komplexeste, aber auch das anpassungsfähigste Model. Der Optimierungsprozess kann allerdings abhängig von der verwendeten Hardware einige Stunden dauern.

'timeout'"timeout""timeout""timeout""timeout""timeout"

setzt die maximale Ausführungszeit für einen Testoperator. Falls die Laufzeitmessung eines Operators den Timeout überschreitet, wird der Test des Operators abgebrochen. In diesem Fall werden keine Informationen über diesen Operator gespeichert. Der Timeout wird durch GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value in Sekunden definiert. Der Wert 'infinite'"infinite""infinite""infinite""infinite""infinite" verhindert den Abbruch des Optimierungsprozesses eines Operators (Standard).

'split_level'"split_level""split_level""split_level""split_level""split_level"

beschränkt den Optimierungsprozess auf eine bestimmte Parallelisierungsmethode. Der entsprechende Wert in GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value kann einen der folgenden Werte annehmen:

'split_domain'"split_domain""split_domain""split_domain""split_domain""split_domain"

führt die Optimierung auf allen bildverarbeitenden Operatoren durch, die eine Datenparallelisierung auf Domainebene unterstützen.

'split_channel'"split_channel""split_channel""split_channel""split_channel""split_channel"

führt die Optimierung auf allen bildverarbeitenden Operatoren durch, die eine Datenparallelisierung auf Kanalebene unterstützen.

'split_tuple'"split_tuple""split_tuple""split_tuple""split_tuple""split_tuple"

führt die Optimierung auf allen bildverarbeitenden Operatoren durch, die eine Datenparallelisierung auf Tupelebene unterstützen.

Achtung

Während der Tests muss optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop jeden zu optimierenden Operator mehrere Male aufrufen. Abhängig von den Parameterwerten kann daher die Ausführzeit von optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop sehr lang sein. Es ist daher für eine korrekte Optimierung essentiell, keine weiteren rechenintensiven Anwendungen gleichzeitig auf dem Rechner laufen zu lassen, da diese die Zeitmessungen für die Optimierung deutlich beeinflussen und zu falschen Ergebnissen führen würden. optimize_aopoptimize_aopOptimizeAopOptimizeAopOptimizeAopoptimize_aop muss durch entsprechend autorisierte Benutzer aufgerufen werden, damit die gesammelten Informationen dauerhaft gespeichert werden können (Details hierzu finden sich in der obigen Operatorbeschreibung).

Ausführungsinformationen

Parameter

OperatorNameOperatorNameOperatorNameOperatorNameoperatorNameoperator_name (input_control)  string(-array) HTupleMaybeSequence[str]HTupleHtuple (string) (string) (HString) (char*)

Zu testende Operatoren.

Defaultwert: '' "" "" "" "" ""

IconicTypeIconicTypeIconicTypeIconicTypeiconicTypeiconic_type (input_control)  string(-array) HTupleMaybeSequence[str]HTupleHtuple (string) (string) (HString) (char*)

Zu testende Objekttypen.

Defaultwert: '' "" "" "" "" ""

Wertevorschläge: ''"""""""""", 'byte'"byte""byte""byte""byte""byte", 'int1'"int1""int1""int1""int1""int1", 'int2'"int2""int2""int2""int2""int2", 'uint2'"uint2""uint2""uint2""uint2""uint2", 'int4'"int4""int4""int4""int4""int4", 'int8'"int8""int8""int8""int8""int8", 'direction'"direction""direction""direction""direction""direction", 'cyclic'"cyclic""cyclic""cyclic""cyclic""cyclic", 'vector_field'"vector_field""vector_field""vector_field""vector_field""vector_field", 'complex'"complex""complex""complex""complex""complex", 'region'"region""region""region""region""region", 'xld'"xld""xld""xld""xld""xld", 'xld_cont'"xld_cont""xld_cont""xld_cont""xld_cont""xld_cont", 'xld_poly'"xld_poly""xld_poly""xld_poly""xld_poly""xld_poly"

FileNameFileNameFileNameFileNamefileNamefile_name (input_control)  filename.write HTupleUnion[str, int]HTupleHtuple (string / integer) (string / int / long) (HString / Hlong) (char* / Hlong)

Dateiname.

Defaultwert: '' "" "" "" "" ""

GenParamNameGenParamNameGenParamNameGenParamNamegenParamNamegen_param_name (input_control)  string-array HTupleSequence[str]HTupleHtuple (string) (string) (HString) (char*)

Parametername.

Defaultwert: 'none' "none" "none" "none" "none" "none"

Wertevorschläge: 'parameters'"parameters""parameters""parameters""parameters""parameters", 'model'"model""model""model""model""model", 'timeout'"timeout""timeout""timeout""timeout""timeout", 'file_mode'"file_mode""file_mode""file_mode""file_mode""file_mode", 'system_mode'"system_mode""system_mode""system_mode""system_mode""system_mode", 'split_level'"split_level""split_level""split_level""split_level""split_level"

GenParamValueGenParamValueGenParamValueGenParamValuegenParamValuegen_param_value (input_control)  string-array HTupleSequence[Union[str, float, int]]HTupleHtuple (string / real / integer) (string / double / int / long) (HString / double / Hlong) (char* / double / Hlong)

Parameterwert.

Parameteranzahl: GenParamName == GenParamValue

Defaultwert: 'none' "none" "none" "none" "none" "none"

Wertevorschläge: 'true'"true""true""true""true""true", 'renew'"renew""renew""renew""renew""renew", 'truncate'"truncate""truncate""truncate""truncate""truncate", 'threshold'"threshold""threshold""threshold""threshold""threshold", 'linear'"linear""linear""linear""linear""linear", 'mlp'"mlp""mlp""mlp""mlp""mlp", -1.0

Ergebnis

Sind die Parameterwerte korrekt, dann liefert read_aop_knowledgeread_aop_knowledgeReadAopKnowledgeReadAopKnowledgeReadAopKnowledgeread_aop_knowledge den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Modul

Foundation