Dieses heterogene Multicore-System überwacht Video-Traffic, der an das Signalverarbeitungs-Subsystem geht. (Bildquelle: TI)

Dieses heterogene Multicore-System überwacht Video-Traffic, der an das Signalverarbeitungs-Subsystem geht. (Bildquelle: TI)

Endgeräte sollen immer leistungsfähiger werden und weniger Energie verbrauchen, aber der Performance eines Prozessorkerns sind Grenzen gesetzt: Die Taktrate lässt sich nicht beliebig steigern. Daher sehen sich viele Systementwickler gezwungen, statt der bisherigen Single-Core- nun auf Multicore-Prozessoren zu setzen. Diese bieten mehr Verarbeitungsleistung, ein gesundes Verhältnis zwischen Performance und Leistungsaufnahme und einen günstigen Preis. Für die Entwickler bringt diese Architekturänderung aber neue Herausforderungen.

Um Software von einem einzigen Core auf ein Multicore-System zu portieren, muss der Programmierer wissen, wie sich mehrere Threads den verschiedenen Verarbeitungseinheiten eines Multicore-Bausteins zuordnen lassen. Hinzu kommt, dass die Cores ihre Peripheriefunktionen gemeinsam verwenden. Für eine hohe Performance ist es unerlässlich, die Peripheriefunktionen optimal zu nutzen: Die Kerne dürfen sich nicht gegenseitig blockieren.

Multicore-Prozessoren lassen sich in homogene und heterogene Multicore-Architekturen einteilen. Ein homogener Multicore-Prozessor verfügt über zwei oder mehr identische programmierbare Kerne, die die Peripheriefunktionen und den Speicher gemeinsam nutzen. Ein heterogener Multicore-Prozessor dagegen besteht aus mehreren Verarbeitungseinheiten, die jeweils für eine bestimmte Funktion vorgesehen sind. Der einzelne Kern hat hier möglicherweise nur selektiven Zugang zur Peripherie und zum Speicher, außerdem kann sich seine Architektur von den anderen Kernen unterscheiden.

Abstimmung im Multicore-System

Ganz gleich, ob es um ein homogenes oder heterogenes Multicore-System geht, müssen sich die Entwickler mit zwei Hauptproblemfeldern auseinandersetzen: erstens mit Synchronisations- und Timing-Fragen sowie zweitens mit der Performance-Evaluierung.

Neben mehreren Prozessorkernen befinden sich auf Multicore-Chips typischerweise mehr Peripheriefunktionen, Busse und mehrere Speicherebenen. Jeder einzelne Kern übernimmt einen Teil der gebotenen Funktionalität. Zusammen mit verbesserten Codierungs-, Konfektionierungs- und Integrationskonzepten ist dafür gesorgt, dass der Entwickler traditionelle Debugging-Techniken wie Synchronous Run, Step und Halt auch bei Multicore-Systemen wirksam einsetzen kann, so lange er sich auf je einen Kern konzentriert.

Anders verhält es sich, wenn verschiedene Threads miteinander interagieren. Timing- oder Synchronisationsprobleme geraten dann zu einer echten Herausforderung, resultierend aus den Abhängigkeiten zwischen den verschiedenen Kernen. Erschwerend kommt hinzu, dass die Cores ihre Systemperipherie, die Busstrukturen und die verschiedenen Speicherebenen gemeinsam nutzen. Wegen der gegenseitigen Abhängigkeiten zwischen den Verarbeitungseinheiten kann es passieren, dass die Übergaben von einem Thread zum anderen unkorrekt, ineffizient oder mit subtilen Ungereimtheiten behaftet sind.

Gerade diese subtilen Probleme können schwierig zu erkennen, einzukreisen und zu beheben sein. Zum Beispiel kann es bei einem Frame-orientierten Verarbeitungssystem zum Verlust eines Frames kommen, wenn die Verarbeitung nicht im vorgesehenen Zeitraum beendet wurde. Auch wenn das Programm hierdurch nicht unbedingt abstürzt, würden sich die errechneten Resultate ändern.

Als Ursache von Timing-Problemen kommen mangelnde Verarbeitungsleistung, Prallelverarbeitung oder Wartezeiten bei gemeinsam genutzten Peripheriefunktionen, Bussen oder Speichern in Betracht, so dass es schwierig wird, diesen Problemen auf die Spur zu kommen. Tools, die auf der Chip-Ebene ansetzen und Einblick in die Beziehung zwischen den Verarbeitungselementen und der Peripherie, den Bussen und den Speichern des Systems haben, sind von entscheidender Bedeutung für die Optimierung und das Debugging von Timing- oder Synchronisationsproblemen.

Auf allen Ebenen

Da sich Multicore-Systeme in mehrere Ebenen gliedern, sind bei Optimierung und Debugging auch mehrere Ebenen erforderlich. Auf jedem Level braucht der Entwickler das richtige Maß an Einblick und Kontrolle. Auf der höchsten Ebene wird eine Darstellung des Chips insgesamt benötigt, verbunden mit der Fähigkeit, Interaktionen zwischen Verarbeitungseinheiten und wichtigen Peripheriefunktionen zu visualisieren. Für die Performance-Optimierung kommt es darauf an, nicht nur die Interaktionen zu sehen, sondern auch die Performance an wichtigen Peripherieschnittstellen mit den verarbeiteten Tasks zu korrelieren. Bei der Darstellung auf der Chip-Ebene bietet die Korrelation von Ereignissen mit einem präzisen Zeitstempel den Entwicklern die Möglichkeit, die Leistungsfähigkeit sinnvoll zu ermitteln und zu optimieren. So lassen sich beispielsweise Aussagen über das Timing von Datentransfers zwischen den Kernen einholen. Ebenso kann der Entwickler strukturbedingte Performance-Hemmnisse aufdecken, um das gesamte Multicore-System zu optimieren, statt punktuell einzelne Funktionen.

Auf einer tieferen Ebene können die Einblicke erheblich detaillierter sein, um beispielsweise Speicherinhalte oder Einstellungen zu überprüfen oder zu verändern oder alle von einem bestimmten Verarbeitungselement ausgeführten Instruktionen zu sichten. Je höher aufgelöst die Darstellung eines Prozessor-Tracings ist, umso besser können die Anwender ihre Software optimieren oder debuggen, während ein Echtzeitsystem mit voller Geschwindigkeit läuft. Simulationsumgebungen dagegen haben häufig ihre Probleme mit der korrekten Modellierung der Performance, wenn viele Interrupts und systemübergreifende Interaktionen vorkommen.

Kernaufgabe

Das Optimieren von Multicore-Produkten wird künftig zu den größten Herausforderungen für die Entwickler gehören. Um das Performance-Potenzial eines Multicore-Bausteins auszuschöpfen, sind Einblicke in die Synchronisation und das Timing zwischen den Kernen und der Peripherie ebenso erforderlich wie Informationen über die Performance-Hemmnisse zwischen den Verarbeitungseinheiten, Peripheriefunktionen und Bussen sowie den verschiedenen Speicherebenen. Neue Multicore-Prozessoren werden außerdem robuste, auf der Chip-Ebene ansetzende Tools erfordern, die den Entwicklern durch Transparenz auf mehreren Ebenen helfen, ihre Performance-Ressourcen zu nutzen.

Stephen Lau

: Stephen Lau ist für die Definition der On-Chip-Debug-Technologie und der dazugehörenden Emulatorprodukte im Rahmen der Third-Party Emulation Developer Community von TI verantwortlich. In seinen Zuständigkeitsbereich fällt auch die Vermarktung der IEEE-1149.7-Technologie.

(lei)

Sie möchten gerne weiterlesen?

Unternehmen

Texas Instruments Deutschland GmbH

Haggertystraße 1
85356 Freising
Germany