DE102022124496A1 - Techniken zum beschleunigen von smith-waterman-sequenzalignierungen - Google Patents

Techniken zum beschleunigen von smith-waterman-sequenzalignierungen Download PDF

Info

Publication number
DE102022124496A1
DE102022124496A1 DE102022124496.2A DE102022124496A DE102022124496A1 DE 102022124496 A1 DE102022124496 A1 DE 102022124496A1 DE 102022124496 A DE102022124496 A DE 102022124496A DE 102022124496 A1 DE102022124496 A1 DE 102022124496A1
Authority
DE
Germany
Prior art keywords
partial alignment
instruction
data
thread
score
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
DE102022124496.2A
Other languages
English (en)
Inventor
Maciej Piotr Tyrlik
Ajay Sudarshan TIRUMALA
Shirish Gadre
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nvidia Corp
Original Assignee
Nvidia Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nvidia Corp filed Critical Nvidia Corp
Publication of DE102022124496A1 publication Critical patent/DE102022124496A1/de
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G16INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR SPECIFIC APPLICATION FIELDS
    • G16BBIOINFORMATICS, i.e. INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR GENETIC OR PROTEIN-RELATED DATA PROCESSING IN COMPUTATIONAL MOLECULAR BIOLOGY
    • G16B30/00ICT specially adapted for sequence analysis involving nucleotides or amino acids
    • G16B30/10Sequence alignment; Homology search
    • GPHYSICS
    • G16INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR SPECIFIC APPLICATION FIELDS
    • G16BBIOINFORMATICS, i.e. INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR GENETIC OR PROTEIN-RELATED DATA PROCESSING IN COMPUTATIONAL MOLECULAR BIOLOGY
    • G16B50/00ICT programming tools or database systems specially adapted for bioinformatics
    • G16B50/30Data warehousing; Computing architectures

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • Biophysics (AREA)
  • Medical Informatics (AREA)
  • Spectroscopy & Molecular Physics (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Biotechnology (AREA)
  • Evolutionary Biology (AREA)
  • General Health & Medical Sciences (AREA)
  • Chemical & Material Sciences (AREA)
  • Analytical Chemistry (AREA)
  • Proteomics, Peptides & Aminoacids (AREA)
  • Databases & Information Systems (AREA)
  • Bioethics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)

Abstract

Es werden verschiedene Techniken zum Beschleunigen von Smith-Waterman-Sequenzalignierungen bereitgestellt. Beispielsweise werden Threads in einer Gruppe von Threads eingesetzt, um ein verschachteltes Zellenlayout zu verwenden, um relevante Daten in Registern zu speichern, während Teilalignierungsdaten für ein oder mehrere lokale Alignierungsprobleme berechnet werden. In einem anderen Beispiel werden spezialisierte Anweisungen verwendet, die die Anzahl der Zyklen reduzieren, die zum Berechnen jeder Teilalignierungsbewertung erforderlich ist.ln einem anderen Beispiel werden Threads verwendet, um Teilalignierungsdaten für eine Teilmenge von Spalten eines oder mehrerer lokaler Teilalignierungsprobleme zu berechnen, während andere Threads mit der Berechnung von Teilalignierungsdaten basierend auf teilweisen Ergebnisdaten, die von den vorhergehenden Threads empfangen wurden, beginnen.Nach dem Berechnen einer maximalen Teilalignierungsbewertung, speichert ein Thread die maximale Teilalignierungsberechnung und die entsprechende Position in dem globalen Speicher.

Description

  • HINTERGRUND
  • Gebiet der verschiedenen Ausführungsformen
  • Die verschiedenen Ausführungsformen betreffen allgemein Parallelverarbeitungssysteme und insbesondere Techniken zum Beschleunigen von Smith-Waterman-Sequenzalignierungen.
  • Beschreibung des Standes der Technik
  • Der Smith-Waterman-Algorithmus wird in einer Vielfalt von Anwendungen verwendet, wie in Wissenschaft, Technik und Datenanwendungen, um zu quantifizieren, wie gut Teilsequenzen zweier Sequenzen aligniert werden können, und um eine optimierte Alignierung von Teilsequenzen oder „lokale Alignierung“ dieser Sequenzen zu bestimmen. Beispielsweise ist der Smith-Waterman-Algorithmus ein Baustein vieler genomischer Algorithmen, wie Algorithmen zum Bestimmen von DNA-Sequenzen von Organismen und zum Vergleichen von DNA- oder Proteinsequenzen mit Genomdatenbanken.
  • Um ein lokales Alignierungsproblem für eine Zielsequenz „T“ und eine Abfragesequenz „Q“ unter Verwendung des Smith-Waterman-Algorithmus zu lösen, implementiert eine Software-Anwendung eine Matrix-Füllphase und entweder eine Backtracking-Phase oder eine umgekehrte Matrix-Füllphase. Während der Matrix-Füllphase implementiert die Software-Anwendung eine dynamische Programmiertechnik, um die Berechnung der optimierten lokalen Alignierung in Berechnungen voneinander abhängiger Teilalignierungsbewertungen aufzuteilen, die in einer zweidimensionalen (2D) Bewertungsmatrix „H“ beinhaltet sind. Die Bewertungsmatrix beinhaltet ohne Einschränkung eine obere Zeile und eine ganz linke Spalte mit Anfangswerten, eine unterschiedliche Zeile für jedes Symbol der Zielsequenz und eine unterschiedliche Spalte für jedes Symbol der Abfragesequenz. Für eine Zielsequenz der Länge M und eine Abfragesequenz Q der Länge N ist die Bewertungsmatrix daher eine (M+1 )x(N+1 )-Matrix. Aufgrund der Offsets, die von der Zeile und der Spalte der Anfangswerte für 0 < j <= M und 0 < k <= N eingeführt werden, quantifiziert die Teilalignierungsbewertung, die mit H(j, k) bezeichnet ist, die maximale Ähnlichkeit zwischen jeder Teilsequenz von T, die mit dem Symbol T(j-1) endet, und jeder Teilsequenz von Q, die mit dem Symbol Q(k-1) endet. Als Teil der Matrix-Füllphase bestimmt die Software-Anwendung eine maximale Teilalignierungsbewertung und die Position der maximalen Teilalignierungsbewertung innerhalb der Bewertungsmatrix. Während entweder der Backtracking-Phase oder der umgekehrten Matrix-Füllphase bestimmt die Software-Anwendung die Startposition innerhalb der Bewertungsmatrix, die der maximalen Teilalignierungsbewertung entspricht. Die Startposition und die Position der maximalen Teilalignierungsbewertung definieren die Zielteilsequenz und die Abfrageteilsequenz, die der optimierten lokalen Alignierung der Ziel- und Abfragesequenz entsprechen.
  • Da das Ausführen der Matrix-Füllphase für T mit einer Länge M und Q mit einer Länge N in der Größenordnung von (MxN) Zeit oder „quadratischer Zeit“ dauert, während des Anwendens der Rückverfolgungsphase in der Größenordnung von (M+N) oder „lineare Zeit“ dauert, kann die Matrix-Füllphase ein Leistungsengpass werden, wenn viele lokale Alignierungsprobleme gelöst werden. In diesem Zusammenhang kann H(j, k) über die folgenden Gleichungen (1a)-(1c) für 0 < j < = M und 0 < k < = N berechnet werden: E ( j ,k ) = max { E ( j 1, k ) GapDeleteExtend H ( j 1, k ) GapDeleteExtend
    Figure DE102022124496A1_0001
    E ( j ,k ) = max { E ( j ,k 1 ) GapInsertExtend H ( j ,k 1 ) GapInsertOpen
    Figure DE102022124496A1_0002
    H ( j ,k ) = max { 0 E ( j ,k ) F ( j ,k ) H ( j 1, k 1 ) Substitution ( T ( j 1 ) , Q ( k 1 ) )
    Figure DE102022124496A1_0003
  • In den Gleichungen (1a)-(1c) sind E und F Matrizen, die Zwischenergebnisse zur Wiederverwendung bei der Berechnung abhängiger Teilalignierungsbewertungen speichern. GapDeleteExtend, GapDeleteExtend, GaplnsertOpen und GaplnsertExtend sind „Lücken“-Konstanten; und Substitution(T(j-1), Q(k-1)) ist ein Substitutionswert, der in einer Substitutionsmatrix beinhaltet ist, die einem Symbolübereinstimmungswert (z. B. 4) oder einem Symbolfehlanpassungswert (z. B. -1) für die Symbole T(j-1) und Q(k-1) entspricht.
  • Aufgrund der enormen Anzahl von Berechnungen, die während der Matrix-Füllphase für DNA- und Proteinsequenzen mit typischer Größe ausgeführt werden müssen, beschleunigen einige Software-Anwendungen die Matrix-Füllphase unter Verwendung von Anweisungssätzen oder „Programmen“, die auf Parallelprozessoren ausgeführt werden. Diese Prozessortypen können sehr hohe Rechendurchsätze erzielen, indem sie eine große Anzahl von Threads parallel über viele unterschiedliche Verarbeitungskerne ausführen. Ein herkömmlicher Ansatz zum Ausführen einer Smith-Waterman-Matrix-Füllphase auf einem Parallelprozessor beinhaltet das Verteilen der Teilalignierungsbewertungsberechnungen, die mit Positionen assoziiert sind, die unabhängig voneinander über Gruppen von Threads berechnet werden können. Um auf die Gleichungen (1a)-(1c) zurückzukommen, hängt H(j, k) von H(j-1, k-1) ab, das der benachbarten oberen linken Diagonalposition entspricht, wobei E(j-1, k) und H(j-1, k) der benachbarten oberen Position entsprechen, und F(j, k-1) und H(j, k-1) der benachbarten linken Position entsprechen. Folglich können die Teilalignierungsbewertungsberechnungen entlang jeder Antidiagonale der Bewertungsmatrix unabhängig voneinander berechnet werden. Bei einer „Antidiagonal“-Implementierung werden die Antidiagonalen der Bewertungsmatrix beginnend mit der oberen linken Ecke der Bewertungsmatrix einzeln verarbeitet. Um jede Antidiagonale zu verarbeiten, wird jede Position entlang der Antidiagonale einem unterschiedlichen Thread zugewiesen, und die Threads berechnen parallel die E-, F-, H- und Substitutionswerte, die den zugewiesenen Positionen entsprechen. Die Threads schreiben dann die E-, F- und H-Werte an die entsprechenden Positionen in einer E-Matrix, einer F-Matrix bzw. der Bewertungsmatrix, die in dem gemeinsam genutzten Speicher gespeichert sind.
  • Ein Nachteil des obigen Ansatzes besteht darin, dass Rechenineffizienzen, die mit jeder Teilalignierungsbewertung assoziiert sind, Leistungsverbesserungen, die der Parallelisierung der gesamten Matrix-Füllphase zuzuschreiben sind, begrenzen können. Das Berechnen jeder Teilalignierungsbewertung beinhaltet das sequenzielle Ausführen von zehn Anweisungen, die mindestens fünf Addition-/Subtraktionsanweisungen und fünf Anweisungen mit maximal zwei Operanden beinhalten. Das Abrufen von F-Werten, E-Werten, Teilalignierungsbewertungen und Substitutionswerten für die Anweisungsaufrufe zum Berechnen jeder Teilalignierungsbewertung beinhaltet normalerweise das Ausführen zusätzlicher Datenbewegungsanweisungen, die den Rechendurchsatz reduzieren. Ferner erfordern das Bestimmen und Speichern der maximalen Teilalignierungsbewertung und der assoziierten Position das Ausführen mehrerer Anweisungen für jede Teilalignierungsbewertung. Aufgrund der von den zusätzlichen Anweisungen eingeführten Ineffizienzen, kann die Zeit, die zum Ausführen der Matrix-Füllphase erforderlich ist, prohibitiv lang sein. Beispielsweise kann das Ausführen der Matrix-Füllphase für das menschliche Chromosom 21, das 47 Megabasenpaare (Mbp) lang ist, und für das Schimpansen-Chromosom 22, das 33 Mbp lang ist, unter Verwendung des obigen Ansatzes fast einen Tag dauern.
  • Wie das Vorhergehende veranschaulicht, werden in der Technik effektivere Techniken zum Ausführen der Matrix-Füllphase des Smith-Waterman-Algorithmus auf Parallelprozessoren benötigt.
  • ZUSAMMENFASSUNG
  • Eine Ausführungsform der vorliegenden Erfindung legt ein computerimplementiertes Verfahren zum Durchführen von Teilalignierungsberechnungen beim Ausführen einer Matrix-Füllphase eines Smith-Waterman-Algorithmus dar. Das Verfahren umfasst das Ausführen einer ersten Anweisung zum Erzeugen erster Teilalignierungsdaten, die in einer ersten Zelle in einem ersten Array von Zellen enthalten sind, basierend auf zweiten Teilalignierungsdaten, die in einer zweiten Zelle in dem ersten Array von Zellen und einem zweiten Array von Zellen enthalten sind; und Ausführen einer zweiten Anweisung zum Erzeugen dritter Teilalignierungsdaten, die in einer dritten Zelle in dem ersten Array von Zellen enthalten sind, basierend auf den ersten Teilalignierungsdaten, die in der ersten Zelle und dem zweiten Array von Zellen enthalten sind.
  • Mindestens ein technischer Vorteil der offenbarten Techniken im Vergleich zum Stand der Technik besteht darin, dass mit den offenbarten Techniken die Anzahl der Anweisungen, die zum Berechnen jeder Teilalignierungsbewertung ausgeführt wird, reduziert werden kann, wenn die Matrix-Füllphase des Smith-Waterman-Algorithmus unter Verwendung von Parallelprozessoren ausgeführt wird. In dieser Hinsicht kann mit den offenbarten Techniken eine einzige Smith-Waterman-Anweisung oder eine Smith-Waterman-Sequenz mit sechs Anweisungen verwendet werden, um gleichzeitig eine, zwei oder vier Teilalignierungsbewertungen zu berechnen, die jeweils mit einem, zwei oder vier unterschiedlichen lokalen Alignierungsproblemen assoziiert sind. Da Teilalignierungsbewertungen und Zwischenergebnisse, die mit jeder Position in der Bewertungsmatrix assoziiert sind, mit den offenbarten Techniken in einer einzigen Zelle verschachtelt gespeichert werden können, können mit der Datenbewegung assoziierte Ineffizienzen im Vergleich zu herkömmlichen Techniken, die dieselben Daten aus separaten Matrizen abrufen, reduziert werden. Darüber hinaus kann mit den offenbarten Techniken eine Anweisung, die den ausgewählten Operanden angibt, wenn das Minimum oder Maximum von zwei Operanden bestimmt wird, verwendet werden, um die Anzahl von Anweisungen zu reduzieren, die ausgeführt werden, wenndie maximale Teilalignierungsbewertung und damit assoziierte Position bestimmt und gespeichert wird. Diese technischen Vorteile stellen einen oder mehrere technologische Fortschritte gegenüber den Ansätzen des Standes der Technik dar.
  • Figurenliste
  • Damit die oben genannten Merkmale der verschiedenen Ausführungsformen im Einzelnen verstanden werden können, kann eine genauere Beschreibung der erfinderischen Konzepte, die oben kurz zusammengefasst wurden, durch Bezugnahme auf verschiedene Ausführungsformen, von denen einige in den beigefügten Zeichnungen dargestellt sind, erfolgen. Es sei jedoch angemerkt, dass die beigefügten Zeichnungen nur typische Ausführungsformen der erfinderischen Konzepte veranschaulichen und somit nicht als in irgendeiner Weise einschränkend zu betrachten sind, und dass andere gleichermaßen wirksame Ausführungsformen vorhanden sind.
    • 1 ist ein Blockdiagramm, das ein System veranschaulicht, das dazu konfiguriert ist, einen oder mehrere Aspekte der verschiedenen Ausführungsformen zu implementieren;
    • 2 ist ein Blockdiagramm einer Parallelverarbeitungseinheit, die in dem Parallelverarbeitungsteilsystem der 1 beinhaltet ist, gemäß verschiedenen Ausführungsformen;
    • 3A ist ein Blockdiagramm eines allgemeinen Verarbeitungsclusters, das in dem Parallelverarbeitungseinheit der 2 beinhaltet ist, gemäß verschiedenen Ausführungsformen;
    • 3B ist ein Blockdiagramm des Streaming-Multiprozessors der 3A gemäß verschiedenen Ausführungsformen.
    • 4 ist eine beispielhafte Veranschaulichung von Smith-Waterman-Daten, die mit dem Smith-Waterman-Kernel der 1 assoziiert sind, gemäß verschiedenen Ausführungsformen;
    • 5 ist eine beispielhafte Veranschaulichung von Smith-Waterman-Daten, die mit dem Smith-Waterman-Kernel der 1 assoziiert sind, gemäß anderen verschiedenen Ausführungsformen;
    • 6 veranschaulicht eine Smith-Waterman-Anweisung, die von dem Smith-Waterman-Kernel der 1 ausgeführt wird, gemäß verschiedenen Ausführungsformen;
    • 7 veranschaulicht eine Smith-Waterman-Sequenz, die von dem Smith-Waterman-Kernel der 1 ausgeführt wird, gemäß verschiedenen anderen Ausführungsformen;
    • 8 veranschaulicht einen minimalen/maximalen Wert und eine entsprechende Quellindikatoranweisung, die von dem Smith-Waterman-Kernel der 1 ausgeführt wird, gemäß verschiedenen Ausführungsformen;
    • 9 ist eine beispielhafte Veranschaulichung von Smith-Waterman-Zwei-Probleme-Pseudocode, der von dem Smith-Waterman-Kernel der 1 ausgeführt wird, gemäß verschiedenen Ausführungsformen;
    • 10 ist eine beispielhafte Veranschaulichung eines Smith-Waterman-Einzelproblem-Pseudocodes, der von dem Smith-Waterman-Kernel der 1 ausgeführt wird, gemäß anderen verschiedenen Ausführungsformen;
    • 11 veranschaulicht, wie die Anweisungen der 6 und 9 in Ausführungseinheiten implementiert werden, gemäß verschiedenen Ausführungsformen;
    • 12A ist eine beispielhafte Veranschaulichung einer 2-Wege-Single-Instruction-Multiple-Data-Matrix-Füllphase (SIMD-Matrix-Füllphase), die von dem kooperativen Thread-Array (CTA) der 3A ausgeführt wird, gemäß verschiedenen Ausführungsformen;
    • 12B ist eine beispielhafte Veranschaulichung einer 2-Wege-SIMD-Matrix-Füllphase, die von dem CTA der 3A ausgeführt wird, gemäß anderen verschiedenen Ausführungsformen;
    • 13 ist ein Ablaufdiagramm von Verfahrensschritten zum Speichern von Teilalignierungsdaten beim Ausführen einer Matrix-Füllphase eines Smith-Waterman-Algorithmus, gemäß verschiedenen Ausführungsformen;
    • 14 ist ein Ablaufdiagramm von Verfahrensschritten zum Durchführen von Teilalignierungsberechnungen über eine einzige Anweisung beim Ausführen einer Matrix-Füllphase eines Smith-Waterman-Algorithmus, gemäß verschiedenen Ausführungsformen;
    • 15 ist ein Ablaufdiagramm von Verfahrensschritten zum Durchführen von Teilalignierungsberechnungen über eine Anweisungssequenz beim Ausführen einer Matrix-Füllphase eines Smith-Waterman-Algorithmus, gemäß verschiedenen Ausführungsformen; und
    • 16 ist ein Ablaufdiagramm von Verfahrensschritten zum Ausführen einer Matrix-Füllphase eines Smith-Waterman-Algorithmus über eine Gruppe von Threads, gemäß verschiedenen Ausführungsformen.
  • AUSFÜHRLICHE BESCHREIBUNG
  • In der folgenden Beschreibung werden zahlreiche spezifische Details dargelegt, um ein gründlicheres Verständnis gewisser spezifischer Ausführungsformen zu ermöglichen. Für den Fachmann ist jedoch ersichtlich, dass die erfinderischen Konzepte ohne eines oder mehrere dieser spezifischen Details umgesetzt werden können. Nur zu Erklärungszwecken werden hierin mehrere Instanzen gleicher Objekte mit Referenznummern bezeichnet, die das Objekt identifizieren, und mit Klammerzahlen, die die Instanz nach Bedarf identifizieren.
  • Wie oben hierin beschrieben, verarbeitet bei einem herkömmlichen Ansatz zum Ausführen der Matrix-Füllphase des Smith-Waterman-Algorithmus auf einem Parallelprozessor eine Gruppe von Threads die Antidiagonalen einer Bewertungsmatrix einzeln, beginnend von der oberen linken Ecke einer Bewertungsmatrix. Um jede Antidiagonale zu verarbeiten, berechnet die Gruppe von Threads gleichzeitig Teilalignierungsdaten (z. B. einen E-Wert, einen F-Wert, einen Substitutionswert und eine Teilalignierungsbewertung) für jede Position entlang der Antidiagonale. Die Gruppe von Threads speichert die E-Werte, die F-Werte und die Teilalignierungsbewertungen in einer E-Matrix, einer F-Matrix bzw. der Bewertungsmatrix, die sich in einem gemeinsam genutzten Speicher befinden.
  • Ein Nachteil des obigen Ansatzes besteht darin, dass Rechenineffizienzen, die mit jeder Teilalignierungsbewertung assoziiert sind, Leistungsverbesserungen, die der Parallelisierung der gesamten Matrix-Füllphase zuzuschreiben sind, begrenzen können. Das Berechnen der Teilalignierungsbewertung beinhaltet das Ausführen von Datenbewegungsanweisungen, um den erforderlichen F-Wert, E-Wert, Teilalignierungsbewertungen und Substitutionswert aus dem gemeinsam genutzten Speicher abzurufen, und dann das Ausführen einer Sequenz von zehn Anweisungen. Ferner erfordern das Bestimmen und Speichern der maximalen Teilalignierungsbewertung und der assoziierten Position, die die Ausgänge der Matrix-Füllphase sind, das Ausführen mehrerer Anweisungen für jede Teilalignierungsbewertung. Aufgrund der von den zusätzlichen Anweisungen eingeführten Ineffizienzen, kann die Zeit, die zum Ausführen der Matrix-Füllphase erforderlich ist, prohibitiv lang sein.
  • Um den obigen Probleme abzuhelfen, konfiguriert in einigen Ausführungsformen eine Software-Anwendung 190, die auf einem Primärprozessor läuft, eine Gruppe von Threads, um gleichzeitig einen Smith-Waterman-Kernel (SW-Kernel) 192 auf einem Parallelprozessor auszuführen, um eine Matrix-Füllphase für ein oder mehrere lokale Alignierungsprobleme durchzuführen. Die Software-Anwendung 190 wird nachstehend in Verbindung mit 1 ausführlicher beschrieben.
  • Der SW-Kernel 192 ist ein Satz von Anweisungen (z. B. ein Programm, eine Funktion usw.), der auf dem Parallelprozessor ausgeführt werden kann. Wie nachstehend im Detail in Verbindung mit den 4, 5 und 13 beschrieben, implementiert der SW-Kernel 192 in einigen Ausführungsformen eine oder mehrere Datenverschachtelungstechniken, um die Bewegung von Teilalignierungsdaten zu reduzieren. In denselben oder anderen Ausführungsformen implementiert der Parallelprozessor eine oder mehrere Anweisungen, die darauf spezialisiert sind, die Recheneffizienz beim Durchführen der Matrix-Füllphase zu erhöhen, und der SW-Kernel 192 verwendet eine beliebige Anzahl der spezialisierten Anweisungen. In einigen Ausführungsformen verwendet der SW-Kernel 192 eine einzige spezialisierte SW-Anweisung oder eine Sequenz von sechs spezialisierten Anweisungen, um Teilalignierungsbewertungen zu berechnen. In denselben oder anderen Ausführungsformen verwendet der SW-Kernel 192 eine VIMNMX-Anweisung, die den ausgewählten Operanden beim Auswählen des Minimums oder Maximums von zwei Operanden auswählt, angibt, um die Anzahl von Anweisungen, die zum Bestimmen und Speichern der maximalen Teilalignierungsbewertung erforderlich sind und die zugehörige Position zu erhöhen. Die SW-Anweisung ist nachstehend im Detail in Verbindung mit den 6, 9 und 14 beschrieben. Die Sequenz aus sechs Anweisungen und die assoziierten Anweisungen sind nachstehend im Detail in Verbindung mit den 7, 10, 11 und 15 beschrieben. Die VIMNMX-Anweisung ist nachstehend im Detail in Verbindung mit den 8 und 11 beschrieben.
  • Um den Durchsatz zu erhöhen, führt in einigen Ausführungsformen die Gruppe von Threads, die den SW-Kernel 192 durchführt, gleichzeitig die Matrix-Füllphase für mehrere Alignierungsprobleme über eine gestaffelte SIMD-Thread-Technik durch. Bei der gestaffelten SIMD-Thread-Technik führt jeder Thread in dem Warp zeilenweise Teilalignierungsberechnungen für eine unterschiedliche Teilmenge der Spalten durch, und jeder Thread, mit Ausnahme von Thread 0, ist eine Zeile hinter dem unmittelbar niedrigeren Thread in Bezug auf die Teilalignierungsberechnungen. Beispielsweise führt Thread 0 in einigen Ausführungsformen während einer Anfangsiteration Teilalignierungsberechnungen durch, die H(1, 1)-H(1, C) entsprechen, für P lokale Alignierungsprobleme, wobei C und P beliebige positive Ganzzahlen sein können. Während der nächsten Iteration führt Thread 0 Teilalignierungsberechnungen, die H(2, 1 )-H(2, C) entsprechen, für die P lokalen Alignierungsprobleme durch, und Thread 1 führt Teilalignierungsberechnungen, die H(1, C+1)-H(1, 2C) entsprechen, für die P lokalen Alignierungsprobleme durch.
  • Nur zu Erläuterungszwecken sind die Funktionalität der Software-Anwendung 190 und des SW-Kernels 192 nachstehend in Verbindung mit den 1-16 in dem Kontext des Bestimmens und ohne Einschränkung eine maximale Teilalignierungsbewertung und der Position der maximalen Teilalignierungsbewertung für jedes einer Anzahl lokaler Sequenzalignierungsprobleme beschrieben. In einigen Ausführungsformen bewahrt der SW-Kernel 192 die Bewertungsmatrix nicht. Beispielsweise werden in einigen Ausführungsformen höchstens zwei Zeilen der Bewertungsmatrix zu einem gegebenen Zeitpunkt in dem Speicher gespeichert.
  • In einigen Ausführungsformen veranlasst die Software-Anwendung 190 für jede maximale Teilalignierungsbewertung, die einen Übereinstimmungsschwellenwert überschreitet, dass der SW-Kernel 192 eine Traceback-Matrix generiert, während die Matrix-Füllphase für das entsprechende lokale Alignierungsproblem erneut ausgeführt wird. Die Traceback-Matrix spezifiziert die Position, von der jede Teilalignierungsbewertung abgeleitet wird, und kann daher dazu verwendet werden, die optimierte lokale Alignierung zu bestimmen.
  • In einigen anderen Ausführungsformen kehrt die Software-Anwendung 190 für jede maximale Teilalignierungsbewertung, die einen Übereinstimmungsschwellenwert überschreitet, die entsprechende Zielsequenz und die entsprechende Abfragesequenz um. Die Software-Anwendung veranlasst dann, dass der SW-Kernel 192 die Matrix-Füllphase basierend auf den umgekehrten Sequenzen erneut ausführt. Die Position(en) der maximalen Teilalignierungsbewertung entsprechen der Startposition innerhalb der Bewertungsmatrix, die der maximalen Teilalignierungsbewertung entsprechen, und können dazu verwendet werden, die optimierte lokale Alignierung zu bestimmen.
  • Es ist zu beachten, dass die hierin beschriebenen Techniken eher veranschaulichend als einschränkend sind und geändert werden können, ohne vom breiteren Geist und Umfang der Erfindung abzuweichen. Zahlreiche Modifikationen und Variationen der Funktionalität, die von der Software-Anwendung 190, dem SW-Kernel 192, dem Warp, dem Parallelverarbeitungs-Teilsystem 112, den PPUs, den SMs und der CPU bereitgestellt werden, ergeben sich für den Durchschnittsfachmann, ohne von dem Umfang und Geist der beschriebenen Ausführungsformen abzuweichen.
  • Beispielhafte Systemübersicht
  • Nur zu Erläuterungszwecken werden die Funktionalität der Software-Anwendung 190 und des SW-Kernels 192 nachstehend in Verbindung mit den 1-16 in dem Kontext einiger Ausführungsformen, die innerhalb eines Systems 100 implementiert werden, beschrieben. Wie nachstehend ausführlicher beschrieben, läuft in den in den 1-16 dargestellten Ausführungsformen die Software-Anwendung 190 auf einer CPU 102 und veranlasst eine Gruppe von Threads, gleichzeitig den SW-Kernel 192 auf einem oder mehreren Streaming-Multiprozessoren (SMs) auszuführen.
  • 1 ist ein Blockdiagramm, das ein System 100 veranschaulicht, das dazu konfiguriert ist, einen oder mehrere Aspekte der verschiedenen Ausführungsformen zu implementieren. Wie gezeigt, beinhaltet das System 100 ohne Einschränkung die CPU 102 und einen Systemspeicher 104, der über eine Speicherbrücke 105 und einen Kommunikationspfad 113 an ein Parallelverarbeitungsteilsystem 112 gekoppelt ist. In einigen Ausführungsformen ist mindestens ein Teil des Systemspeichers 104 Host-Speicher, der mit der CPU 102 assoziiert ist. Die Speicherbrücke 105 ist ferner über einen Kommunikationspfad 106 an eine Eingangs-/Ausgangs-Brücke (E/A-Brücke) 107 gekoppelt, und die E/A-Brücke 107 ist wiederum an einen Schalter 116 gekoppelt.
  • Im Betrieb ist die E/A-Brücke 107 dazu konfiguriert, Benutzereingabeinformationen von Eingabevorrichtung 108, wie etwa einer Tastatur oder einer Maus zu empfangen und die Eingabeinformationen zur Verarbeitung über den Kommunikationspfad 106 und die Speicherbrücke 105 an die CPU 102 weiterzuleiten. Der Schalter 116 ist dazu konfiguriert, Verbindungen zwischen der E/A-Brücke 107 und anderen Komponenten des Systems 100 bereitzustellen, wie etwa einem Netzwerkadapter 118 und Zusatzkarten 120 und 121.
  • Wie ebenfalls gezeigt, ist die E/A-Brücke 107 an eine Systemplatte 114 gekoppelt, die dazu konfiguriert sein kann, Inhalte und Anwendungen und Daten zur Verwendung durch die CPU 102 und das Parallelverarbeitungsteilsystem 112 zu speichern. Im Allgemeinen stellt die Systemplatte 114 nichtflüchtigen Speicher für Anwendungen und Daten bereit und kann feste oder austauschbare Festplattenlaufwerke, Flash-Speichervorrichtungen, Compact Disc-Nur-Lese-Speicher, Digital Versatile Disc-Nur-Lese-Speicher, Blu-ray, High Definition Digital Versatile Disc oder andere magnetische, optische oder Festkörperspeichervorrichtungen beinhalten. Schließlich können, obwohl dies nicht explizit gezeigt ist, auch andere Komponenten, wie beispielsweise ein universeller serieller Bus oder andere Portverbindungen, Compact-Disc-Laufwerke, Digital Versatile-Disc-Laufwerke, Filmaufzeichnungsvorrichtungen und dergleichen, mit der E/A-Brücke 107 verbunden werden.
  • In verschiedenen Ausführungsformen kann die Speicherbrücke 105 ein Northbridge-Chip sein und die E/A-Brücke 107 kann ein Southbrige-Chip sein. Zusätzlich können die Kommunikationspfade 106 und 113 sowie andere Kommunikationspfade innerhalb des Systems 100 unter Verwendung beliebiger technisch geeigneter Protokolle implementiert werden, einschließlich ohne Einschränkung Interconnect-Express-Controller für Peripheriekomponenten, Accelerated Graphics Port, HyperTransport oder jeder andere Bus oder jedes andere Punkt-zu-Punkt-Kommunikationsprotokoll, die gemäß dem Stand der Technik bekannt sind.
  • In einigen Ausführungsformen beinhaltet das Parallelverarbeitungsteilsystem 112 ohne Einschränkung einen oder mehrere Parallelprozessoren. In einigen Ausführungsformen ist jeder Parallelprozessor eine PPU, die ohne Einschränkung einen oder mehrere SMs beinhaltet. Jeder SM beinhaltet ohne Einschränkung mehrere Ausführungseinheiten, die hierin auch als „Prozessorkerne“ bezeichnet werden. In einigen Ausführungsformen können die PPUs identisch oder unterschiedlich sein, und jede PPU kann mit einem dedizierten Parallelverarbeitungs-Speicher (PP-Speicher) oder keinem dedizierten PP-Speicher assoziiert sein. In einigen Ausführungsformen wird der mit einer gegebenen PPU assoziierte PP-Speicher auch als der „Vorrichtungsspeicher“ bezeichnet, der mit der PPU assoziiert ist. In denselben oder anderen Ausführungsformen befindet sich jeder Kernel, der auf einer gegebenen PPU gestartet wird, in dem Vorrichtungsspeicher der PPU.
  • In mindestens einigen Ausführungsformen enthält das Parallelverarbeitungsteilsystem 112 Schaltungsanordnungen, die für Allzweckverarbeitung optimiert sind. Wie nachstehend in Verbindung mit 2 ausführlicher beschrieben, kann eine derartige Schaltungsanordnung über eine oder mehrere PPUs integriert werden, die dazu konfiguriert werden können, Allzweckverarbeitungsoperationen durchzuführen. In denselben oder anderen Ausführungsformen befinden sich in dem Parallelverarbeitungsteilsystem 112 ferner Schaltungsanordnungen, die zur Grafikverarbeitung optimiert sind. Derartige Schaltungsanordnungen können über eine oder mehrere PPUs integriert werden, die dazu konfiguriert sein können, Grafikverarbeitungsoperationen durchzuführen. In denselben oder anderen Ausführungsformen kann eine beliebige Anzahl von PPUs Daten an eine beliebige Anzahl von Anzeigevorrichtungen 110 ausgeben. In einigen Ausführungsformen können null oder mehr der PPUs dazu konfiguriert sein, Allzweckverarbeitungsoperationen durchzuführen, aber keine Grafikverarbeitungsoperationen, null oder mehr der PPUs können dazu konfiguriert sein, grafische Verarbeitungsoperationen durchzuführen, aber keine Allzweckverarbeitungsoperationen, und null oder mehr der PPUs können dazu konfiguriert sein, Verarbeitungsoperationen für Allzweckverarbeitungsoperationen und/oder Grafikverarbeitungsoperationen durchzuführen. In einigen Ausführungsformen können Software-Anwendungen, die unter der Steuerung der CPU 102 ausgeführt werden, Kernel auf einer oder mehreren PPUs starten.
  • In einigen Ausführungsformen kann das Parallelverarbeitungsteilsystem 112 mit einem oder mehreren anderen Elemente von der 1 integriert werden, um ein einziges System zu bilden. Beispielsweise kann das Parallelverarbeitungsteilsystem 112 mit der CPU 102 und anderen Verbindungsschaltungsanordnungen auf einem einzigen Chip integriert werden, um ein System auf einem Chip zu bilden. In den gleichen oder anderen Ausführungsformen kann eine beliebige Anzahl von CPUs 102 und eine beliebige Anzahl von Parallelverarbeitungsteilsystemen 112 über eine beliebige Anzahl gemeinsam genutzter geografischer Standorte und/oder eine beliebige Anzahl unterschiedlicher geografischer Standorte verteilt und/oder in einer oder mehreren Cloud-Rechenumgebungen (d.h gekapselte gemeinsam genutzte Ressourcen, Software, Daten usw.) in beliebiger Kombination implementiert werden.
  • Der Systemspeicher 104 kann ohne Einschränkung eine beliebige Anzahl und/oder Typen von Systemsoftware (z. B. Betriebssysteme, Vorrichtungstreiber, Bibliothekprogramme, Dienstprogramme, usw.), eine beliebige Anzahl und/oder Typen von Software-Anwendungen oder eine beliebige Kombination davon beinhalten. Die Systemsoftware und Software-Anwendungen, die in dem Systemspeicher 104 beinhaltet sind, können auf jede technisch machbare Weise organisiert werden.
  • Wie gezeigt, beinhaltet der Systemspeicher 104 in einigen Ausführungsformen ohne Einschränkung einen Programmierplattform-Softwarestapel 160 und die Software-Anwendung 190. Der Programmierplattform-Softwarestapel 160 ist mit einer Programmierplattform zum Nutzen von Hardware in dem Parallelverarbeitungsteilsystem 112 assoziiert, um Rechenaufgaben zu beschleunigen. In einigen Ausführungsformen können Softwareentwickler auf die Programmierplattform durch ohne Einschränkung Bibliotheken, Compiler-Richtlinien und/oder Erweiterungen an Programmiersprachen zugänglich. In denselben oder anderen Ausführungsformen kann die Programmierplattform Compute-Unified-Device-Architecture (Compute Unified Device Architecture, CUDA) (CUDA®, entwickelt von NVIDIA Corporation in Santa Clara, CA), Radeon-Open-Comput-Platform (Radeon Open Compute Platform, ROCm), OpenCL (OpenCL™, entwickelt von Khronos-Group), SYCL oder Intel One API sein, ohne darauf beschränkt zu sein.
  • In einigen Ausführungsformen stellt der Programmierplattform-Softwarestapel 160 eine Ausführungsumgebung für die Software-Anwendung 190 und null oder mehr andere Software-Anwendungen (nicht gezeigt) bereit. In einigen Ausführungsformen kann die Software-Anwendung 190 jede Art von Software-Anwendung (z. B. eine Genomikanwendung) sein, die in einer beliebiger Anzahl und/oder in beliebigen Typen von Speichern vorliegt und eine beliebige Anzahl und/oder beliebige Typen von Anweisungen auf der CPU 102 und/oder eine beliebige Anzahl und/oder Typen von Anweisungen auf dem Parallelverarbeitungsteilsystem 112 ausführt. In einigen Ausführungsformen führt die Software-Anwendung 190 eine beliebige Anzahl und/oder Typen von Anweisungen, die mit einer beliebigen Anzahl lokaler Sequenzalignierungen assoziiert sind, aus. In denselben oder anderen Ausführungsformen kann die Software-Anwendung 190 eine beliebige Anzahl und/oder beliebige Typen von Anweisungen auf dem Parallelverarbeitungsteilsystem 112 auf jede technisch machbare Weise ausführen. Beispielsweise kann die Software-Anwendung 190 in einigen Ausführungsformen ohne Einschränkung jede Computersoftware beinhalten, die dazu fähig ist, auf dem Programmierplattform-Softwarestapel 160 gestartet zu werden.
  • In einigen Ausführungsformen werden die Software-Anwendung 190 und der Programmierplattform-Softwarestapel 160 unter der Steuerung der CPU 102 ausgeführt. In denselben oder anderen Ausführungsformen kann die Software-Anwendung 190 über den Programmierplattform-Softwarestapel 160 auf eine oder mehrere PPUs, die in dem Parallelverarbeitungssubsystem 112 beinhaltet sind, zugreifen. In einigen Ausführungsformen beinhaltet der Programmierplattform-Softwarestapel 160 ohne Einschränkung eine beliebige Anzahl und/oder beliebige Typen von Bibliotheken (nicht gezeigt), eine beliebige Zahl und/oder beliebige Typen von Laufzeiten (nicht gezeigt), eine beliebige Anzahl und/oder beliebige Typen von Treibern (nicht gezeigt) oder eine beliebige Kombination davon.
  • In einigen Ausführungsformen kann jede Bibliothek ohne Einschränkung Daten und Programmiercode beinhalten, die von Computerprogrammen (z. B. der Software-Anwendung 190, dem SW-Kernel 192 usw.) verwendet und während der Softwareentwicklung genutzt werden können. In denselben oder anderen Ausführungsformen kann jede Bibliothek ohne Einschränkung vorab geschriebenen Code, Kernel, Subroutinen, Funktionen, Makros, eine beliebige Anzahl und/oder beliebige Typen anderer Anweisungssätze, oder eine beliebige Kombination davon, die zur Ausführung auf einem oder mehreren SMs innerhalb des Parallelverarbeitungsteilsystems 112 optimiert sind, beinhalten. In denselben oder anderen Ausführungsformen können Bibliotheken, die in dem Programmierplattform-Softwarestapel 160 beinhaltet sind, ohne Einschränkung Klassen, Werte, Typspezifikationen, Konfigurationsdaten, Dokumentation oder eine beliebige Kombination davon beinhalten. In einigen Ausführungsformen sind die Bibliotheken mit einer oder mehreren Anwendungsprogrammierschnittstellen (API) assoziiert, die mindestens einen Teil des in den Bibliotheken implementierten Inhalts darlegen.
  • Obwohl dies nicht gezeigt ist, können in einigen Ausführungsformen eine oder mehrere SW-Bibliotheken ohne Einschränkung vorab geschriebenen Code, Kernel (einschließlich des SW-Kernels 192), Subroutinen, Funktionen, Makros und eine beliebige Anzahl und/oder beliebige Typen von Anweisungssätzen, Klassen, Werten, Typspezifikationen, Konfigurationsdaten, Dokumentation oder eine beliebige Kombination davon, die für die Ausführung auf einem oder mehreren SMs innerhalb des Parallelverarbeitungsteilsystems 112 optimiert sind, beinhalten.
  • In einigen Ausführungsformen ist mindestens ein Vorrichtungstreiber dazu konfiguriert, die Verarbeitungsoperationen der einen oder der mehreren PPUs innerhalb des Parallelverarbeitungsteilsystems 112 zu verwalten. In denselben oder anderen Ausführungsformen implementiert eine beliebige Anzahl von Vorrichtungstreibern API-Funktionalität, die es Software-Anwendungen ermöglicht, Anweisungen zur Ausführung auf der einen oder den mehreren PPU über API-Aufrufe zu spezifizieren. In einigen Ausführungsformen stellt eine beliebige Anzahl von Vorrichtungstreibern eine Kompilierungsfunktionalität zum Generieren von Maschinencode bereit, der speziell für das Parallelverarbeitungsteilsystem 112 optimiert ist.
  • In denselben oder anderen Ausführungsformen beinhaltet mindestens eine Laufzeit ohne Einschränkung jedes technisch machbare Laufzeitsystem, das die Ausführung der Software-Anwendung 190 und null oder mehr anderer Software-Anwendungen unterstützen kann. In einigen Ausführungsformen ist die Laufzeit als eine oder mehrere Bibliotheken, die mit einer oder mehreren Laufzeit-APIs assoziiert sind, implementiert. In denselben oder anderen Ausführungsformen werden ein oder mehrere Treiber als Bibliotheken, die mit Treiber-APIs assoziiert sind, implementiert.
  • In einigen Ausführungsformen können eine oder mehrere Laufzeit-APIs und/oder ein oder mehrere Treiber-API ohne Einschränkung eine beliebige Anzahl von Funktionen für jede der Speicherverwaltung, Ausführungssteuerung, Vorrichtungsverwaltung, Fehlerhandhabung und Synchronisation und dergleichen darlegen. Die Speicherverwaltungsfunktionen können, ohne darauf beschränkt zu sein, Funktionen zum Freigeben und Kopieren von Vorrichtungsspeicher sowie zum Übertragen von Daten zwischen Host-Speicher und Vorrichtungsspeicher beinhalten. Die Ausführungssteuerfunktionen können, ohne darauf beschränkt zu sein, Funktionen zum Starten von Kerneln auf PPUs beinhalten, die in den Parallelverarbeitungsteilsystemen 112 beinhaltet sind. In einigen Ausführungsformen sind die Treiber-API(s) relativ zu der/den Laufzeit-API(s) APIs niedrigerer Ebene, die eine feinkörnigere Steuerung der PPUs bereitstellen.
  • In denselben oder anderen Ausführungsformen ermöglicht es eine parallele Laufzeit Software-Anwendungen, Gruppen von Threads über einen oder mehrere SMs zu verteilen. Jede der Software-Anwendungen kann sich in einer beliebigen Anzahl von Speichern befinden und auf einer beliebigen Anzahl von Prozessoren in beliebiger Kombination ausgeführt werden. Einige Beispiele von Prozessoren beinhalten ohne Einschränkung die CPU 102, das Parallelverarbeitungsteilsystem 112 und die PPUs. In einigen Ausführungsformen können Software-Anwendungen, die unter der Steuerung der CPU 102 ausgeführt werden, Kernel auf einer oder mehreren PPUs starten.
  • Die Software-Anwendung 190 kann jede beliebige Anzahl und/oder Typen von Funktionen zum Konfigurieren einer Gruppe von Threads zum gleichzeitigen Ausführen der Matrix-Füllphase eines SW-Algorithmus für ein oder mehrere lokale Alignierungsprobleme aufrufen. In einigen Ausführungsformen ist jedes lokale Alignierungsproblem mit einer Zielsequenz, einer Abfragesequenz, einem Satz von Konstanten und einer Substitutionsmatrix assoziiert. In einigen Ausführungsformen können die Zielsequenz, die Abfragesequenz, die Länge der Zielsequenz, die Länge der Abfragesequenz, der Satz von Konstanten und die Substitutionsmatrix, die mit einem lokalen Sequenzalignierungsproblem assoziiert sind, mit/von der Zielsequenz, der Abfragesequenz, der Länge der Zielsequenz, der Länge der Abfragesequenz, dem Satz von Konstanten bzw. der Substitutionsmatrix, die mit jedem der anderen lokalen Sequenzalignierungsprobleme assoziiert sind, gleich oder unterschiedlich sein. Nur zu Erläuterungszwecken werden die Zielsequenz(en), die Abfragesequenz(en), der Satz/die Sätze von Konstanten und die Substitutionsmatrix(matrizen) hierin auch als „SW-Eingabedaten“ bezeichnet.
  • In einigen Ausführungsformen ist das Ergebnis der Matrix-Füllphase des SW-Algorithmus für jedes lokale Alignierungsproblem eine maximale Teilalignierungsbewertung und eine maximale Bewertungsposition (z. B. ein Zeilenindex und ein Spaltenindex) innerhalb einer assoziierten Bewertungsmatrix, In denselben oder anderen Ausführungsformen wird zu einem gegebenen Zeitpunkt nur ein Teil der Bewertungsmatrix in dem Speicher gespeichert. Beispielsweise werden in einigen Ausführungsformen nur zwei Zeilen der Bewertungsmatrix zu einem gegebenen Zeitpunkt in dem Speicher gespeichert. In einigen Ausführungsformen nutzen ein, zwei oder vier lokale Alignierungsprobleme jede Bewertungsmatrix gemeinsam.
  • In einigen Ausführungsformen wählt die Software-Anwendung 190 zum Konfigurieren einer Gruppe von Threads zum gleichzeitigen Durchführen der Matrix-Füllphase den SW-Kernel 192 aus einem oder mehreren SW-Kerneln aus, die jeweils mit unterschiedlichen Merkmalen, die auf einer beliebigen Anzahl und/oder auf beliebigen Typen von Kriterien basieren, assoziiert sind. Beispielsweise verwenden in einigen Ausführungsformen einige SW-Kernel eine einzige SW-Anweisung, um Teilalignierungsdaten zu berechnen, und einige andere SW-Kernel verwenden eine Sequenz aus sechs Anweisungen, um Teilalignierungsdaten zu berechnen. In einigen Ausführungsformen implementieren einige SW-Kernel eine gestaffelte SIMD-Thread-Technik, um jedes lokale Alignierungsproblem auf mehrere Threads aufzuteilen. In denselben oder anderen Ausführungsformen weisen einige SW-Kernel jedes lokale Alignierungsproblem einem einzigen Thread zu. In einigen Ausführungsformen variiert der Typ der Eingabedaten (z. B. 32-Bit-Ganzzahl ohne Vorzeichen, 32-Bit-Ganzzahl mit Vorzeichen usw.) über die SW-Kernel hinweg.
  • In einigen Ausführungsformen ordnet die Software-Anwendung 190 Vorrichtungsspeicher zur Speicherung der Zielsequenz(en), der Abfragesequenz(en), des Satzes von Konstanten, der Substitutionsmatrix und des Ergebnisses/der Ergebnisse zu. Die Software-Anwendung 190 kopiert dann die Zielsequenz(en), die Abfragesequenz(en), den Satz von Konstanten und die Substitutionsmatrix aus dem Host-Speicher in den Vorrichtungsspeicher. Die Software-Anwendung 190 kann die Zielsequenz(en), die Abfragesequenz(en), den Satz/die Sätze von Konstanten, die Substitutionsmatrix(matrizen) und das Ergebnis/die Ergebnisse auf jede technisch machbare Weise organisieren, um Speicherzugriffe durch den SW-Kernel 192 zu optimieren.
  • In denselben oder anderen Ausführungsformen ruft die Software-Anwendung 190 den SW-Kernel 192 über einen (nicht gezeigten) Kernel-Aufruf auf oder „startet“ ihn. Der Kernel-Aufruf beinhaltet ohne Einschränkung den Namen des SW-Kernels 192, eine Ausführungskonfiguration (nicht gezeigt) und Argumentwerte (nicht gezeigt) für die Argumente des SW-Kernels 192. In einigen Ausführungsformen spezifiziert die Ausführungskonfiguration ohne Einschränkung eine Konfiguration (z. B. Größe, Abmessungen usw.) einer Gruppe von Threads. Die Thread-Gruppe kann auf jede technisch machbare Weise organisiert werden, und die Konfiguration der Gruppe von Threads kann auf jede technisch machbare Weise spezifiziert werden.
  • Beispielsweise ist die Gruppe von Threads in einigen Ausführungsformen als ein Raster kooperativer Thread-Arrays (CTAs) organisiert, und die Ausführungskonfiguration spezifiziert ohne Einschränkung eine eindimensionale oder mehrdimensionale Rastergröße und eine eindimensionale oder mehrdimensionale CTA-Größe. Jeder Thread in dem Raster von CTAs ist dazu konfiguriert, den SW-Kernel 192 auf unterschiedlichen Eingabedaten auszuführen. Genauer gesagt ist in einigen Ausführungsformen jede PPU dazu konfiguriert, gleichzeitig ein oder mehrere Raster von CTAs zu verarbeiten, und jedes CTA in einem Raster führt gleichzeitig dasselbe Programm an unterschiedlichen Eingabedaten aus. In denselben oder anderen Ausführungsformen ist jeder SM dazu konfiguriert, gleichzeitig ein oder mehrere CTAs zu verarbeiten. Jedes CTA wird auch als „Thread-Block“ bezeichnet. In einigen Ausführungsformen bricht jeder SM jedes CTA in eine oder mehrere Gruppen von parallelen Threads auf, die als „Warps“ bezeichnet werden, die der SM in einer SIMT-Weise (Single Instruction, Multiple Thread) anlegt, verwaltet, plant und ausführt. In einigen Ausführungsformen beinhaltet jeder Warp ohne Einschränkung eine feste Anzahl von Threads (z. B. 32). Jeder Warp in einem CTA führt gleichzeitig dasselbe Programm auf unterschiedlichen Eingabedaten aus, und jeder Thread in einem Warp führt gleichzeitig dasselbe Programm auf unterschiedlichen Eingabedaten aus. In einigen Ausführungsformen können die Threads in einem Warp während der Ausführung divergieren und wieder zusammenlaufen.
  • Die Rastergröße und die CTA-Größe können auf jede technisch machbare Weise basierend auf einer beliebigen Menge und/oder beliebigen Typen von Kriterien bestimmt werden. In einigen Ausführungsformen bestimmt die Software-Anwendung 190 die Rastergröße und die CTA-Größe basierend auf den Dimensionen der SW-Eingabedaten und den Mengen an Hardware-Ressourcen, wie beispielsweise Speicher oder Register, die dem Raster und den CTAs zur Verfügung stehen. In denselben oder anderen Ausführungsformen bestimmen die Software-Anwendung 190, der SW-Kernel 192 oder beide eine beliebige Menge oder beliebige Typen von Problemkonfigurationsdaten, die mit den SW-Kerneln 192 assoziiert sind, basierend auf der Rastergröße, der CTA-Größe, den Dimensionen der SW-Eingabedaten oder irgendeiner Kombination davon. Beispielsweise kann die Anzahl von Spalten, die mit jedem Thread assoziiert ist, wenn der SW-Kernel 192 eine gestaffelte SIMD-Thread-Matrix-Fülltechnik implementiert, basierend auf dem Registerdruck bestimmt werden. Um beispielsweise ein Überlaufen von Registern zu vermeiden, kann die Anzahl der jedem Thread zugewiesenen Spalten reduziert werden.
  • Es ist zu beachten, dass die hierin beschriebenen Techniken eher veranschaulichend als einschränkend sind und geändert werden können, ohne vom breiteren Geist und Umfang der Erfindung abzuweichen. Viele Modifikationen und Variationen der Funktionalität, die von dem System 100, der CPU 102, dem Parallelverarbeitungssubsystem 112, der Software-Anwendung 190, dem SW-Kernel 192, dem Softwarestapel 160 der Programmierplattform, null oder mehr Bibliotheken, null oder mehr Treibern, und null oder mehr Laufzeiten bereitgestellt werden, sind für den Durchschnittsfachmann offensichtlich, ohne vom Umfang und Geist der beschriebenen Ausführungsformen abzuweichen.
  • Man versteht, dass das hierin gezeigte System veranschaulichend ist und dass Variationen und Modifikationen möglich sind. Die Verbindungstopologie, einschließlich der Anzahl und Anordnung von Brücken, der Anzahl der CPUs 102 und der Anzahl der Parallelverarbeitungs-Subsysteme 112, kann nach Wunsch modifiziert werden. Beispielsweise kann der Systemspeicher 104 in einigen Ausführungsformen direkt mit der CPU 102 verbunden sein, anstatt über die Speicherbrücke 105, und andere Geräte können mit dem Systemspeicher 104 über die Speicherbrücke 105 und die CPU 102 kommunizieren. In anderen alternativen Topologien kann das Parallelverarbeitungs-Subsystem 112 statt mit der Speicherbrücke 105 mit der E/A-Brücke 107 oder direkt mit der CPU 102 verbunden sein. In noch anderen Ausführungsformen können die I/O-Brücke 107 und die Speicherbrücke 105 in einen einzelnen Chip integriert sein, anstatt als eine oder mehrere diskrete Vorrichtungen zu existieren. Schließlich können in bestimmten Ausführungsformen eine oder mehrere in 1 gezeigte Komponenten nicht vorhanden sein. Beispielsweise könnte der Schalter 116 weggelassen werden und der Netzwerkadapter 118 und die Add-In-Karten 120, 121 würden direkt mit der E/A-Brücke 107 verbunden.
  • Wie zuvor hierin beschrieben, kann in einigen Ausführungsformen jede Software-Anwendung, die auf einem Primärprozessor ausgeführt wird, eine Gruppe von Threads konfigurieren, um gleichzeitig den SW-Kernel 192 auf einem Parallelprozessor auszuführen, um eine Matrix-Füllphase für ein oder mehrere lokale Alignierungsprobleme durchzuführen. In mindestens einer Ausführungsform kann die Verarbeitungseinheit ein(e) beliebige(s/r) Anweisungsausführungssystem, -gerät oder -vorrichtung sein, das/der/die dazu in der Lage ist, Anweisungen auszuführen. Zu Erläuterungszwecken werden hierin die Begriffe „Funktion“ und „Programm“ beide verwendet, um auf einen beliebigen Satz von einer oder mehreren Anweisungen zu verweisen, die von einer beliebigen Anzahl und/oder beliebigen Typen von Prozessoren ausgeführt werden. Darüber hinaus wird der Begriff „Kernel“ verwendet, um auf einen Satz von Anweisungen (z. B. ein Programm, eine Funktion usw.) zu verweisen, die auf einem oder mehreren parallelen Prozessoren ausgeführt werden können.
  • Wie hierin bezeichnet, kann ein „Parallelprozessor“ ein beliebiges Rechensystem sein, das ohne Einschränkung mehrere Parallelverarbeitungselemente beinhaltet, die dazu konfiguriert werden können, eine beliebige Anzahl und/oder Typen von Berechnungen auszuführen. Und ein „Parallelverarbeitungselement“ eines Rechensystems ist eine physische Einheit der gleichzeitigen Ausführung in dem Rechensystem. In einigen Ausführungsformen kann der Parallelprozessor eine Parallelverarbeitungseinheit (PPU), eine Grafikverarbeitungseinheit (GPU), eine Tensorverarbeitungseinheit, eine Mehrkern-Zentraleinheit (CPU), eine Intelligenzverarbeitungseinheit, eine neuronale Verarbeitungseinheit, ein neuronaler Netzwerkprozessor, eine Datenverarbeitungseinheit, eine Visionsverarbeitungseinheit oder jede andere Art von Prozessor oder Beschleuniger, die derzeit oder in Zukunft die parallele Ausführung mehrerer Threads unterstützen kann, sein.
  • Wie hierin bezeichnet, kann ein „Primärprozessor“ jede Art von Parallelprozessor oder jede Art eines anderen Prozessors sein, der in der Lage ist, Kernel auf einem Parallelprozessor zu starten. In einigen Ausführungsformen ist der Primärprozessor ein latenzoptimierter Allzweckprozessor, wie etwa eine CPU. In einigen Ausführungsformen wird die Software-Anwendung 190 auf einem Parallelprozessor ausgeführt und kann eine Gruppe von Threads konfigurieren, die auf dem Parallelprozessor ausgeführt wird, um eine beliebige Anzahl der hierin beschriebenen Techniken in Bezug auf den SW-Kernel 192 auf jede technisch machbare Weise zu implementieren.
  • 2 ist gemäß verschiedenen Ausführungsformen eine PPU 202, die in dem Parallelverarbeitungsteilsystem 112 der 1 beinhaltet ist. Obwohl 2, wie oben angegeben, eine PPU 202 abbildet, kann das Parallelverarbeitungsteilsystem 112 null oder mehr andere PPUs beinhalten, die mit den PPUs 202 identisch sind, und null oder mehr andere PPUs, die von der PPU 202 unterschiedlich ist. Wie gezeigt, ist die PPU 202 an einen lokalen Parallelverarbeitungsspeicher (PP-Speicher) 204 gekoppelt. Die PPU 202 und der PP-Speicher 204 können unter Verwendung einer oder mehrerer integrierter Schaltungsvorrichtungen, wie beispielsweise programmierbarer Prozessoren, anwendungsspezifischer integrierter Schaltungen oder Speichervorrichtungen, oder auf jede andere technisch machbare Weise implementiert werden.
  • Wie gezeigt, enthält die PPU 202 Schaltungsanordnungen, die für eine Allzweckverarbeitung optimiert sind, und die PPU 202 kann dazu konfiguriert sein, Allzweckverarbeitungsoperationen durchzuführen. Obwohl dies in 2 nicht gezeigt ist, enthält die PPU 202 in einigen Ausführungsformen ferner Schaltungsanordnungen, die zur Grafikverarbeitung optimiert sind, einschließlich beispielsweise Videoausgabeschaltungsanordnungen. In derartigen Ausführungsformen kann die PPU 202 dazu konfiguriert sein, Allzweckverarbeitungsoperationen und/oder Grafikverarbeitungsoperationen durchzuführen.
  • Unter erneuter Bezugnahme auf 1 sowie 2, ist in einigen Ausführungsformen die CPU 102 der Master-Prozessor des Systems 100, der Operationen anderer Systemkomponenten steuert und koordiniert. Insbesondere gibt die CPU 102 Befehle aus, die den Betrieb der PPU 202 steuern. In einigen Ausführungsformen schreibt die CPU 102 einen Strom von Befehlen für die PPU 202 in eine Datenstruktur (entweder in 1 oder 2 nicht explizit gezeigt), die sich im Systemspeicher 104, dem PP-Speicher 204 oder einem anderen Speicher befinden kann Ort, auf den sowohl die CPU 102 als auch die PPU 202 zugreifen können. Ein Zeiger auf die Datenstruktur wird in einen Pushbuffer geschrieben, um die Verarbeitung des Befehlsstroms in der Datenstruktur einzuleiten. Die PPU 202 liest Befehlsströme aus dem Pushbuffer und führt dann Befehle asynchron in Bezug auf den Betrieb der CPU 102 aus. In Ausführungsformen, bei denen mehrere Push-Puffer generiert werden, Ausführungsprioritäten für jeden Push-Puffer von einem Anwendungsprogramm über einen Vorrichtungstreiber (nicht gezeigt) spezifiziert werden, um die Planung der unterschiedlichen Push- Puffer zu steuern.
  • Unter erneuter Bezugnahme auf 2 sowie auf 1, beinhaltet die PPU 202 in einigen Ausführungsformen eine E/A-Einheit 205, die mit dem Rest des Systems 100 über den Kommunikationspfad 113, der mit der Speicherbrücke 105 verbunden ist, kommuniziert. In einigen anderen Ausführungsformen kommuniziert die E/A-Einheit 205 mit dem Rest des Systems 100 über den Kommunikationspfad 113, der direkt mit der CPU 102 verbunden ist. In denselben oder anderen Ausführungsformen kann die Verbindung der PPU 202 mit dem Rest des Systems 100 variiert werden. In einigen Ausführungsformen ist das Parallelverarbeitungsteilsystem 112, das mindestens eine PPU 202 beinhaltet, als Add-In-Karte implementiert, die in einen Erweiterungssteckplatz des Systems 100 eingesetzt werden kann. In einigen anderen Ausführungsformen kann die PPU 202 auf einem einzigen Chip mit einer Busbrücke, wie etwa der Speicherbrücke 105 oder der E/A-Brücke 107 integriert sein. In einigen anderen Ausführungsformen können einige oder alle der Elemente der PPU 202 gemeinsam mit der CPU 102 in einer einzigen integrierten Schaltung oder einem System auf einem Chip beinhaltet sein.
  • Die E/A-Einheit 205 generiert Pakete (oder andere Signale) zur Übertragung auf dem Kommunikationspfad 113 und empfängt auch alle eingehenden Pakete (oder andere Signale) von dem Kommunikationspfad 113 und leitet die eingehenden Pakete an geeignete Komponenten der PPU 202 weiter. Zum Beispiel können Befehle in Bezug auf Verarbeitungsaufgaben an eine Host-Schnittstelle 206 gerichtet werden, während Befehle in Bezug auf Speicheroperationen (z. B. Lesen aus dem oder Schreiben in den PP-Speicher 204 ) an eine Kreuzschieneneinheit 210 gerichtet werden können. Die Hostschnittstelle 206 liest jeden Push-Puffer und überträgt den in dem Push-Puffer gespeicherten Befehlsstrom an ein Front-End 212.
  • Im Betrieb überträgt das Front-End 212 Verarbeitungsaufgaben, die von der Host-Schnittstelle 206 empfangen wurden, an eine Arbeitsverteilungseinheit (nicht gezeigt) innerhalb einer Aufgaben-/Arbeitseinheit 207. Die Arbeitsverteilungseinheit empfängt Zeiger auf Verarbeitungsaufgaben, die als Aufgabenmetadaten (TMD) codiert und in dem Speicher gespeichert sind. Die Zeiger auf TMDs sind in einem Befehlsstrom beinhaltet, der als Push-Puffer gespeichert und von dem Front-End 212 von der Host-Schnittstelle 206 empfangen wird. Verarbeitungsaufgaben, die als TMDs kodiert werden können, beinhalten Indizes, die mit den zu verarbeitenden Daten assoziiert sind, sowie Zustandsparameter und Befehle, die definieren, wie die Daten verarbeitet werden sollen. Beispielsweise könnten die Zustandsparameter und Befehle das auf den Daten auszuführende Programm definieren.
  • Die PPU 202 implementiert vorteilhafterweise eine hochparallele Verarbeitungsarchitektur basierend auf einem Verarbeitungscluster-Array 230, das einen Satz von C-GPCs 208 beinhaltet, wobei C ≥1. Jedes der GPCs 208 ist in der Lage, eine große Anzahl (z. B. Hunderte oder Tausende) von Threads gleichzeitig auszuführen, wobei jeder Thread eine Instanz eines Programms ist (z. B. ein Kernel). In verschiedenen Anwendungen können unterschiedliche GPCs 208 zum Verarbeiten unterschiedlicher Typen von Programmen oder zum Durchführen unterschiedlicher Typen von Berechnungen zugeordnet werden. Die Zuordnung der GPCs 208 kann abhängig von der Arbeitsbelastung, die für jeden Typ von Programm oder Berechnung entsteht, variieren. Die GPCs 208 empfangen auszuführende Verarbeitungsaufgaben von der Arbeitsverteilungseinheit innerhalb der Aufgaben-/Arbeitseinheit 207.
  • Die Aufgaben-/Arbeitseinheit 207 empfängt Verarbeitungsaufgaben von dem Front-End 212 und stellt sicher, dass allgemeine Verarbeitungscluster (GPCs) 208 in einen gültigen Zustand konfiguriert werden, bevor die von allen TMDs spezifizierte Verarbeitungsaufgabe initiiert wird. Für alle TMD, die verwendet werden, um die Ausführung der Verarbeitungsaufgabe zu planen, kann eine Priorität spezifiziert werden. Verarbeitungsaufgaben können auch von dem Verarbeitungscluster-Array 230 empfangen werden. Optional können die TMD einen Parameter beinhalten, der steuert, ob die TMD am Anfang oder am Ende einer Liste von Verarbeitungsaufgaben (oder einer Liste von Zeigern auf die Verarbeitungsaufgaben) hinzugefügt werden, wodurch eine weitere Kontrollebene über die Ausführungspriorität bereitgestellt wird.
  • Die Speicherschnittstelle 214 beinhaltet einen Satz von D Partitionseinheiten 215, wobei D ≥ 1. Jede der Partitionseinheiten 215 ist an einen oder mehrere dynamische Direktzugriffsspeicher (DRAMs) 220 gekoppelt, die sich innerhalb des PP-Speichers 204 befinden. In einigen Ausführungsformen ist die Anzahl der Partitionseinheiten 215 gleich der Anzahl der DRAMs 220, und jede der Partitionseinheiten 215 ist an einen unterschiedlichen der DRAMs 220 gekoppelt. In einigen anderen Ausführungsformen kann sich die Anzahl der Partitionseinheiten 215 von der Anzahl der DRAMs 220 unterscheiden. Der Durchschnittsfachmann wird erkennen, dass der DRAM 220 durch jede andere technisch geeignete Speichervorrichtung ersetzt werden kann. Im Betrieb können verschiedene Ziele über die DRAMs 220 gespeichert werden, was es den Partitionseinheiten 215 erlaubt, Teile jedes Ziels parallel zu schreiben, um die verfügbare Bandbreite des PP-Speichers 204 effizient zu nutzen.
  • Ein gegebener GPC 208 kann Daten verarbeiten, die in einen der DRAMs 220 innerhalb des PP-Speichers 204 geschrieben werden sollen. Die Kreuzschieneneinheit 210 ist so konfiguriert, dass sie den Ausgang jedes GPC 208 zum Eingang einer beliebigen Partitionseinheit 215 oder zu einem beliebigen anderen GPC 208 zur weiteren Verarbeitung leitet. Die GPCs 208 kommunizieren mit der Speicherschnittstelle 214 über die Kreuzschieneneinheit 210, um aus einer beliebigen Anzahl der DRAMs 220 zu lesen oder in diese zu schreiben. In einigen Ausführungsformen weist die Kreuzschieneneinheit 210 zusätzlich zu einer Verbindung zu dem PP-Speicher 204 über die Speicherschnittstelle 214 eine Verbindung mit der E/A-Einheit 205 auf, wodurch es den SMs innerhalb der unterschiedlichen GPCs 208 ermöglicht wird, mit dem Systemspeicher 104 oder einem anderen Speicher, der nicht lokal für die PPU 202 ist, zu kommunizieren. In der Ausführungsform der 2 ist die Kreuzschieneneinheit 210 direkt mit der E/A-Einheit 205 verbunden. In verschiedenen Ausführungsformen kann die Kreuzschieneneinheit 210 virtuelle Kanäle verwenden, um Verkehrsströme zwischen den GPCs 208 und den Partitionseinheiten 215 zu trennen.
  • Auch hierin können die GPCs 208 dazu programmiert werden, Verarbeitungsaufgaben ausführen, die eine breite Vielfalt von Anwendungen und/oder Algorithmen betreffen. In einigen Ausführungsformen ist die PPU 202 dazu konfiguriert, Daten von dem Systemspeicher 104 und/oder dem PP-Speicher 204 zu einer oder mehreren On-Chip-Speichereinheiten zu übertragen, die Daten zu verarbeiten und Ergebnisdaten zurück in den Systemspeicher 104 und/oder den PP-Speicher 204 zu schreiben. Auf die Ergebnisdaten kann dann von anderen Systemkomponenten zugegriffen werden, einschließlich der CPU 102, einer anderen PPU 202 innerhalb des Parallelverarbeitungsteilsystems 112 oder eines anderen Parallelverarbeitungsteilsystems 112 innerhalb des Systems 100.
  • Wie oben angemerkt, kann eine beliebige Anzahl der PPUs 202 im Parallelverarbeitungs-Subsystem 112 enthalten sein. Beispielsweise können mehrere PPUs 202 auf einer einzelnen Zusatzkarte bereitgestellt werden, oder es können mehrere Zusatzkarten mit dem Kommunikationspfad 113 verbunden werden, oder eine oder mehrere der PPUs 202 können in einen Brückenchip integriert werden. Die PPUs 202 in einem Multi-PPU-System können identisch oder voneinander unterschiedlich sein. Beispielsweise könnten unterschiedliche PPUs 202 unterschiedliche Anzahlen von Prozessorkernen und/oder unterschiedliche Mengen des PP-Speichers 204 aufweisen. In Implementierungen, in denen mehrere PPUs 202 vorhanden sind, können diese PPUs 202 parallel betrieben werden, um Daten mit einem höheren Durchsatz zu verarbeiten, als dies mit einer einzigen PPU 202 möglich ist. Systeme, die eine oder mehrere PPUs 202 enthalten, können in einer Vielzahl von Konfigurationen und Formfaktoren implementiert werden, einschließlich ohne Einschränkung Desktops, Laptops, tragbare Personalcomputer oder andere tragbare Geräte, Server, Workstations, Spielkonsolen, eingebettete Systeme und dergleichen.
  • 3A ist ein Blockdiagramm eines GPC 208, das in der PPU 202 der 2 beinhaltet ist, gemäß verschiedenen Ausführungsformen. Im Betrieb kann das GPC 208 dazu konfiguriert sein, eine große Anzahl von Threads parallel auszuführen. In einigen Ausführungsformen ist jeder auf dem GPC 208 ausgeführte Thread eine Instanz eines bestimmten Programms, das auf einem bestimmten Satz von Eingabedaten ausgeführt wird. In mindestens einer Ausführungsform Einzelanweisungs-, Mehrfachdaten (SIMD) Anweisungsausgabetechniken verwendet, um die parallele Ausführung einer großen Anzahl von Threads zu unterstützen, ohne mehrere unabhängige Anweisungseinheiten bereitzustellen. In einigen anderen Ausführungsformen werden SIMT-Techniken verwendet, um die parallele Ausführung einer großen Anzahl von im Allgemeinen synchronisierten Threads zu unterstützen, wobei eine gemeinsame Anweisungseinheit verwendet wird, die dazu konfiguriert ist, Anweisungen an einen Satz von Verarbeitungs-Engines innerhalb des GPC 208 auszugeben. Im Gegensatz zu einem SIMD-Ausführungssystem, bei dem alle Verarbeitungsmaschinen typischerweise identische Anweisungen ausführen, erlaubt es die SIMT-Ausführung, divergenten Ausführungspfaden durch ein gegebenes Programm bequemer zu folgen. Der Durchschnittsfachmann wird verstehen, dass ein SIMD-Verarbeitungssystem eine funktionale Teilmenge eines SIMT-Verarbeitungssystems darstellt.
  • Der Betrieb des GPC 208 wird über einen Pipeline-Manager 305 gesteuert, der Verarbeitungsaufgaben, die von der Arbeitsverteilungseinheit (nicht gezeigt) innerhalb der Aufgaben-/Arbeitseinheit 207 empfangen werden, an einen oder mehrere SMs 310 verteilt. Der Pipeline-Manager 305 kann auch dazu konfiguriert sein, eine Arbeitsverteilungs-Kreuzschiene 316 zu steuern, indem er Ziele für die verarbeitete Datenausgabe durch die SMs 310 spezifiziert.
  • In einigen Ausführungsformen beinhaltet das GPC 208 ohne Einschränkung einen Satz von M der SMs 310, wobei M ≥ 1. In denselben oder anderen Ausführungsformen beinhaltet jeder der SMs 310 ohne Einschränkung einen Satz von Ausführungseinheiten (in 3A nicht gezeigt). Verarbeitungsoperationen, die für jede der Ausführungseinheiten spezifisch sind, können gepipelinet werden, was es ermöglicht, eine neue Anweisung zur Ausführung auszugeben, bevor eine vorherige Anweisung die Ausführung abgeschlossen hat. Jede Kombination von Ausführungseinheiten innerhalb eines gegebenen SM 310 kann bereitgestellt werden. In verschiedenen Ausführungsformen können die Ausführungseinheiten dazu konfiguriert sein, eine Vielfalt unterschiedlicher Operationen zu unterstützen, einschließlich Ganzzahl- und Gleitkommaarithmetik (z. B. Addition und Multiplikation), Vergleichsoperationen, Boolesche Operationen (z. B. AND, OR, XOR), Bit-Verschieben und Berechnen verschiedener algebraischer Funktionen (z. B. planare Interpolation und trigonometrische, exponentielle und logarithmische Funktionen usw.). Vorteilhafterweise kann dieselbe Ausführungseinheit dazu konfiguriert sein, unterschiedliche Operationen durchzuführen.
  • Wie zuvor hierin beschrieben, ist in einigen Ausführungsformen jeder SM 310 dazu konfiguriert, einen oder mehrere Warps zu verarbeiten. In einigen Ausführungsformen kann der SM 310 Anweisungen auf Warp-Ebene ausgeben und ausführen. Insbesondere kann der SM 310 in einigen Ausführungsformen Warp-Shuffle-Anweisungen ausgeben und ausführen (z. B. SHFL_SYNC), die einen direkten Registerzu-Register-Datenaustausch zwischen den Threads in einem Warp ermöglichen.
  • In einigen Ausführungsformen können mehrere verwandte Warps, die in einem CTA 312 beinhaltet sind, gleichzeitig innerhalb des SM 310 aktiv sein (in unterschiedlichen Ausführungsphasen). In denselben oder anderen Ausführungsformen ist die Größe des CTA 312 gleich m*k, wobei k die Anzahl der gleichzeitig ausgeführten Threads in einem Warp ist, die typischerweise ein ganzzahliges Vielfaches der Anzahl der Ausführungseinheiten innerhalb des SM 310 ist, und m die Anzahl von Warps, die gleichzeitig aktiv ist, innerhalb der SM 310. In einigen Ausführungsformen kann jedes CTA 312 ein einziger Thread, ein eindimensionales Array von Threads oder ein mehrdimensionaler Block von Threads sein, das/der dazu konfiguriert ist, gleichzeitig dasselbe Programm auf unterschiedlichen Eingabedaten auszuführen. In denselben oder anderen Ausführungsformen kann jeder der SMs 310 gleichzeitig eine maximale Anzahl von CTAs 312 (z. B. eines, zwei usw.), die von der Größe der CTAs 312 abhängt, verarbeiten.
  • In einigen Ausführungsformen wird jedem Thread in jedem CTA 312 eine eindeutige Thread-Kennung (ID) zugewiesen, auf die der Thread während der Ausführung zugreifen kann. Die Thread-ID, die als ein- oder mehrdimensionaler Zahlenwert definiert werden kann, steuert verschiedene Aspekte des Verarbeitungsverhaltens des Threads. Beispielsweise kann eine Thread-ID verwendet werden, um zu bestimmen, welchen Teil des Eingabedatensatzes ein Thread verarbeiten soll und/oder um zu bestimmen, welchen Teil eines Ausgabedatensatzes ein Thread erzeugen oder schreiben soll. In einigen Ausführungsformen hat jeder Thread in dem CTA 312 Zugriff auf einen Teil des gemeinsam genutzten Speichers, der dem CTA 312 zugeordnet ist. In denselben oder anderen Ausführungsformen können die Threads in jedem CTA 312 in einer Thread-Gruppe auf jede technisch machbare Weise (z. B. über einen gemeinsam genutzten Speicher) miteinander synchronisieren, zusammenarbeiten, kommunizieren oder eine beliebige Kombination davon.
  • Wie zuvor hierin in Verbindung mit 1 beschrieben, sind in einigen Ausführungsformen CTAs 312, die zum Ausführen desselben Kernels konfiguriert sind, in einem eindimensionalen oder mehrdimensionalen Raster organisiert. In denselben oder anderen Ausführungsformen wird jedem CTA 312 eine eindeutige CTA-ID zugewiesen, auf die jeder Thread in dem CTA 312 während der Ausführung des Threads zugreifen kann.
  • Unter erneuter Bezugnahme auf 2 sowie 3A wird in einigen Ausführungsformen jedes CTA 312 in einem gegebenen Raster auf einem der SMs 310, die in der PPU 202 beinhaltet sind, eingeplant. Anschließend führen die Threads in jedem CTA 312 gleichzeitig dasselbe Programm auf unterschiedlichen Eingabedaten aus, wobei jeder Thread in dem CTA 312 auf einer unterschiedlichen Ausführungseinheit innerhalb des SM 310, auf der das CTA 312 geplant ist, ausgeführt wird.
  • In einigen Ausführungsformen enthält jeder der SMs 310 einen Level-1-Cache (L1) (nicht in 3A gezeigt) oder verwendet Platz in einem entsprechenden L1-Cache außerhalb des SM 310, um unter anderem Lade- und Speicheroperationen zu unterstützen. Jeder der SMs 310 hat auch Zugriff auf Level-2-Caches (L2) (nicht gezeigt), die von allen GPCs 208 in der PPU 202 gemeinsam genutzt werden. In einigen Ausführungsformen können die L2-Caches verwendet werden, um Daten zwischen Threads zu übertragen. Schließlich haben die SMs 310 auch Zugriff auf chipexternen „globalen“ Speicher, der den PP-Speicher 204 und/oder den Systemspeicher 104 beinhalten kann. Es versteht sich, dass jeder beliebige Speicher außerhalb der PPU 202 als globaler Speicher verwendet werden kann. Zusätzlich kann, wie in 3A gezeigt, ein Level-Eins-Punkt-Fünf-Cache (L1.5-Cache) 314 in dem GPC 208 beinhaltet sein und konfiguriert sein, um Daten zu empfangen und zu halten, die von dem Speicher über die Speicherschnittstelle 214 von dem SM 310 angefordert werden, und die angeforderten Daten zu dem SM 310 bereitstellen. Derartige Daten können ohne Einschränkung Anweisungen, einheitliche Daten und konstante Daten beinhalten. In Ausführungsformen, die mehrere SMs 310 innerhalb des GPC 208 beinhalten, können die SMs 310 vorteilhafterweise gemeinsame Anweisungen und Daten, die in dem L1.5-Cache 314 zwischengespeichert sind, gemeinsam nutzen.
  • Jedes GPC 208 kann eine assoziierte Speicherverwaltungseinheit (MMU) 318 aufweisen, die dazu konfiguriert ist, virtuelle Adressen in physische Adressen abzubilden. In verschiedenen Ausführungsformen kann sich die MMU 318 entweder innerhalb des GPC 208 oder innerhalb der Speicherschnittstelle 214 befinden. Die MMU 318 beinhaltet einen Satz von Seitentabelleneinträgen, der dazu verwendet wird, eine virtuelle Adresse auf eine physische Adresse einer Kachel oder Speicherseite abzubilden, sowie optional einen Cache-Zeilenindex. Die MMU 318 kann Adressübersetzungs-Lookaside-Puffer oder Caches beinhalten, die sich in den SMs 310, in einem oder mehreren L1-Caches oder in dem GPC 208 befinden können.
  • In einigen Ausführungsformen überträgt jeder SMs 310 eine verarbeitete Aufgabe an die Arbeitsverteilungs-Kreuzschiene 316, um die verarbeitete Aufgabe einem anderen GPC 208 zur weiteren Verarbeitung bereitzustellen oder die verarbeitete Aufgabe in einem L2-Cache (nicht gezeigt), dem PP-Speicher 204 oder dem Systemspeicher 104 über die Kreuzschieneneinheit 210 zu speichern.
  • Man wird verstehen, dass die hierin beschriebene Kernarchitektur veranschaulichend ist und dass Variationen und Modifikationen möglich sind. Unter anderem können eine beliebige Anzahl und/oder beliebige Typen von Verarbeitungseinheiten, wie etwa die SMs 310, in dem GPC 208 beinhaltet sein. Ferner, wie oben in Verbindung mit 2 beschrieben, kann die PPU 202 eine beliebige Anzahl von GPCs 208 beinhalten, die dazu konfiguriert sind, einander funktionell ähnlich zu sein, so dass das Ausführungsverhalten nicht davon abhängt, welches der GPCs 208 eine bestimmte Verarbeitungsaufgabe empfängt. Ferner arbeitet in einigen Ausführungsformen jedes der GPCs 208 unabhängig von den anderen GPCs 208 in der PPU 202, um Aufgaben für ein oder mehrere Anwendungsprogramme auszuführen. Angesichts des Vorstehenden wird der Durchschnittsfachmann erkennen, dass die in den 1-3 beschriebene Architektur den Umfang der vorliegenden Offenbarung in keiner Weise einschränkt.
  • Wie in Kursivschrift für das CTA 312 gezeigt, führt in einigen Ausführungsformen jeder Thread in einem oder mehreren CTAs 312 den SW-Kernel 192 gleichzeitig aus. Die CTAs 312 können dazu konfiguriert werden, den SW-Kernel 192 auf jede technisch machbare Weise ausführen. Ferner können die CTAs 312 auf jede technisch machbare Weise auf den SMs 310 eingeplant werden.
  • 3B ist ein Blockdiagramm des SM 310 der 3A gemäß verschiedenen Ausführungsformen. Wie gezeigt, beinhaltet der SM 310 in einigen Ausführungsformen ohne Einschränkung Teilpartitionseinheiten 320(1 )-320(4) und eine Speicher-Eingangs-/Ausgangs-Steuereinheit (MIO-Steuereinheit) 370, eine MIO-Einheit 380, einen L1-Cache 390 und eine Konvergenzbarriereeinheit (CBU) 360. In einigen anderen Ausführungsformen kann der SM 310 eine beliebige Anzahl von Teilpartitionseinheiten 320 beinhalten.
  • In einigen Ausführungsformen werden die dem SM 310 zugewiesenen Warps auf die Teilpartitionseinheiten 320 verteilt. Jeder der Teilpartitionseinheiten 320 kann eine beliebige Anzahl von Warps zugewiesen werden, jedoch wird ein gegebener Warp nur einer Teilpartitionseinheit 320 zugewiesen. Wie gezeigt, beinhaltet jede der Teilpartitionseinheiten 320 ohne Einschränkung einen Anweisungs-Cache 342, eine Micro-Scheduler-Dispatch-Einheit 340, eine Kerndatenpfadeinheit 350 und eine einheitliche Registerdatei 332. Die Zahl „x“ in Klammern für die einheitliche Registerdatei 332(x), den Anweisungs-Cache 342(x), die Micro-Scheduler-Dispatch-Einheit 340(x) und die Kern-Datenpfadeinheit 350(x) gibt die assoziierte Teilpartitionseinheit 320(x) an.
  • Wie in Verbindung mit 3A beschrieben, empfängt der SM 310 Verarbeitungsaufgaben von dem Pipeline-Manager 305. Für jeden Warp empfängt die zugewiesene Teilpartitionseinheit 320(x) die zugewiesenen Verarbeitungsaufgaben und speichert die assoziierten Anweisungen in dem Anweisungs-Cache 342(x). Die Mikro-Scheduler-Dispatch-Einheit 340(x) liest Anweisungen aus dem Anweisungs-Cache 342(x). In einigen Ausführungsformen beinhaltet die Micro-Scheduler-Dispatch-Einheit 340(x) ohne Einschränkung einen oder mehrere Anweisungsdecoder (nicht gezeigt). In denselben oder anderen Ausführungsformen ist jeder Anweisungsdecoder an eine beliebige Anzahl von Ausführungseinheiten gekoppelt. Nachdem ein in der Micro-Scheduler-Dispatch-Einheit 340(x) beinhalteter Anweisungsdecoder eine gegebene Anweisung decodiert, gibt die Micro-Scheduler-Dispatch-Einheit 340(x) die Anweisung an eine der Ausführungseinheiten aus. Wenn die Anweisung auf eine einer beliebigen Anzahl von Ausführungseinheiten 354(x) abzielt, die in der Kerndatenpfadeinheit 350(x) beinhaltet sind, gibt die Micro-Scheduler-Dispatch-Einheit 340(x) die Anweisung an die Ausführungseinheit aus. Andernfalls leitet die Micro-Scheduler-Dispatch-Einheit 340(x) die Anweisung an die MIO-Steuereinheit 370 weiter. In einigen Ausführungsformen beinhaltet die Micro-Scheduler-Dispatch-Einheit 340(x) ohne Einschränkung zwei Dispatcheinheiten (nicht gezeigt), die ermöglichen, dass zwei unterschiedliche Anweisungen von demselben Warp während jedes Taktzyklus ausgegeben werden. In einigen anderen Ausführungsformen kann jede der Micro-Scheduler-Dispatch-Einheit 340(x) eine einzige Dispatch-Einheit oder zusätzliche Dispatch-Einheiten beinhalten.
  • Die Kerndatenpfadeinheit 350(x) beinhaltet ohne Einschränkung die Ausführungseinheiten 354(x) und eine Registerdatei 352(x). Jede der in der Kerndatenpfadeinheit 350(x) beinhalteten Ausführungseinheiten 354(x) kann eine beliebige Anzahl und einen beliebigen Typ von Operationen durchführen, um Threads von Warps auszuführen, die der Teilpartitionseinheit 320(x) zugewiesen sind. Jede der Ausführungseinheiten 354(x), die in der Kerndatenpfadeinheit 350(x) beinhaltet sind, weist eine feste Latenz, wie etwa eine Arithmetik-Logik-Einheit (ALU), auf. Jede der in der Kerndatenpfadeinheit 350(x) beinhalteten Ausführungseinheiten 354(x) ist über eine beliebige Anzahl von Bussen mit der Registerdatei 352(x) und der Einheitsregisterdatei 332(x) verbunden.
  • Die Registerdatei 352(x) ist ein Cache-Speicher, der ohne Einschränkung eine beliebige Anzahl von Registern und eine beliebige Anzahl von Lese- und/oder Schreibports beinhaltet. In einigen Ausführungsformen ist jedes Register in der Registerdatei 352(x) einem der Threads eines der Warps zugewiesen, die der Teilpartitionseinheit 320(x) zugewiesen sind, und ist für keinen der anderen Threads direkt zugänglich. Auf diese Weise hat jeder Thread jedes Warps, der der Teilpartitionseinheit 320(x) zugewiesen ist, die exklusive Verwendung eines Satzes von Registern in der Registerdatei 352(x). In einigen Ausführungsformen kann eine beliebige Anzahl der Register als ein Vektorregister organisiert werden, das N M-Bit-Werte speichert. Beispielsweise kann in einigen Ausführungsformen ein Vektorregister einen unterschiedlichen 32-Bit-Wert für jeden Thread in einem 32-Thread-Warp speichern. Die Registerdatei 352(x) kann auf jede technisch machbare Weise implementiert werden. In einigen anderen Ausführungsformen können die in dem Register-Filer 352(x) beinhalteten Register angeordnet und Threads und/oder Warps auf jede technisch machbare Weise zugewiesen sein.
  • Die einheitliche Registerdatei 332(x) ist ein Cache-Speicher, der ohne Einschränkung eine beliebige Anzahl von einheitlichen Registern und eine beliebige Anzahl von Lese- und/oder Schreibports beinhaltet. Die einheitliche Registerdatei 332(x) kann auf jede technisch machbare Weise implementiert werden. In einigen Ausführungsformen ist jedes einheitliche Register in der einheitlichen Registerdatei 332(x) für alle Threads, die in einem Warp beinhaltet sind, zugänglich. In einigen anderen Ausführungsformen können die in dem Register-Filer 352(x) beinhalteten einheitlichen Register angeordnet und Threads und/oder Warps auf jede technisch machbare Weise zugewiesen werden.
  • In einigen Ausführungsformen verwaltet die CBU 360 divergierende Threads, führt Synchronisierungsoperationen durch und stellt Vorantreiben für alle nicht beendeten Threads, die in einem Warp beinhaltet sind, sicher. Wenn nur ein Teil der Threads in einem Warp an einer Anweisung teilnimmt, werden die Threads in dem Warp hierin während der Ausführung der Anweisung als „divergiert“ bezeichnet. Die CBU 360 kann dazu konfiguriert werden, eine beliebige Anzahl und einen beliebigen Typ von Synchronisationsoperationen basierend auf einer beliebigen Anzahl und einem beliebigen Typ von Synchronisationsanweisungen durchzuführen.
  • In einigen Ausführungsformen beinhaltet die MIO-Einheit 380 ohne Einschränkung eine beliebige Anzahl von Ausführungseinheiten 354(0). In denselben oder anderen Ausführungsformen kann jede der in der MIO-Einheit 380 beinhalteten Ausführungseinheiten 354(0) eine beliebige Anzahl und einen beliebigen Typ von Operationen durchführen, um Threads auszuführen, die dem SM 310 zugewiesen sind, unabhängig von der zugewiesenen Teilpartitionseinheit 320. Jede der in der MIO-Einheit 380 beinhalteten Ausführungseinheiten 354(0) ist über eine beliebige Anzahl von Bussen mit den Registerdateien 352(1 )-452(4) und den einheitlichen Registerdateien 332(1)-332(4) verbunden.
  • Wie gezeigt, bildet die MIO-Einheit 380 in einigen Ausführungsformen eine Schnittstelle mit den Registerdateien 352(1)-452(4), den einheitlichen Registerdateien 332(1)-432(4) und dem L1-Cache 390. Der L1-Cache 390 kann jeder Typ und jede Menge von On-Chip-Speicher, der auf jede technisch machbare Weise angeordnet ist, beinhalten. Die MIO-Einheit 380 und eine beliebige Anzahl von Bussen ermöglichen es jeder der Ausführungseinheiten 354(0)-354(4), die in dem SM 310 beinhaltet sind, auf Speicherstellen zuzugreifen, die in dem L1-Cache 390 beinhaltet sind.
  • In einigen Ausführungsformen implementiert jeder SM 310 ohne Einschränkung eine oder mehrere Ganzzahl-Pipelines (nicht gezeigt) und eine oder mehrere Gleitkomma-Pipelines (nicht gezeigt). In denselben oder anderen Ausführungsformen führt jede der Ganzzahl-Pipelines 32-Bit-Ganzzahl-Operationen über einen Satz von 32-Bit-Ganzzahl-Ausführungseinheiten durch, und jede der Gleitkomma-Pipelines führt 32-Bit-Gleitkomma-Operationen über einen Satz von 32-Bit-Gleitkomma-Ausführungseinheiten (in 3A nicht gezeigt) durch. In einigen Ausführungsformen kann jeder SM 310 Ganzzahlanweisungen parallel zu Gleitkommaanweisungen ausgeben und ausführen.
  • In einigen Ausführungsformen kann jeder SM 310 eine oder mehrere Anweisungen ausgeben und ausführen, die darauf spezialisiert sind, die Recheneffizienz der Matrix-Füllphase des SW-Algorithmus zu erhöhen. Beispielsweise kann in einigen Ausführungsformen jeder SM 310 eine SW-Anweisung, eine VIADD-Anweisung, eine VIADDMNMX-Anweisung, eine VIMNMX3-Anweisung, eine VIMNMX-Anweisung oder eine beliebige Kombination davon ausgeben und ausführen. Die SW-Anweisung wird nachstehend in Verbindung mit 6 ausführlicher beschrieben. Die VIADD-Anweisung, eine VIADDMNMX-Anweisung, eine VIMNMX3-Anweisung werden nachstehend in Verbindung mit 7 ausführlicher beschrieben. Die VIMNMX-Anweisung wird nachstehend ausführlich in Verbindung mit 8 beschrieben.
  • In denselben oder anderen Ausführungsformen sind die SW-Anweisung, die VIADD-Anweisung, die VIADDMNMX-Anweisung, die VIMNMX3-Anweisung, die VIMNMX-Anweisung oder eine beliebige Kombination davon mit Thread-Berechnungsmodi (nicht gezeigt) Kein-SIMD, Zwei-Wege-SIMD und Vier-Wege-SIMD assoziiert. Wie nachstehend ausführlicher beschrieben, berechnet in den Thread-Berechnungsmodi Kein-SIMD, Zwei-Wege-SIMD und Vier-Wege-SIMD jeder Thread Teilalignierungsbewertungen für jeweils ein, zwei oder vier lokale Alignierungsprobleme. In denselben oder anderen Ausführungsformen beinhalten eine oder mehrere SW-Bibliotheken in dem Programmierplattform-Softwarestapel 160 ohne Einschränkung p umgeschriebenen Code, Kernel, Subroutinen, intrinsische Funktionen, Makros, Klassen, Werte, Typspezifikationen usw., die die Verwendung einer oder mehrerer spezialisierter Anweisungen erleichtern.
  • In einigen Ausführungsformen berechnet die SW-Anweisung SW-Teilalignierungsdaten für einen einzigen Thread. Der SM 310 kann die SW-Anweisung auf jede technisch machbare Weise implementieren. In einigen Ausführungsformen ist die SW-Anweisung eine native Anweisung, die direkt von dem SM 310 ausgeführt wird. In denselben oder anderen Ausführungsformen wird die SW-Anweisung in einer Ganzzahl-Pipeline ausgeführt. Die SW-Anweisung ist nachstehend ausführlicher in Verbindung mit 5 beschrieben.
  • Zu Erläuterungszwecken beschreiben die 4-16 den SW-Kernel 192, spezialisierte Anweisungen, Makros, intrinsische Funktionen usw. für Thread-Berechnungsmodi (nicht gezeigt) Kein-SIMD, Zwei-Wege-SIMD und Vier-Wege-SIMD. Wie nachstehend ausführlicher beschrieben, berechnet in den Thread-Berechnungsmodi Kein-SIMD, Zwei-Wege-SIMD und Vier-Wege-SIMD jeder Thread Teilalignierungsbewertungen für jeweils ein, zwei oder vier lokale Alignierungsprobleme über ein oder mehrere zugewiesenen Spalten einer Bewertungsmatrix. In einigen anderen Ausführungsformen können die hierin beschriebenen Techniken modifiziert werden, um SW-Kernel, spezialisierte Anweisungen, Makros, intrinsische Funktionen usw. zu implementieren, die beliebige Teile (einschließlich aller) einer beliebigen Anzahl lokaler Alignierungsprobleme jedem Thread in einer technisch machbaren Weise zuweisen.
  • Verschachteln von Teilalignierungsdaten zum Reduzieren von Datenbewegungen
  • 4 ist eine beispielhafte Veranschaulichung von SW-Daten 402(0), die mit dem SW-Kernel 192 der 1 assoziiert sind, gemäß verschiedenen Ausführungsformen. Genauer gesagt veranschaulichen die SW-Daten 402(0) ohne Einschränkung Daten, die mit einem einzigen Thread assoziiert sind, der den SW-Kernel 192 und eine (M+1)×(N+1)-Bewertungsmatrix, die maximal M Zielsymbolen und N Abfragesymbolen entspricht, ausführt, wobei M und N eine beliebige positive Ganzzahl sein können. In einigen Ausführungsformen, einschließlich der in 4 abgebildeten Ausführungsform, sind die SW-Daten 402(0) für ein Bewertungsmatrix-Durchquerungsmuster optimiert, in dem jeder Thread Teilalignierungsdaten für einen zugewiesenen Satz von Spalten für jede Zeile j berechnet, bevor Teilalignierungsdaten für den zugewiesenen Satz von Spalten für die Zeile j+1 berechnet werden, wobei j eine Ganzzahl von 1 bis M ist.
  • Wie gezeigt, beinhalten die SW-Daten 402(0) in einigen Ausführungsformen ohne Einschränkung Problemkonfigurationsdaten 410, SW-Eingabedaten 430, ein verschachteltes Zellenlayout 450(0), einen Matrix-Fülldatensatz 490(0) und einen Ergebnisdatensatz 492(0). Falls, wie über ein gestricheltes Kästchen abgebildet, der Thread-Berechnungsmodus Zwei-Wege-SIMD oder Vier-Wege-SIMD ist, beinhalten die SW-Daten 402(0) ferner ohne Einschränkung einen Ergebnisdatensatz 492(1). Falls, wie über zwei gepunktete Kästchen abgebildet, das Thread-Berechnungsmodell ein Vier-Wege-SIMD ist, beinhalten die SW-Daten 402(0) ferner ohne Einschränkung einen Ergebnisdatensatz 492(3) und einen Ergebnisdatensatz 492(3).
  • Die Problemkonfigurationsdaten 410 beinhalten ohne Einschränkung eine beliebige Menge und/oder beliebige Typen von Daten, die verwendet werden können, um die Anzahl lokaler Sequenzalignierungsprobleme, die Spalten der Bewertungsmatrix, die jedem Thread zugewiesen sind, den Datentyp und/oder das Datenformat der E-Werte, der H-Werte, der Teilalignierungswerte und der Substitutionswerte oder einer beliebigen Kombination davon zu bestimmen. Jeder Thread kann die Problemkonfigurationsdaten 410 auf jede technisch machbare Weise bestimmen. In einigen Ausführungsformen ruft jeder Thread die Problemkonfigurationsdaten 410 nach Bedarf basierend auf eingebauten Variablen oder Merkmalen von Variablen ab oder leitet sie ab. In denselben oder anderen Ausführungsformen speichert jeder Thread einen beliebigen Teil (einschließlich aller) der Problemkonfigurationsdaten 410 in einer Registerdatei. Wie gezeigt, beinhalten die Problemkonfigurationsdaten 410 in einigen Ausführungsformen ohne Einschränkung Probleme pro Thread 412 und Spalten pro Thread 414.
  • Für jeden Thread spezifizieren die Probleme pro Thread 412 die Anzahl lokaler Alignierungsprobleme, für die der Thread mindestens einen Teil der Teilalignierungsbewertungen berechnet. Wie kursiv abgebildet, werden in einigen Ausführungsformen die Probleme pro Thread 412 als P bezeichnet und sind gleich 1, 2 oder 4. Falls die Probleme pro Thread 412 1 sind, berechnet jeder Thread mindestens einen Teil der Teilalignierungsbewertungen für ein lokales Alignierungsproblem. Falls jedoch die Probleme pro Thread 412 2 sind, berechnet jeder Thread mindestens einen Teil der Teilalignierungsbewertungen für zwei lokale Alignierungsprobleme. Und falls die Probleme pro Thread 412 4 sind, berechnet jeder Thread mindestens einen Teil der Teilalignierungsbewertungen für vier lokale Alignierungsprobleme. Dementsprechend entsprechen die Probleme 1, 2 und 4 pro Thread 412 den Thread-Berechnungsmodi Kein-SIMD, Zwei-Wege-SIMD bzw. Vier-Wege-SIMD.
  • In einigen Ausführungsformen stellt jede von einer oder mehreren Bewertungsmatrizen Teilalignierungsdaten für einen unterschiedlichen Satz von P lokalen Alignierungsproblemen dar. Falls die Probleme pro Thread 412 1 sind, ist jede Bewertungsmatrix mit einem einzigen lokalen Alignierungsproblem assoziiert. Falls jedoch die Probleme pro Thread 412 2 sind, ist mit jeder Bewertungsmatrix ein unterschiedlicher Satz von zwei lokalen Alignierungsproblemen assoziiert. Und falls die Probleme pro Thread 412 4 sind, ist jede Bewertungsmatrix mit einem unterschiedlichen Satz von vier lokalen Alignierungsproblemen assoziiert.
  • In einigen Ausführungsformen spezifizieren die Spalten pro Thread 414, die hierin als C bezeichnet sind, für jeden Thread die Anzahl der Spalten einer entsprechenden Bewertungsmatrix, die dem Thread zugewiesen ist. Beispielsweise werden in einigen Ausführungsformen die Spalten einer Bewertungsmatrix gleichmäßig auf 16 Threads aufgeteilt, und die Spalten pro Thread 414 sind gleich N / 16, wobei N die Gesamtzahl von Symbolen ist, die in der längsten Abfragesequenz beinhaltet ist.
  • Die SW-Eingabedaten 430 beinhalten ohne Einschränkung eine beliebige Menge und/oder beliebige Typen von Daten, die zur Berechnung von Teilalignierungswerten verwendet werden können. In einigen Ausführungsformen beinhalten die SW-Eingabedaten 430 ohne Einschränkung eine als T0 bezeichnete Zielsequenz 432(0), eine als Q0 bezeichnete Abfragesequenz 434(0), Lückenkonstanten 442 und eine Substitutionsmatrix 444. Falls, wie über zwei gestrichelte Kästchen abgebildet, der Thread-Berechnungsmodus Zwei-Wege-SIMD oder Vier-Wege-SIMD ist, beinhalten die SW-Eingabedaten 430 ferner ohne Einschränkung eine Zielsequenz 432(1), die als T1 bezeichnet ist, und eine Abfragesequenz 434 (1), die als Q1 bezeichnet ist. Falls, wie über zwei gepunktete Kästchen abgebildet, der Thread-Berechnungsmodus Vier-Wege-SIMD ist, beinhalten die SW-Eingabedaten 430 ferner ohne Einschränkung eine Zielsequenz 432(2), eine Abfragesequenz 434(2), eine Zielsequenz 432 (3) und eine jeweils als T2, Q2, T3 bzw. Q3 bezeichnete Abfragesequenz 434(3).
  • In einigen Ausführungsformen beinhaltet jede Zielsequenz in den SW-Eingabedaten 430 ohne Einschränkung M Symbole oder eine Sequenz von weniger als M Symbolen, die mit Dummy-Symbolen auf eine Länge von M aufgefüllt wird. In denselben oder anderen Ausführungsformen beinhaltet jede Abfragesequenz, die in den SW-Eingabedaten 430 beinhaltet ist, ohne Einschränkung N Symbole oder eine Sequenz von weniger als N Symbolen, die mit Dummy-Symbolen auf eine Länge von N aufgefüllt wird.
  • Wie gezeigt, beinhalten in einigen Ausführungsformen die Lückenkonstanten 442 (als „consts“ bezeichnet) ohne Einschränkung GapDeleteOpen, GapDeleteExtend, GaplnsertOpen und GaplnsertExtend, die jeweils als gdo, gde, gio und gie bezeichnet werden. In denselben oder anderen Ausführungsformen beinhaltet die Substitutionsmatrix 444 ohne Einschränkung Substitutionswerte für jede mögliche Kombination der Symbole, die in der/den Zielsequenz(en) und der/den Abfragesequenz(en) beinhaltet sein können. Beispielsweise sind in einigen Ausführungsformen die Zielsequenzen und die Abfragesequenzen DNA-Sequenzen, in denen jedes Symbol einer von vier Typen von Nukleotiden (A, G, C und T) ist, und die Substitutionsmatrix 444 ist eine 4x4-Matrix, die einen Wert für Matrixelemente spezifiziert, die demselben Symbol entsprechen, und einen anderen Wert für Matrixelemente, die unterschiedlichen Symbolen entsprechen.
  • In einigen anderen Ausführungsformen sind die Zielsequenzen und die Abfragesequenzen Proteinsequenzen, in denen jedes Symbol eine von 20 Typen von Aminosäuren ist, und die Substitutionsmatrix 444 ist eine 20x20-Matrix, die den gleichen Wert für Matrixelemente spezifiziert, die dem gleichen Symbol entsprechen, und unterschiedliche Werte für die restlichen Matrixelemente. In denselben oder anderen Ausführungsformen können die SW-Eingabedaten 430 ohne Einschränkung P unterschiedliche Sätze von Lückenkonstanten beinhalten und/oder P unterschiedliche Substitutionsmatrizen beinhalten, die P unterschiedlichen lokalen Alignierungsproblemen entsprechen, und die hierin beschriebenen Techniken werden entsprechend modifiziert.
  • In einigen Ausführungsformen beinhaltet jeder Ergebnisdatensatz (z. B. der Ergebnisdatensatz 492(0), der Ergebnisdatensatz 492(1), der Ergebnisdatensatz 492(2) und der Ergebnisdatensatz 492(3) ohne Einschränkung eine beliebige Anzahl und/oder Typen von Variablen, die die Berechnung einer maximalen Teilalignierungsbewertung (in 4 nicht gezeigt) und einer maximalen Bewertungsposition (in 4 nicht gezeigt) für das entsprechende lokale Alignierungsproblem ermöglichen. In denselben oder anderen Ausführungsformen kooperieren die Threads, die jedem lokalen Alignierungsproblem zugewiesen sind, über Ergebnisdatensätze auf jede technisch machbare Weise, um inkrementell die maximale Teilalignierungsbewertung und die maximale Bewertungsposition für das lokale Alignierungsproblem zu berechnen.
  • Beispielsweise beinhaltet in einigen Ausführungsformen der Ergebnisdatensatz 492, der mit dem höchsten Thread assoziiert ist, der jedem lokalen Alignierungsproblem zugewiesen ist, ohne Einschränkung Variablen für die maximale Teilalignierungsbewertung des lokalen Alignierungsproblems und die entsprechende maximale Bewertungsposition (z. B. Zeilenindex und Spaltenindex). In denselben oder anderen Ausführungsformen beinhaltet jeder der anderen Ergebnisdatensätze 492 ohne Einschränkung Variablen für eine maximale Zeilenteilalignierungsbewertung und die entsprechende maximale Spalte innerhalb der Zeile.
  • In einigen Ausführungsformen werden die Zielsequenzen und die Abfragesequenzen in dem globalen Speicher gespeichert. In denselben oder anderen Ausführungsformen kopiert jeder Thread mindestens die zugewiesenen Teile jeder zugewiesenen Abfrage in ein Array, das sich in einer Registerdatei befindet, und kopiert wiederholt einen Teil (z. B. zwei Symbole) jeder zugewiesenen Zielsequenz nach Bedarf aus dem globalen Speicher zu Variablen oder einem Array, die sich in der Registerdatei befinden. In einigen Ausführungsformen werden die Abstandskonstanten 442 in einem Konstantenspeicher gespeichert. In denselben oder anderen Ausführungsformen werden der/die Ergebnisdatensatz/Ergebnisdatensätze 492 in einer Registerdatei gespeichert.
  • Wie gezeigt, speichert jeder Thread in einigen Ausführungsformen vorübergehend Teilalignierungsdaten (z. B. E-Werte, F-Werte, Substitutionswerte und Teilalignierungswerte) in einer Registerdatei basierend auf dem verschachtelten Zellenlayout 450(0). Das verschachtelte Zellenlayout 450(0) ermöglicht es dem Thread, abhängige Teilalignierungsdaten zu berechnen, ohne irgendwelche Datenverschiebungsoperationen durchzuführen. Statt E-Werte, F-Werte, Substitutionswerte und Sub-Alignierungswerte in separaten Matrizen in dem gemeinsam genutzten Speicher zu speichern, speichert in einigen Ausführungsformen jeder Thread vorübergehend E-Werte, F-Werte, Substitutionswerte und Sub-Alignierungswerte für (C+1) Spalten einer vorherigen Zeile und (C+1) Spalten einer aktuellen Zeile in höchstens zwei Arrays von SWcells 460, die sich an einer aneinandergrenzenden Speicherstelle in einer Registerdatei oder einem Speicher befinden. Falls in denselben oder anderen Ausführungsformen der Thread-Berechnungs-SIMD-Modus Zwei-Wege-SIMD oder Vier-Wege-SIMD ist, packt jeder Thread zwei Werte bzw. vier Werte in dieselbe Anzahl von Bits, die verwendet werden, um einen einzigen Wert darzustellen, wenn der Thread-Berechnungs-SIMD-Modus Kein-SIMD ist.
  • Wie gezeigt, ist jede SWcell 460 eine SWcell32 462, wenn der Thread-Berechnungs-SIMD-Modus Kein-SIMD ist. In einigen Ausführungsformen speichert jede SWcell32 462 ohne Einschränkung vier 32-Bit-Werte, die einem einzigen lokalen Alignierungsproblem entsprechen. In denselben oder anderen Ausführungsformen speichert die SWcell32 462 einen 32-Bit-E-Wert über 32 Bits von E-Daten, einen 32-Bit-F-Wert über 32 Bits von F-Daten, einen 32-Bit-Substitutionswert über 32 Bits von Substitutionsdaten, und eine 32-Bit-Teilalignierungsbewertung über 32 Bits von Teilalignierungsbewertungsdaten. Wie zuvor hierin beschrieben, entspricht die SWcell32 462(j, k) aufgrund der Offsets in der Bewertungsmatrix, die von der Anfangszeile und der Anfangsspalte eingeführt werden, Teilsequenzen, die in den Symbolen T0(j-1) und Q0(k-1) enden.
  • In einigen Ausführungsformen beinhaltet die SWcell32 462(j, k) ohne Einschränkung die Teilalignierungsbewertung H(j, k), E(j, k), F(j, k) und den Substitutionswert für das Symbol T(j+1) und das Symbol Q(k+1), das als S(j+1, k+1) bezeichnet wird. In einigen anderen Ausführungsformen kann die Reihenfolge von H(j, k), E(j, k), F(j, k) und S(j+1, k+1) innerhalb der SWcell32(j, k) variieren. In denselben oder anderen Ausführungsformen kann die SWcell32(j, k) S(j, k) statt S(j+1, k+1) speichern oder S(j+1, k+1) weglassen.
  • Wie gezeigt, ist jede SWcell 460 eine SWcell16 464, wenn der Thread-Berechnungs-SIMD-Modus ein Zwei-Wege-SIMD ist. In einigen Ausführungsformen speichert jede SWcell16 464 ohne Einschränkung acht 16-Bit-Werte, die zwei lokalen Alignierungsproblemen entsprechen. In denselben oder anderen Ausführungsformen speichert die SWcell16 464 zwei 16-Bit-E-Werte über 32 Bits von E-Daten, zwei 16-Bit-F-Werte über 32 Bits von F-Daten, zwei 16-Bit-Substitutionswerte über 32 Bits von Substitutionsdaten, und zwei 16-Bit-Teilalignierungsbewertungen über 32 Bits von Teilalignierungsbewertungsdaten. Die SWcell16 464(j, k) entspricht Teilsequenzen, die in den Symbolen T0(j-1), Q0(k-1), T1(j-1) und Q1(j-1) enden.
  • In einigen Ausführungsformen beinhaltet die SWcell16 464(j, k) ohne Einschränkung H0(j, k), H1(j, k), E0(j, k), E1(j, k), F0(j, k).), F1(j,k), S0(j+1, k+1) und S1(j+1, k+1). In denselben oder anderen Ausführungsformen werden H0(j, k) und H1 (j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als H(j, k) zugegriffen werden kann. In einigen Ausführungsformen werden E0(j, k) und E1(j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als E(j, k) zugegriffen werden kann. F0(j,k). In einigen Ausführungsformen werden F0(j, k) und F1(j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als F(j, k) zugegriffen werden kann. In einigen Ausführungsformen werden S0(j+1, k+1) und S1 (j+1, k+1) in einen einzigen 32-Bit-Wert gepackt, auf den als S(j, k) zugegriffen werden kann. In einigen anderen Ausführungsformen kann die Reihenfolge der 32-Bit-Werte H(j, k), E(j, k), F(j,k) und S(j+1, k+1) innerhalb der SWcell16 464(j, k) variieren. In denselben oder anderen Ausführungsformen ist die Reihenfolge von H0(j, k) und H1(j, k) innerhalb von H(j, k); E0(j, k) und E1(j, k) innerhalb von E(j, k); F0(j, k) und F1 (j, k) innerhalb von F(j, k); S0(j+1, k+1) und S1 (j+1, k+1) innerhalb S(j+1, k+1); oder jede Kombination davon kann ausgetauscht werden.
  • Wie gezeigt, ist jede SWcell 460 eine SWcell8 466, wenn der Thread-Berechnungs-SIMD-Modus ein Vier-Wege-SIMD ist. In einigen Ausführungsformen speichert jede SWcell8 466 ohne Einschränkung sechzehn 8-Bit-Werte, die vier lokalen Alignierungsproblemen entsprechen. In denselben oder anderen Ausführungsformen speichert die SWcell16 464 vier 8-Bit-E-Werte über 32 Bits von E-Daten, vier 8-Bit-F-Werte über 32 Bits von F-Daten, vier 8-Bit-Substitutionswerte über 32 Bits von Substitutionsdaten, und vier 8-Bit-Teilalignierungsberechnungen über 32 Bits von Teilalignierungsbewertungdaten. Die SWcell8 466 entspricht Teilsequenzen, die in den Symbolen T0(j-1), Q0(k-1), T1(j-1), Q1(j-1), T2(j-1), Q2(k-1), T3(j-1), und Q3(j-1) enden.
  • In einigen Ausführungsformen beinhaltet die SWcell8 466(j, k) ohne Einschränkung H0(j, k), H1(j, k), H2(j, k), H3(j, k), E0(j, k), E1(j, k), E2(j, k), E3(j, k), F0(j, k), F1 (j, k), F2(j, k), F3(j, k), S0(j+1, k+1), S1(j+1, k+1), S2(j+1, k+1) und S3(j+1, k+1). In denselben oder anderen Ausführungsformen werden H0(j, k), H1 (j, k), H2(j, k) und H3(j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als H(j, k) zugegriffen werden kann. In einigen Ausführungsformen werden E0(j, k), E1 (j, k), E(j, k) und E3(j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als E(j, k) zugegriffen werden kann. F0(j,k). In einigen Ausführungsformen werden F0(j, k) und F1 (j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als F(j, k) zugegriffen werden kann. In einigen Ausführungsformen werden S0(j+1, k+1) und S1(j+1, k+1) in einen einzigen 32-Bit-Wert gepackt, auf den als S(j, k) zugegriffen werden kann. In einigen anderen Ausführungsformen kann die Reihenfolge der 32-Bit-Werte H(j, k), E(j, k), F(j, k) und S(j+1, k+1) innerhalb der SWcell8 466(j, k) variieren. In denselben oder anderen Ausführungsformen ist die Reihenfolge von H0(j, k), H1 (j, k), H2(j, k) und H3(j, k) innerhalb von H0(j, k); E0(j, k), E1 (j, k), E2(j, k) und E3(j, k) innerhalb von E(j, k); F0(j, k), F1(j, k), F2(j, k) und F3(j, k) innerhalb von F(j, k); S0(j+1, k+1) S1(j+1, k+1), S2(j+1, k+1) und S3(j+1, k+1) innerhalb von S(j+1, k+1); oder jede Kombination davon geändert werden kann.
  • In einigen Ausführungsformen beinhalten der SW-Kernel 192 und/oder eine oder mehrere SW-Bibliotheken, die in dem Softwarestapel 160 der Programmierplattform der 1 beinhaltet sind, ohne Einschränkung eine oder mehrere Abbildungen, die das Schreiben von Daten in die und das Lesen von Daten aus der SWcell 460, der SWcell32 462, der SWcell16 464 und der SWcell8 462 erleichtern. Beispielsweise beinhalten in einigen Ausführungsformen der SW-Kernel 192 und/oder eine oder mehrere SW-Bibliotheken die folgenden Typdefinitionen (2):
         typedef union SWcell { (2)
            typedef struct SWcell32 {
              int32_t H; int32_t E; int32_t F; int32_t S;
            } SWcell32_t;
            typedef struct SWcell16 {
              int16_t H0; int16_t H1; int16_t E0; int16_t E1;
              int16_t F0; int16_t F1; int16_t S0; int16_t S1;
            } SWcell 16_t;
            typedef struct SWcell8 {
              int8_t H0; int8_t H1; int8_t H2; int8_t H3;
              int8_t E0; int8_t E1; int8_t E2; int8_t E3;
              int8_t F0; int8_t F1; int8_t F2; int8_t F3;
              int8_t S0; int8_t S1; int8_t S2; int8_t S3;
            } SWcell8_t;
            SWcell32_t c32; 





            SWcell16_t c16;
            SWcell8_t c8;
            uint32_t data[4];
         } SWcell_t;
  • In denselben oder anderen Ausführungsformen beinhalten der SW-Kernel 192 und/oder eine oder mehrere SW-Bibliotheken, die in dem Softwarestapel 160 der Programmierplattform aus 1 beinhaltet sind, ohne Einschränkung eine oder mehrere Abbildungen, die Kein-SIMD-, 2-Wege-SIMD- und 4-Wege-SIMD-Operationen mit den Lückenkonstanten 442 erleichtern. Beispielsweise beinhalten in einigen Ausführungsformen der SW-Kernel 192 und/oder eine oder mehrere SW-Bibliotheken die folgenden Typdefinitionen (3):
  •          typedef struct sw constants_simd_1 { (3)
                int32_t gde; int32_t gdo; int32_t gie; int32_t gio;
             } sw_constants_simd_1_t;
             typedef union sw_constants_simd_2 {
                typedef struct constants_32 {
                int32_t gde; int32_t gdo; int32_t gie; int32_t gio;
                } constants_32_t;
                typedef struct constants_16 {
                  int16_t gde0; int16_t gde1; int16_t gdo0; int16_t gdo1;
                  int16_t gie0; int16_t gie1; int16_t gio0; int16_t gio1;
                } constants_16_t;
                constants_32_t c32;
                constants_16_t c6;
             } sw_constants_simd_2_t;
             typedef union sw_constants_simd_4 {
                typedef struct constants_32 {
                  int32_t gde; int32_t gdo; int32_t gie; int32_t gio;
                } constants_32_t;
                typedef struct constants_16 {
                  int16_t gde0; int16_t gde1; int16_t gdo0; int16_t gdo1; 
    
    
    
    
    
                  int16_t gie0; int16_t gie1; int16_t gio0; int16_t gio1;
                } constants_16_t;
                typedef struct constants_8 {
                  Int8_t gde0; int8_t gde1; int8_t gde0; int8_t gde1;
                  int8_t gdo0; int8_t gdo1; int8_t gdo0; int8_t gdo1;
                  int8_t gie0; int8_t gie1; int8_t gie0; int8_t gie1;
                  int8_t gio0; int8_t gio1; int8_t gio0; int8_t gio1;
                } constants_8_t;
                constants_32_t c32;
                constants_16_t c16;
                constants_8_t c8;
             } sw_constants_simd_4_t;
  • In einigen Ausführungsformen speichert jeder Thread die Informationen, die zum Berechnen der Teilalignierungsdaten erforderlich sind, die den zugewiesenen Spalten der Bewertungsmatrix entsprechen, über den Matrix-Fülldatensatz 490(0), den der Thread für jede Zeile 0 <= j < M wiederverwendet. Unter erneuter Bezugnahme auf die Gleichungen (1 a)-(1 c) in Verbindung mit den Pfeilen, die dem Matrix-Fülldatensatz 490(0) überlagert sind, hängt H(j, k), das in der SWcell 460(j, k) gespeichert ist, von H(j-1, k-1) und S(j, k), die in der SWcell 460(j-1, k-1) gespeichert sind, E(j-1, k) und H(j-1, k), die in der SWcell 460(j-1, k) gespeichert sind, und F(j, k-1) und H(j, k-1), die in der SWcell 460(j, k-1) gespeichert sind, ab.
  • Nur zu Erläuterungszwecken entspricht der Matrix-Fülldatensatz 490(0), der in 4 abgebildet ist, einem Thread 0, der Teilalignierungsdaten für die Spalten 1-C der Bewertungsmatrix berechnet, die jeweils den Abfragesymbolen Q*(0)-Q*(C-1) entsprechen. Zu Erläuterungszwecken bezeichnet für die Thread-Berechnungs-SIMD-Modi Kein-SIMD, Zwei-Wege-SIMD und Vier-Wege-SIMD, Q* Q0, Q0-Q1 bzw. Q0-Q3 und T* bezeichnet jeweils T0, T0-T1 bzw. TO-T3. Wie gezeigt, beinhaltet der Matrix-Fülldatensatz 490(0) in einigen Ausführungsformen ohne Einschränkung zwei Arrays von (C+1) SWcells 460, die sich in aufeinanderfolgenden Registerstellen oder aufeinanderfolgenden Speicherstellen befinden. Ein Array entspricht dem/den Zielsymbol(en) T*(j-1) und beinhaltet ohne Einschränkung eine SWcell 460(0, 0), die in einer Anfangsspalte beinhaltet ist, und SWcells 460(0, 1)-460(0, C), die jeweils den Abfragesymbolen Q*(0)-Q*(C-1) entsprechen. Das andere Array entspricht dem/den Zielsymbol(en) T*(j) und beinhaltet ohne Einschränkung eine SWcell 460(1, 0), die in der Anfangsspalte beinhaltet ist, und SWcells 460(1, 1)-460(1, C), die jeweils den Abfragesymbolen Q*(0)-Q*(C-1) entsprechen.
  • Obwohl dies nicht gezeigt ist, hält in einigen Ausführungsformen jeder Thread eine „aktuelle Zeile“-Registervariable, die auf das Array von SWcells 460 zeigt, das der aktuellen Zeile entspricht, und eine „vorherige Zeile“-Registervariable, die auf das Array von SWcells 460 zeigt, das der vorherigen Zeile entspricht. Nach dem Berechnen der Teilalignierungsdaten für die aktuelle Zeile aktualisiert der Thread die Registervariable der aktuellen Zeile und die Registervariable der vorherigen Zeile derart, dass die Registervariable der vorherigen Zeile auf das Array von SWcells 460 zeigt, auf das zuvor von dem aktuellen Zeilenregister gezeigt wurde, und die Variable des aktuellen Zeilenregisters auf das Array von SWcells 460 zeigt, auf das zuvor von dem vorherigen Zeilenregister gezeigt wurde. Der Thread kann die Bezeichnungen der aktuellen Zeile und der vorherigen Zeile auf jede technisch machbare Weise austauschen.
  • Um in einigen Ausführungsformen die Bezeichnungen der aktuellen Zeile und der vorherigen Zeile gegen die Zeilen 1 bis M der Bewertungsmatrix auszutauschen, die den Zielsymbolen T*(0) bis T*(M-1) entsprechen, implementiert SW-Kernel 192 den folgenden Pseudocode (4):
  •          // temporary storage for the matrix-filling dataset 490(0)
     (4)
             SWcell_t cells[2, N+1]
             // initialize top row and left entry of next row to 0
             memset(cells[0], 0, sizeof(SWcell_t)*(N+1));
             memset(cells[1], 0, sizeof(SWcell_t));
             für (uint32_t row = 1; row <= M; ++row) {
               const uint32_t prevlD = (row % 2) == 0 ? 1 : 0;
               const uint32_t currentID = row % 2;
               ...
             }
  • Zu beachten ist in Bezug auf den Pseudocode (4), dass jede gerade Zeile (einschließlich der Initialisierungszeile) der Bewertungsmatrix von dem Array von Zellen dargestellt wird, das bei der als bezeichneten Anfangszelle cells[0, 0] startet. In denselben oder anderen Ausführungsformen wird jede ungerade Zeile der Bewertungsmatrix von dem Array von Zellen dargestellt, das bei der Anfangszelle beginnt, die als cells[1, 0] bezeichnet ist.
  • Da jeder Thread Teilalignierungsdaten für die aktuelle Zeile von links nach rechts berechnet, werden die Abhängigkeiten von H(j, k) vorteilhafterweise automatisch über den Matrix-Fülldatensatz 490(0) und die Technik des Austauschs aktueller Zeilen/vorheriger Zeilen erfüllt, ohne Speicherbewegungsanweisungen auszuführen.
  • 5 ist eine beispielhafte Veranschaulichung von SW-Daten 402(1), die gemäß anderen verschiedenen Ausführungsformen mit dem SW-Kernel 192 der 1 assoziiert sind. Genauer gesagt veranschaulichen die SW-Daten 402(1) ohne Einschränkung Daten, die mit einem einzigen Thread assoziiert sind, der den SW-Kernel 192 ausführt, und eine (M+1)x(N+1)-Bewertungsmatrix, die einem Maximum von M Zielsymbolen und N Abfragesymbolen entspricht, wobei M und N eine beliebige positive Ganzzahl sein können. In einigen Ausführungsformen, einschließlich der in 5 abgebildeten Ausführungsform, sind die SW-Daten 402(1) für ein Bewertungsmatrix-Durchquerungsmuster optimiert, in dem jeder Thread Teilalignierungsdaten für einen zugewiesenen Satz von Spalten für eine Zeile j berechnet, bevor Teilalignierungsdaten für den zugewiesenen Satz von Spalten für die Zeile j+1 berechnet werden, wobei j eine Ganzzahl von 1 bis M ist.
  • Wie gezeigt, beinhalten die SW-Daten 402(1) in einigen Ausführungsformen ohne Einschränkung die Problemkonfigurationsdaten 410, die SW-Eingabedaten 430, ein verschachteltes Zellenlayout 450(1), einen Matrix-Fülldatensatz 490(1) und den Ergebnisdatensatz 492(0). Falls, wie über ein gestricheltes Kästchen abgebildet, der Thread-Berechnungsmodus Zwei-Wege-SIMD oder Vier-Wege-SIMD ist, beinhalten die SW-Daten 402(1) ferner ohne Einschränkung den Ergebnisdatensatz 492(1). Falls, wie über zwei gepunktete Kästchen abgebildet, das Thread-Berechnungsmodell ein Vier-Wege-SIMD ist, beinhalten die SW-Daten 402(1) ferner ohne Einschränkung den Ergebnisdatensatz 492(3) und den Ergebnisdatensatz 492(3).
  • In einigen Ausführungsformen sind die Problemkonfigurationsdaten 410, die SW-Eingabedaten 430 und die Ergebnisdatensätze 492(0)-492(3), die in den SW-Daten 402(1) beinhaltet sind, die gleichen wie die Problemkonfigurationsdaten 410, die SW-Eingabedaten 430 und die Ergebnisdatensätze 492(0)-492(3), die in den SW-Daten 402(0) beinhaltet sind und hierin zuvor in Verbindung mit 4 beschrieben sind. Im Vergleich zu dem verschachtelten Zellenlayout 450(0) und dem Matrix-Fülldatensatz 490(0), der in den SW-Daten 402(0) beinhaltet ist, wird die Speichermenge, die erforderlich ist, um das verschachtelte Zellenlayout 450(1) bzw. den Matrix-Fülldatensatz 490(1) zu speichern, die in den SW-Daten 402(1) beinhaltet sind, reduziert.
  • Wie gezeigt, speichert in einigen Ausführungsformen jeder Thread vorübergehend Teilalignierungsdaten (z. B. E-Werte, F-Werte, Substitutionswerte und Teilalignierungswerte) basierend auf dem verschachtelten Zellenlayout 450(1). Das verschachtelte Zellenlayout 450(1) ermöglicht es dem Thread, abhängige Teilalignierungsdaten zu berechnen, ohne irgendwelche Datenverschiebungsoperationen durchzuführen. In einigen Ausführungsformen speichert jeder Thread vorübergehend Teilalignierungsbewertungen und E-Werte für (C+1) Spalten einer vorherigen Zeile und (C+1) Spalten einer aktuellen Zeile in höchstens zwei Arrays von HEcells 560, die sich in aufeinanderfolgenden Register- oder Speicherstellen befinden. Jeder Thread speichert vorübergehend F-Werte für (C+1) Spalten einer aktuellen Zeile in einem Array von F-Strukturen 570, das sich in aufeinanderfolgenden Register- oder Speicherstellen befindet. In denselben oder anderen Ausführungsformen speichert jeder Thread aus Leistungsgründen vorübergehend Substitutionswerte für C Spalten der aktuellen Zeile in einem Array von S Strukturen 580, das sich in aufeinanderfolgenden Register- oder Speicherstellen befindet. In einigen anderen Ausführungsformen speichert jeder Thread vorübergehend einen einzigen Substitutionswert in einer einzigen Instanz der S-Struktur 580, die sich in einem Register oder Speicher befindet. Falls in einigen Ausführungsformen der Thread-Berechnungs-SIMD-Modus ein Zwei-Wege-SIMD oder ein Vier-Wege-SIMD ist, packt jeder Thread jeweils zwei Werte oder vier Werte in die gleiche Anzahl von Bits, die verwendet werden, um einen einzigen Wert darzustellen, wenn derThread-Berechnungs-SIMD-Modus Kein-Weg-SIMD ist.
  • Wenn, wie gezeigt, der Thread-Berechnungs-SIMD-Modus Kein-SIMD ist, ist jede HEcell 560 eine HEcell32 562, die zwei 32-Bit-Werte speichert, die einem einzigen lokalen Alignierungsproblemen entsprechen, jede F-Struktur 570 ist eine F32 572, die ein 32-Bit-F speichert, das demselben lokalen Alignierungsproblem entspricht, und jede S-Struktur 580 ist ein S32 582, der einen 32-Bit-S-Wert speichert, der demselben lokalen Alignierungsproblem entspricht. In denselben oder anderen Ausführungsformen speichert die HEcell32 562 einen 32-Bit-E-Wert über 32 Bits von E-Daten und eine 32-Bit-Teilalignierungsbewertung über 32 Bits von Teilalignierungsbewertungsdaten. Wie zuvor hierin beschrieben, entsprechen die HEcell32 562(j, k), die F32 572(k) und die S32 582(k) aufgrund der Offsets in der Bewertungsmatrix, die von der Anfangszelle und der Anfangsspalte eingeführt werden, Teilsequenzen, die in den Symbolen T0(j-1) und Q0(k-1) enden. In einigen Ausführungsformen beinhaltet die HEcell32 562(j, k) ohne Einschränkung die Teilalignierungsbewertung H(j, k), gefolgt von E(j, k). In einigen anderen Ausführungsformen beinhaltet die HEcell32 562(j, k) ohne Einschränkung E(j, k), gefolgt von der Teilalignierungsbewertung H(j, k).
  • Wenn, wie gezeigt, der Thread-Berechnungs-SIMD-Modus Zwei-Wege-SIMD ist, ist jede HEcell 560 eine HEcell16 564, die vier 16-Bit-Werte speichert, die zwei lokalen Alignierungsproblemen entsprechen, ist jede F-Struktur 570 eine F16x2 574, die zwei 16-Bit-F-Werte speichert, die zwei lokalen Alignierungsproblemen entsprechen, und ist jede S-Struktur 580 eine S16x2 584, die zwei 16-Bit-S-Werte speichert, die zwei lokalen Alignierungsproblemen entsprechen. In denselben oder anderen Ausführungsformen speichert die HEcell16 564 zwei 16-Bit-E-Werte über 32 Bits von E-Daten und zwei 16-Bit-Teilalignierungsbewertungen über 32 Bits von Teilalignierungsbewertungsdaten. Die HEcell16 564(j, k), die F16x2 574(k) und die S16x2 584(k) entsprechen Teilsequenzen, die in den Symbolen T0(j-1), Q0(k-1), T1 (j-1), and Q1 (k-1) enden.
  • In einigen Ausführungsformen beinhaltet die HEcell16 564(j, k) ohne Einschränkung H0(j, k), H1(j, k), E0(j, k) und E1 (j, k). In denselben oder anderen Ausführungsformen werden H0(j, k) und H1(j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als H(j, k) zugegriffen werden kann. In einigen Ausführungsformen werden E0(j, k) und E1(j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als E(j, k) zugegriffen werden kann. In einigen anderen Ausführungsformen kann die Reihenfolge der 32-Bit-Werte H(j, k) und E(j, k) innerhalb der HEcell16 564(j, k) variieren. In denselben oder anderen Ausführungsformen kann die Reihenfolge von H0(j, k) und H1 (j, k) innerhalb von H(j, k), E0(j, k) und E1 (j, k) innerhalb von E(j, k), oder eine beliebige Kombination davon ausgetauscht werden.
  • Wenn, wie gezeigt, der Thread-Berechnungs-SIMD-Modus ein Vier-Wege-SIMD ist, ist jede HEcell 560 eine HEcell8 566, die acht 8-Bit-Werte speichert, die vier lokalen Alignierungsproblemen entsprechen, ist jede F-Struktur 570 eine F8x4 576, die vier 8-Bit-F-Werte speichert, die vier lokalen Alignierungsproblemen entsprechen, und ist jede S-Struktur 580 eine S8x4 586, die vier 8-Bit-S-Werte speichert, die vier lokalen Alignierungsproblemen entsprechen. In denselben oder anderen Ausführungsformen speichert die HEcell8 566 vier 8-Bit-E-Werte über 32 Bits von E-Daten und vier 8-Bit-Teilalignierungsbewertungen über 32 Bits von Teilalignierungsbewertungsdaten. Die HEcell8 566(j, k), die F8x4 576(k) und die S8x4 586(k) entsprechen Teilsequenzen, die in den Symbolen T0(j-1), Q0(k-1), T1 (j-1), Q1 (k-1 ),T2(j-1 ), Q2(k-1), T3(j-1) und Q3(k-1) enden.
  • In einigen Ausführungsformen beinhaltet die HEcell8 566(j, k) ohne Einschränkung H0(j, k), H1(j, k), H2(j, k), H3(j, k), E0(j, k), E1(j, k), E2(j, k) und E3(j, k). In denselben oder anderen Ausführungsformen werden H0(j, k), H1(j, k), H2(j, k) und H3(j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als H(j, k) zugegriffen werden kann. In einigen Ausführungsformen werden E0(j, k), E1 (j, k), E(j, k) und E3(j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als E(j, k) zugegriffen werden kann. F0(j,k). In einigen Ausführungsformen werden F0(j, k) und F1(j, k) in einen einzigen 32-Bit-Wert gepackt, auf den als F(j, k) zugegriffen werden kann. In einigen Ausführungsformen ist die Reihenfolge von H0(j, k), H1(j, k), H2(j, k) und H3(j, k) innerhalb von H0(j, k); und E0(j, k), E1(j, k), E2(j, k) und E3(j, k) innerhalb von E(j, k); oder jede Kombination davon geändert werden kann.
  • In einigen Ausführungsformen beinhalten der SW-Kernel 192 und/oder eine oder mehrere SW-Bibliotheken, die in dem Programmierplattform-Softwarestapel 160 der 1 beinhaltet sind, ohne Einschränkung eine oder mehrere Abbildungen, die das Schreiben von Daten in die und das Lesen von Daten aus der HEcell 560, der HEcell32 562, der HEcell16 564 und der HEcell8 566 erleichtern. In denselben oder anderen Ausführungsformen beinhalten der SW-Kernel 192 und/oder eine oder mehrere SW-Bibliotheken, die in dem Softwarestapel 160 der Programmierplattform aus 1 beinhaltet sind, ohne Einschränkung eine oder mehrere Abbildungen, die Kein-SIMD-, 2-Wege-SIMD- und 4-Wege-SIMD-Operationen mit den Lückenkonstanten 442 erleichtern. Beispielsweise beinhalten in einigen Ausführungsformen der SW-Kernel 192 und/oder eine oder mehrere SW-Bibliotheken die zuvor hierin in Verbindung mit 4 beschriebenen Typdefinitionen (3).
  • In einigen Ausführungsformen speichert jeder Thread die Informationen, die zum Berechnen der Teilalignierungsdaten erforderlich sind, die den zugewiesenen Spalten der Bewertungsmatrix entsprechen, über einen Matrix-Fülldatensatz 490(1), den der Thread für jede Zeile 0 <= j < M wiederverwendet. Unter erneuter Bezugnahme auf die Gleichungen (1 a)-(1 c) in Verbindung mit den Pfeilen, die dem Matrix-Fülldatensatz 490(1) überlagert sind, hängt H(j, k), das in der HEcell 560(j, k) gespeichert ist, von H(j-1, k-1), das in der HEcell 560(j-1, k-1) gespeichert ist, E(j-1, k) und H(j-1, k), die in der HEcell 560(j-1, k-1) gespeichert sind, H(j, k-1), das in der HEcell 560(j-1, k-1) gespeichert ist, S(j, k), und F(j, k-1), ab.
  • Nur zu Erläuterungszwecken entspricht der Matrix-Fülldatensatz 490(1), der in 5 abgebildet ist, einem Thread 0, der Teilalignierungsdaten für die Spalten 1-C der Bewertungsmatrix berechnet, die jeweils den Abfragesymbolen Q*(0)-Q*(C-1) entsprechen. Wie gezeigt, beinhaltet in einigen Ausführungsformen der Matrix-Fülldatensatz 490(1) ohne Einschränkung zwei Arrays von (C+1) HEcell 560, die sich in aufeinanderfolgenden Registerstellen oder aufeinanderfolgenden Speicherstellen befinden, F-Strukturen 570(0)-570(C), die sich in aufeinanderfolgenden Registerstellen oder aufeinanderfolgenden Speicherstellen befinden, und S-Strukturen 580(1)-580(C), die sich in aufeinanderfolgende Registerstellen oder aufeinanderfolgenden Speicherstellen befinden. Ein Array von HEcells 560 entspricht dem/den Zielsymbol(en) T*(j-1) und beinhaltet ohne Einschränkung eine HEcell 560(0, 0), die in einer Anfangsspalte beinhaltet ist, und HEcells 560(0, 1)-560(0, C), die jeweils den Abfragesymbolen Q*(0)-Q*(C-1) entsprechen. Das andere Array von HEcells 560 entspricht dem/den Zielsymbol(en) T*(j) und beinhaltet ohne Einschränkung eine HEcell 560(1, 0), die in der Anfangsspalte beinhaltet ist, und HEcells 560(1, 1)-560(1, C), die jeweils den Abfragesymbolen Q*(0)-Q*(C-1) entsprechen. Die F-Struktur 570(0) entspricht der Anfangsspalte, und die F-Strukturen 570(1)-570(C) entsprechen jeweils den Abfragesymbolen Q*(0)-Q*(C-1). S-Strukturen 580(1)-580(C) entsprechen jeweils den Abfragesymbolen Q*(0)-Q*(C-1).
  • In Bezug auf den Matrix-Fülldatensatz 490(0), der zuvor hierin in Verbindung mit 4 beschrieben wurde, speichert der Matrix-Fülldatensatz 490(1) (2C+3)*32 weniger Bits in der Registerdatei. Falls beispielsweise dem Thread 0 einhundert Spalten zugewiesen werden und anstelle des Matrix-Fülldatensatzes 490(0) der Matrix-Fülldatensatz 490(1) verwendet wird, um Teilalignierungsdaten zu speichern, würde der Thread 0 6496 Bits in der Registerdatei speichern.
  • Obwohl dies nicht gezeigt ist, führt in einigen Ausführungsformen jeder Thread eine „aktuelle Zeile“-Registervariable, die auf das Array von HEcells 560 zeigt, das der aktuellen Zeile entspricht, und eine „vorherige Zeile“-Registervariable, die auf das Array von HEcells 560 zeigt, das der vorherigen Zeile entspricht. Nach dem Berechnen der Teilalignierungsdaten für die aktuelle Zeile, aktualisiert der Thread die Registervariable der aktuellen Zeile und die Registervariable der vorherigen Zeile derart, dass die Registervariable der vorherigen Zeile auf das Array von HEcells 560 zeigt, auf das zuvor von dem aktuellen Zeilenregister gezeigt wurde, und die Variable des aktuellen Zeilenregisters auf das Array von HEcells 560 zeigt, auf das zuvor von dem vorherigen Zeilenregister gezeigt wurde. Der Thread kann die Bezeichnungen der aktuellen Zeile und der vorherigen Zeile auf jede technisch machbare Weise austauschen. Da jeder Thread Teilalignierungsdaten für die aktuelle Zeile von links nach rechts berechnet, werden die Abhängigkeiten von H(j, k) vorteilhafterweise automatisch über den Matrix-Fülldatensatz 490(1) und die Technik des Austauschs aktueller Zeilen/vorheriger Zeilen erfüllt, ohne Speicherbewegungsanweisungen auszuführen.
  • Spezialisierte Anweisungen für Smith Waterman-Berechnungen
  • 6 veranschaulicht eine SW-Anweisung 610, die von dem SW-Kernel der 1 ausgeführt wird, gemäß verschiedenen Ausführungsformen. In einigen Ausführungsformen ist die SW-Anweisung 610 eine Per-Thread-Anweisung, die in einer SIMT-Weise ausgegeben und ausgeführt wird. Wie zuvor hierin in Verbindung mit den 3A-3B angemerkt, kann in einigen Ausführungsformen jeder SM 310 die SW-Anweisungen 610 auf jede technisch machbare Weise ausgeben und ausführen.
  • Wie in einer SW-Anweisungsbeschreibung 614 abgebildet, ist die SW-Anweisung 610 in einigen Ausführungsformen eine Thread-spezifische Anweisung zum Berechnen von SW-Teilalignierungsdaten. In denselben oder anderen Ausführungsformen generiert die SW-Anweisung 610 Teilalignierungsdaten, die mit einer einzigen Position in einer Bewertungsmatrix assoziiert sind. In einigen Ausführungsformen unterstützt die SW-Anweisung 610 ohne Einschränkung mehrere SIMD-Varianten, Datentypen/Datengrößen oder jede Kombination davon.
  • In einigen Ausführungsformen arbeitet eine Kein-SIMD-Variante der SW-Anweisung 610 mit 32-Bit-Daten, um Teilalignierungsdaten zu generieren, die mit einer einzigen Position für ein einziges lokales Alignierungsproblem assoziiert sind. In denselben oder anderen Ausführungsformen arbeitet eine 2-Wege-SIMD-Variante der SW-Anweisung 610 mit 16-Bit-Daten, um Teilalignierungsdaten zu generieren, die mit einer einzigen Position und zwei lokalen Alignierungsproblemen assoziiert sind. In einigen Ausführungsformen arbeitet eine 4-Wege-SIMD-Variante der SW-Anweisung 610 mit 8-Bit-Daten, um Teilalignierungsdaten zu generieren, die mit einer einzigen Position und vier lokalen Alignierungsproblemen assoziiert sind.
  • Wie gezeigt, ist in einigen Ausführungsformen ein SW-Anweisungsformat 612 ,,SW{.variant} result, diag, top, left, consts". Dementsprechend beinhaltet jede SW-Anweisung 610 ohne Einschränkung einen Anweisungsnamen „SW“, einen optionalen .variant-Modifikator, ein Zieladressenergebnis und Quelladressen diag, top, left und consts. In einigen Ausführungsformen gibt der .variant-Modifikator eine SIMD-Variante an. In denselben oder anderen Ausführungsformen beinhalten zulässige Werte für .variant-Modifikator ohne Einschränkung 1, 2 und 4, was jeweils Kein-SIMD, 2-Wege-SIMD und 4-Wege-SIMD angibt.
  • In einigen Ausführungsformen ist die SW-Anweisung 610 dazu ausgelegt, auf Operanden, die das verschachtelte Zellenlayout 450(0) aufweisen, zu arbeiten, und die Operanden result, diag, top und left spezifizieren die Stellen der SWcells 460, die sich in Registern befinden. In einigen Ausführungsformen ist der Operand consts die Adresse eines Satzes von Konstanten, der ohne Einschränkung GapDeleteOpen, GapDeleteExtend, GaplnsertOpen und GaplnsertExtend beinhaltet. In denselben oder Ausführungsformen spezifiziert der Operand consts die Position der Lückenkonstanten 442, die sich in einem einheitlichen Register, konstanten Speicher oder einem Register befinden.
  • In einigen Ausführungsformen berechnet die SW-Anweisung 610 Daten für die SWcell 460, die von dem Operandenergebnis spezifiziert ist, basierend auf Thread-Eingaben aus den SWcells 460, die von den Operanden diag, top und left spezifiziert werden, und einen Satz konstanter Eingaben, der für alle Threads einheitlich ist und von den Operanden consts spezifiziert werden. Per-Thread-Abhängigkeiten 602 bilden grafisch in einigen Ausführungsformen die Eingabedaten pro Thread ab, die die SW-Anweisung 610 aus den SWcells 460 liest, die den Operanden diag, top und left entsprechen, sowie die Ausgangsdaten, die die SW-Anweisung 610 berechnet und in die SWcell 460, die den Ergebnisoperanden entsprechen, schreibt. Wie gezeigt, entsprechen die Operanden result, diag, top und left jeweils den SWcells 460(j, k), 460(j-1, k-1), 460(j-1, k), und 460(j, k-1). In einigen Ausführungsformen berechnet die SW-Anweisung 610 E(j, k), F(j, k) und H(j, k) in der SWcell 460(j, k) basierend auf H(j-1, k-1) und S(j, k) in der SWcell 460(j-1, k-1), H(j-1, k) und E(j-1, k) in der SWcell 460(j-1, k), und G(j, k-1) und F(j, k-1) in der SWcell 460(j, k-1). Die SW-Anweisung 610 kann den SM 310 veranlassen, E(j, k), F(j, k) und H(j, k) auf jede technisch machbare Weise zu berechnen.
  • Der SW-Anweisungs-Pseudocode 630 veranschaulicht beispielhafte Operationen, die von dem SM 310 durchgeführt werden können, wenn die SW-Anweisung 610 ausgeführt wird, in einigen Ausführungsformen. Falls in einigen Ausführungsformen der .variant-Modifikator eins ist, führt ein Thread, der auf dem SM 310 ausgeführt wird, die folgenden Berechnungen (5a)-(5c) durch:
    result.E = max(top.E - consts.gde, top.H - consts.gdo);
    (5a)
    result.F = max(left.F - consts.gie, left.H - consts.gio);
    (5b)
    result.H = max(result.E, result.F, diag.H + diag.S, 0);
    (5c)
  • Falls in einigen Ausführungsformen der .variant-Modifikator zwei ist, führt der SM 310 die folgenden Berechnungen (6a)-(6f) durch:
    result.E0 = max(top.c16.E0 - consts.gde, top.c16.H0 - consts.gdo);
    (6a)
    result.F0 = max(left.c16.F0 - consts.gie, left.c16.H0 - consts.gio);
    (6b)
    result.H0 = max(result.c16.E0, result.c16.F0,
    (6c)
    diag.c16.H0 + diag.c16.S0, 0);
    result.E1 = max(top.c16.E1 - consts.gde, top.c16.H1 - consts.gdo);
    (6d)
    result.F1 = max(left.c16.F1 - consts.gie, left.c16.H1 - consts.gio);
    (6e) result.H1 = max(result.c16.E1, result.c16.F1,
    (6f)
    diag.c16.H1 + diag.c16.S1, 0);
  • Obwohl dies nicht gezeigt ist, führt der SM 310 in einigen Ausführungsformen, falls der .variant-Modifikator vier ist, die folgenden Berechnungen (7a)-(7l) durch:
    result.E0 = max(top.c8.E0 - consts.gde, top.c8.H0 - consts.gdo);
    (7a)
    result.F0 = max(left.c8.F0 - consts.gie, left.c8.H0 - consts.gio);
    (7b)
    result.H0 = max(result.c8.E0, result.c8.F0,
    (7c)
    diag.c8.H0 + diag.c8.S0, 0);
    result.E1 = max(top.c8.E1 - consts.gde, top.c8.H1 - consts.gdo);
    (7d)
    result.F1 = max(left.c8.F1 - consts.gie, left.c8.H1 - consts.gio);
    (7e) result.H1 = max(result.c8.E1, result.c8.F1,
    (7f)
    diag.c8.H1 + diag.c8.S1, 0);
    result.E2 = max(top.c8.E2 - consts.gde, top.c8.H2 - consts.gdo);
    (7g)
    result.F2 = max(left.c8.F2 - consts.gie, left.c8.H2 - consts.gio);
    (7h)
    result.H2 = max(result.c8.E2, result.c8.F2, (7i)
    diag.c8.H2 + diag.c8.S2, 0);
    result.E3 = max(top.c8.E3-consts.gde, top.c8.H3-consts.gdo); (7j)
    result.F3 = max(left.c8.F3 - consts.gie, left.c8.H3 - consts.gio);
    (7k) result.H3 = max(result.c8.E3, result.c8.F3,
    (7l)
    diag.c8.H3 + diag.c8.S3, 0);
  • Vorteilhafterweise und wie in einer SW-Anweisungsverbesserungstabelle 690 abgebildet, erfordert die SW-Anweisung 610 weniger Anweisungen und weniger Zyklen als eine herkömmliche Sequenz aus 10 Anweisungen, um Teilalignierungsdaten, die mit einer einzigen Position in einer Bewertungsmatrix assoziiert sind, zu berechnen. Zu Erläuterungszwecken basiert in dem Kontext der 6 die hierin beschriebene erforderliche Anzahl von Zyklen auf Ausführungsformen, die einen Durchsatz von vier Zyklen für die SW-Anweisung 610 aufweisen. In anderen Ausführungsformen kann der Zyklusdurchsatz für die SW-Anweisung 610 und daher die erforderliche Anzahl von Zyklen variieren.
  • Wie gezeigt, erfordert in einigen Ausführungsformen zum Berechnen von Teilalignierungsdaten, die mit einer einzigen Position in einer Bewertungsmatrix für ein einziges lokales Alignierungsproblem (das einer Kein-SIMD-Variante entspricht) assoziiert sind, eine herkömmliche Sequenz aus 10 Anweisungen und zehn Zyklen, und die SW-Anweisung 610 erfordert eine Anweisung und vier Zyklen. Im Vergleich zu einer herkömmlichen Sequenz aus 10 Anweisungen kann die Kein-SIMD-Variante der SW-Anweisung 610 daher 90 % weniger Anweisungen und 60 % weniger Zyklen erfordern.
  • In einigen Ausführungsformen erfordert eine herkömmliche Sequenz aus 10 Anweisungen zwanzig Anweisungen und zwanzig Zyklen, um Teilalignierungsdaten zu berechnen, die mit einer einzigen Position in einer Bewertungsmatrix für zwei lokale Alignierungsprobleme (entsprechend einer 2-Wege-SIMD-Variante) assoziiert sind, und die SW-Anweisung 610 erfordert eine Anweisung und vier Zyklen. Im Vergleich zu einer herkömmlichen Sequenz aus 10 Anweisungen, kann die 2-Wege-SIMD-Variante der SW-Anweisung 610 daher 95 % weniger Anweisungen und 80 % weniger Zyklen erfordern.
  • In einigen Ausführungsformen erfordert eine herkömmliche Sequenz aus 10 Anweisungen dreißig Anweisungen und dreißig Zyklen, um Teilalignierungsdaten zu berechnen, die mit einer einzigen Position in einer Bewertungsmatrix für vier lokale Alignierungsprobleme (entsprechend einer 4-Wege-SIMD-Variante) assoziiert sind, und die SW-Anweisung 610 erfordert eine Anweisung und vier Zyklen. Im Vergleich zu einer herkömmlichen Sequenz aus 10 Anweisungen, kann die 4-Wege-SIMD-Variante der SW-Anweisung 610 daher 96 % weniger Anweisungen und 86 % weniger Zyklen erfordern.
  • Es ist zu beachten, dass die hierin beschriebenen Techniken eher veranschaulichend als einschränkend sind und geändert werden können, ohne vom breiteren Geist und Umfang der Erfindung abzuweichen. Zahlreiche Modifikationen und Abwandlungen der Funktionalität, die von dem SM 310, den SW-Anweisungen 610 und dem SW-Kernel 192 bereitgestellt werden, sind für den Durchschnittsfachmann ersichtlich, ohne vom Umfang und Geist der beschriebenen Ausführungsformen abzuweichen. Beispielsweise können in einigen anderen Ausführungsformen Varianten der SW-Anweisung 610 mit Operanden arbeiten, die andere Layouts als das verschachtelte Zellenlayout 450(0), unterschiedliche SIMD-Varianten, E-Werte, F-Werte, Substitutionswerte und Teilalignierungsbewertungen aufweisen, die unterschiedliche Datentypen/Datenformate aufweisen usw.
  • 7 veranschaulicht eine SW-Sequenz 740, die von dem SW-Kernel 192 der 1 ausgeführt wird, gemäß verschiedenen Ausführungsformen. In einigen Ausführungsformen ist die SW-Sequenz 740 eine Per-Thread-Sequenz von sechs Anweisungen zum Berechnen von SW-Teilalignierungsdaten. In denselben oder anderen Ausführungsformen generiert die SW-Sequenz 740 Teilalignierungsdaten, die mit einer einzigen Position in einer Bewertungsmatrix assoziiert sind. In einigen Ausführungsformen unterstützt die SW-Sequenz 740 ohne Einschränkung mehrere SIMD-Varianten, Datentypen/Datengrößen, oder jede Kombination davon.
  • In einigen Ausführungsformen arbeitet eine Kein-SIMD-Variante der SW-Sequenz 740 mit 32-Bit-Daten, um Teilalignierungsdaten zu generieren, die mit einer einzigen Position für ein einziges lokales Alignierungsproblem assoziiert sind. In denselben oder anderen Ausführungsformen arbeitet eine 2-Wege-SIMD-Variante der SW-Sequenz 740 mit 16-Bit-Daten, um Teilalignierungsdaten zu generieren, die mit einer einzigen Position und zwei lokalen Alignierungsproblemen assoziiert sind. In einigen Ausführungsformen arbeitet eine 4-Wege-SIMD-Variante der SW-Sequenz 740 mit 8-Bit-Daten, um Teilalignierungsdaten zu generieren, die mit einer einzigen Position und vier lokalen Alignierungsproblemen assoziiert sind.
  • Wie gezeigt, beinhaltet die SW-Sequenz 740 in einigen Ausführungsformen drei VIADD-Anweisungen, zwei VIADDMNMX-Anweisungen und eine VIMNMX3-Anweisung. In einigen Ausführungsformen ist jede VIADD-Anweisung, VIADDMNMX-Anweisung und VIMNMX3-Anweisung eine Per-Thread-Anweisung, die in einer SIMT-Weise ausgegeben und ausgeführt wird. In einigen Ausführungsformen kann jeder SM 310 jede VIADD-Anweisung, VIADDMNMX-Anweisung und VIMNMX3-Anweisung auf jede technisch machbare Weise ausgeben und ausführen.
  • In einigen Ausführungsformen unterstützt jede VIADD-Anweisung, VIADDMNMX-Anweisung und VIMNMX3-Anweisung ohne Einschränkung mehrere SIMD-Varianten, Datentypen/Datengrößen oder jede Kombination davon. In einigen Ausführungsformen arbeitet jede Kein-SIMD-Variante der VIADD-Anweisung, der VIADDMNMX-Anweisung und der VIMNMX3 mit 32-Bit-Ganzzahlen, um ein einziges 32-Bit-Ergebnis zu generieren. In denselben oder anderen Ausführungsformen arbeitet jede 2-Wege-SIMD-Variante der VIADD-Anweisung, der VIADDMNMX-Anweisung und der VIMNMX3-Anweisungmit 16-Bit-Ganzzahlen, um zwei 16-Bit-Ganzzahlen, die in ein 32-Bit-Ergebnis gepackt sind, zu generieren. In einigen Ausführungsformen arbeitet eine 4-Wege-SIMD-Variante der SW-Anweisung 610 mit 8-Bit-Ganzzahlen, um vier 8-Bit-Ganzzahlen, die in ein 32-Bit-Ergebnis gepackt sind, zu generieren.
  • In einigen Ausführungsformen ist VIADD eine Ganzzahl-Additionsanweisung, die in einer Gleitkomma-Pipeline (FP-Pipeline) des SM 310 ausgeführt wird. Vorteilhafterweise kann in einigen Ausführungsformen der SM 310 kann Ganzzahl-Anweisungen parallel zu Gleitkomma-Anweisungen ausgeben und ausführen. Folglich kann die Ausführung der VIADD-Anweisung in der FP-Pipeline Überlappen/Pipelining von mehreren Anweisungen und damit dem gesamten Rechendurchsatz erhöhen.
  • Wie gezeigt, ist in einigen Ausführungsformen ein VIADD-Anweisungsformat 710 ,,VIADD{.fmt} result, source_a, {-}source_b". Dementsprechend beinhaltet jede VIADD-Anweisung ohne Einschränkung einen Anweisungsnamen „SW“, einen optionalen .fmt-Modifikator, ein Ergebnis, eine source_a, und eine source_b, die optional negiert wird. result ist der Zieloperand und das Anweisungsergebnis. Source_a und source_b sind die Quelloperanden. In einigen Ausführungsformen beinhalten zulässige Werte für den .fmt-Modifikator ohne Einschränkung.32, .16x2 und .8x4, die einer 32-Bit-Ganzzahl (Kein-SIMD) entsprechen, gepackte Daten, die jeweils zwei 16-Bit-Ganzzahlen (2-Wege-SIMD), und gepackte Daten, die jeweils vier Acht-Bit-Ganzzahlen (4-Wege-SIMD) beinhaltet, beinhalten. Die VIADD-Anweisung kann die SM 310 veranlassen, result = source_a + {-}source_b auf jede technisch machbare Weise zu implementieren.
  • In einigen Ausführungsformen veranlasst die VIADD-Anweisungen den SM 310, jedes Element in dem Ergebnis gleich der Summe des entsprechenden Elements in source_a und das optional negierte entsprechende Element in source_b zu setzen. Falls der .fmt-Modifikator .32 ist, beinhalten result, source_a und source_b jeweils ein Element, das eine 32-Bit-Ganzzahl ist. Falls der .fmt-Modifikator .16 ist, beinhalten result, source_a und source_b jeweils zwei Elemente, die jeweils eine 16-Bit-Ganzzahl sind. Falls der .fmt-Modifikator .8 ist, beinhalten result, source_a und source_b jeweils vier Elemente, die jeweils eine 8-Bit-Ganzzahl sind.
  • In denselben oder anderen Ausführungsformen werden Operationen, die von dem SM 310 durchgeführt werden können, um die VIADD-Anweisung auszuführen, von dem folgenden beispielhaften Pseudocode (8) veranschaulicht:
  •          VIADD{.fmt} result, source_a, {-}source_b
     (8)
             // .fmt: .32, .16x2, .8x4
             // result: instruction result
             // source_a: value a, source_b: value b
             READ_SOURCE_DATA(*tmp, reg)
                tmp = register[reg];
             WRITE_DESTINATION_DATA(*tmp, reg, size)
                register[reg] = *tmp;
             switch(inst.fmt) {
                case .32: ELEMENTS = 1; WIDTH = 32; break;
                case .16x2: ELEMENTS = 2; WIDTH = 16; break; 
    
    
    
    
    
                case .8x4: ELEMENTS = 4; WIDTH = 8; break;}
             uint32_t MASK = (1 << WIDTH) - 1;
             uint32_t Ergebnis = 0;
             uint32_t sum, source_a, source_b;
             READ _SOURCE_DATA(source_a, inst.source_a);
             READ_SOURCE_DATA(source_b, inst.source_b);
             für (uint i = 0; i < ELEMENTS; ++i) {
                int32_t bits a = (source_a >> (i * WIDTH)) & MASK;
                int32_t bits b = (source_b >> (i * WIDTH)) & MASK;
                wenn (inst.negB) b = (-b & MASK);
                sum = a + b;
                result |= (sum & MASK) << (WIDTH * i);
             }
             WRITE_DESTINATION_DATA(result, inst.result);
  • In einigen Ausführungsformen ist die VIADDMNMX-Anweisung eine ganzzahlige Addition, Minimum/Maximum optional durchgeführt gegen eine Null-Anweisungen, die in einer Ganzzahl-Pipeline des SM 310 ausgeführt wird. Insbesondere kombiniert die VIADDMNMX-Anweisungen mehrere herkömmliche Anweisungen zu einer einzigen Anweisung. Wie gezeigt, ist in einigen Ausführungsformen ein VIADDMNMX-Anweisungsformat 720 „"VIADDMNMX{.fmt}{.relu} result, source_a, {}source_b, source_c, min_or_max". Dementsprechend beinhaltet jede VIADDMNMX-Anweisung ohne Einschränkung einen Anweisungsnamen „VIADDMNMX“, einen optionalen .fmt-Modifikator, einen optionalen .relu-Modifikator, ein result, eine source_a, eine source_b, die optional negiert wird, eine source_c und optional min_or_max-Spezifizierer. result ist der Zieloperand und das Anweisungsergebnis. Source_a, source_b und source_c sind die Quelloperanden. Der min_or_max-Spezifizierer gibt an, ob die VIADDMNMX-Anweisung einen oder mehrere Minimum- oder Maximum-Vergleiche durchführt. In einigen Ausführungsformen beinhalten erlaubte Werte für den .fmt -Modifikator ohne Einschränkung „.U32", „.S32", „.U16×2", „.S16×2", „.U16×2", „.S16×2", „.U8x4" und „.S8×4", die einer 32-Bit-Ganzzahl ohne Vorzeichen, einer 32-Bit-Ganzzahl mit Vorzeichen, gepackten Daten, die zwei 16-Bit-Ganzzahlen ohne Vorzeichen beinhalten, gepackte Daten, die zwei 16-Bit-Ganzzahlen mit Vorzeichen beinhalten, gepackte Daten, die vier acht-Bit-Ganzzahlen ohne Vorzeichen beinhalten und gepackte Daten, die vier acht-Bit-Ganzzahlen mit Vorzeichen beinhalten, entsprechen. Falls in denselben oder anderen Ausführungsformen der optionale .relu-Modifikator vorhanden ist, führt die VIADDMNMX-Anweisung Maximum/Minimum-Operationen gegen 0 aus.
  • In einigen Ausführungsformen veranlasst die VIADDMNMX-Anweisung, dass der SM 310 jedes Element in dem Ergebnis gleich dem Minimum oder Maximum des entsprechenden Elements in source_c, die Summe des entsprechenden Elements in source_a und das optional negierte entsprechende Element in source_b und optional null setzt. Falls der .fmt-Modifikator .32 ist, beinhalten result, source_a, source_b, und source _c jeweils ein Element, das eine 32-Bit-Ganzzahl ist. Falls der .fmt-Modifikator .16 ist, beinhalten result, source_a, source_b und source_c jeweils zwei Elemente, die jeweils eine 16-Bit-Ganzzahl sind. Falls der .fmt-Modifikator .8 ist, beinhalten result, source_a, source_b und source_c jeweils vier Elemente, die jeweils eine 8-Bit-Ganzzahl sind.
  • In denselben oder anderen Ausführungsformen sind Operationen, die von dem SM 310 durchgeführt werden können, um die VIADDMNMX-Anweisung auszuführen, von dem folgenden beispielhaften Pseudocode (8) veranschaulicht:
  •          VIADDMNMX{.fmt}{.relu} result, source_a, {-}source_b, source_c
     (9) min_or_max
             // .fmt: .U32, .S32, .U16×2, .S16×2, .U8×4, .S8×4
             // .relu: falls vorhanden ausführt MAX/MIN Operationen gegen den Wert 0
             // result: instruction result
             // source_a: value a, source_b: value b, source_c: value c
             MIN_MAX(value1, value2, width, min, signed)
                uint32_t MASK = (1 << width) - 1;
                wenn (signed) {
                    uint32_t SIGN_EXT = -MASK;
                    uint32_t SIGN_BIT = 1 << (width - 1);
                    int32_t a_int = (int)(a & MASK);
                    int32_t b_int = (int)(b & MASK); 
    
    
    
    
    
                    wenn (a_int & SIGN_BIT) a_int |= SIGN_EXT;
                    wenn (b_int & SIGN_BIT) b_int |= SIGN_EXT;
                    int result;
                    wenn (min)
                         result = a_int < b_int ? a_int: b_int; else
                         result = a_int >= b_int ? a_int : b_int; return result & MASK;
                    } else {
                         a &= MASK;
                         b &= MASK;
                         int result;
                         wenn (min)
                            result = a < b ? a : b;
                         else
                            result = a >= b ? a : b;
                         return result;
                    }
             switch(inst.fmt) {
                case .S32: ELEMENTS = 1; SIGNED = true; WIDTH = 32; break;
                case .S16x2: ELEMENTS = 2; SIGNED = true; WIDTH = 16; break;
                case .S8x4: ELEMENTS = 4; SIGNED = true; WIDTH = 8; break;
                case .U32: ELEMENTS = 1; SIGNED = false; WIDTH = 32; break;
                case .U16x2: ELEMENTS = 2; SIGNED = false; WIDTH = 16; break;
                case .U8x4: ELEMENTS = 4; SIGNED = false; WIDTH = 8; break;}
             uint32_.t MASK = (1 << WIDTH) - 1;
             uint32_.t Ergebnis = 0;
             uint32_.t sum, comparison, source_a, source_b, source_c;
             READ_SOURCE_DATA(source_a, inst.source_a); // Function defined in (7)
             READ_SOURCE_DATA(source_b, inst.source_b); // Function defined in (7)
             READ_SOURCE_DATA(source_c, inst.source_c); // Function defined in (7)
             für (uint i = 0; i < ELEMENTS; ++i) { 
    
    
    
    
    
                int32_t bits a = (source_a >> (i * WIDTH)) & MASK;
                int32_t bits b = (source_b >> (i * WIDTH)) & MASK;
                int32_t bits c = (source_c >> (i * WIDTH)) & MASK;
                wenn (inst.negB) b = (-b & MASK);
                sum = (a + b) & MASK;
                comparison = MIN_MAX(sum, c, WIDTH, min_or_max, SIGNED);
                wenn (inst.relu)
                    comparison = MIN_MAX(comparison, 0, WIDTH, False, True);
                result |= comparison << (WIDTH * i);
             }
             WRITE_DESTINATION_DATA(result, inst.result);
  • In einigen Ausführungsformen ist die VIMNMX3-Anweisung ein ganzzahliges Drei-Operanden-Minimum/Maximum, das optional gegen eine Null-Anweisung durchgeführt wird, die in einer Ganzzahl-Pipeline des SM 310 ausgeführt wird. Insbesondere fügt die VIMNMX3-Anweisung mindestens einen dritten Operanden zu einer herkömmlichen Minimum/Maximum-Anweisung hinzu. Wie gezeigt, ist in einigen Ausführungsformen ein VIMNMX3-Anweisungsformat 730 ist „VIMNMX3{.fmt}{.relu} result, source_a, source_b, source_c, min_or_max“. Dementsprechend beinhaltet jede VIMNMX3-Anweisung ohne Einschränkung, einen Anweisungsnamen von „VIMNMX3“, einen optionalen .fmt-Modifikator, einen optionalen .relu-Modifikator, ein result, eine source_a, eine source_b, eine source_c und einen optionalen min_or_max-Spezifizierer. result ist der Zieloperand und das Anweisungsergebnis. Source_a, source_b und source_c sind die Quelloperanden. Der min_or_max-Spezifizierer gibt an, ob die VIMNMX3-Anweisung das Minimum oder Maximum der source_a, source_b und source_c berechnet. In einigen Ausführungsformen beinhalten erlaubte Werte für den .fmt -Modifikator ohne Einschränkung „.U32", „.S32", „.U16×2", „.S16×2", ".U16×2", „.S16×2",„.U8×4" und „.S8×4", die einer 32-Bit-Ganzzahl ohne Vorzeichen, einer 32-Bit-Ganzzahl mit Vorzeichen, gepackten Daten, die zwei 16-Bit-Ganzzahlen ohne Vorzeichen beinhalten, gepackte Daten, die zwei 16-Bit-Ganzzahlen mit Vorzeichen beinhalten, gepackte Daten, die vier acht-Bit-Ganzzahlen ohne Vorzeichen beinhalten und gepackte Daten, die vier acht-Bit-Ganzzahlen mit Vorzeichen beinhalten, entsprechen. Falls in denselben oder anderen Ausführungsformen der optionale .relu-Modifikator vorhanden ist, führt die VIMNMX3-Anweisung Maximum/Minimum-Operationen gegen 0 durch.
  • In einigen Ausführungsformen veranlasst die VIMNMX3-Anweisung, dass der SM 310 jedes Element in dem Ergebnis gleich dem Minimum oder Maximum des entsprechenden Elements in source_a, das entsprechende Element in source_b, das entsprechende Element in source_c und optional 0 setzt. Falls der .fmt-Modifikator .32 ist, beinhalten result, source_a, source_b, und source_c jeweils ein Element, das eine 32-Bit-Ganzzahl ist. Falls der .fmt-Modifikator .16 ist, beinhalten result, source_a, source_b und source _c jeweils zwei Elemente, die jeweils eine 16-Bit-Ganzzahl sind. Falls der .fmt-Modifikator .8 ist, beinhalten result, source_a, source_b und source _c jeweils vier Elemente, die jeweils eine 8-Bit-Ganzzahl sind.
  • In einigen Ausführungsformen werden Operationen, die von dem SM 310 durchgeführt werden können, um die VIMNMX3-Anweisung auszuführen von dem folgenden beispielhaften Pseudocode (10) veranschaulicht:
  •          VIMNMX3{.fmt}{.relu} result, source_a, source_b, source_c, min_or_max
     (10)
             // .fmt: .U32, .S32, .U16×2, .S16×2, .U8×4, .S8×4
             // .relu: falls vorhanden ausführt MAX/MIN Operationen gegen den Wert 0
             // result: instruction result
             // source_a: value a, source_b: value b, source_c: value c
             // Uses READ_SOURCE_DATA and WRITE_DESTINATION_DATA defined
             // above in (7)
             // Uses MIN_MAX defined above in (8)
             switch(inst.fmt) {
                case .S32: ELEMENTS = 1; SIGNED = true; WIDTH = 32; break;
                case .S16x2: ELEMENTS = 2; SIGNED = true; WIDTH = 16; break;
                case .S8x4: ELEMENTS = 4; SIGNED = true; WIDTH = 8; break;
                case .U32: ELEMENTS = 1; SIGNED = false; WIDTH = 32; break;
                case .U16x2: ELEMENTS = 2; SIGNED = false; WIDTH = 16; break;
                case .U8x4: ELEMENTS = 4; SIGNED = false; WIDTH = 8; break;} 
    
    
    
    
    
             uint32_t MASK = (1 « WIDTH) - 1;
             uint32_t Ergebnis = 0;
             uint32_t tmp;
             READ_SOURCE_DATA(source_a, inst.source_a);
             READ_SOURCE_DATA(source_b, inst.source_b);
             READ_SOURCE_DATA(source_c, inst.source_c);
             für (uint i = 0; i < ELEMENTS; ++i) {
                int32_t bits a = (source_a » (i * WIDTH)) & MASK;
                int32_t bits b = (source_b » (i * WIDTH)) & MASK;
                int32_t bits c = (source_c » (i * WIDTH)) & MASK;
                tmp = MIN_MAX(a, b, WIDTH, min, SIGNED);
                tmp = MIN_MAX(tmp, c, WIDTH, min, SIGNED);
                wenn (inst.relu)
                   tmp = M)N_MAX(tmp, 0, WIDTH, False, True);
                result |= (tmp & MASK) << (WIDTH * i);
             }
    
    
    
    
             WRITE_DESTINATION_DATA(result, inst.result);
  • Da in einigen Ausführungsformen Kein-, 2-Wege- und 4-Wege-SIMD-Varianten für die VIADD-Anweisung, die VIADDMNMX-Anweisung und die VIMNMX3-Anweisung unterstützt werden, beinhaltet jede einer Kein-SIMD-SW-Sequenz 742, einer 2-Wege-SIMD-SW-Sequenz 744, und einer 4-Wege-SIMD-SW-Sequenz 746 ohne Einschränkung sechs Anweisungen. In einigen anderen Ausführungsformen enthält die SW-Sequenz 740 ohne Einschränkung sechs Anweisungen für jede SIMD-Variante, die über die VIADD-Anweisung, die VIADDMNMX-Anweisung und die VIMNMX3-Anweisung unterstützt wird.
  • Die Kein-SIMD-SW-Sequenz 742, die 2-Wege-SIMD-SW-Sequenz 744 und die 4-Wege-SIMD-SW-Sequenz 746 sind unterschiedliche Variationen der SW-Sequenz 740. In einigen Ausführungsformen ist die SW-Sequenz 740 unbeschadet der SIMD-Variante eine Sequenz aus sechs Anweisungen. In einigen Ausführungsformen ist die SW-Sequenz 740 eine erste VIADD-Anweisung, die in der FP-Pipeline ausgeführt wird, eine erste VIADDMNMX-Anweisung, die in der Integer-Pipeline ausgeführt wird, eine zweite VIADD-Anweisung, die in der FP-Pipeline ausgeführt wird, eine zweiteVIADDMNMX-Anweisung, die in der Ganzzahl-Pipeline ausgeführt wird, eine dritte VIADD-Anweisung, die in der FP-Pipeline ausgeführt wird, und eine VIMNMX3.RELU-Anweisung, die in der Ganzzahl-Pipeline ausgeführt wird. Wie zuvor hierin beschrieben, können in einigen Ausführungsformen das Ausführen der drei VIADD-Anweisungen in der FP-Pipeline und das Ausführen der anderen drei Anweisungen in der Integer-Pipeline Überlappen/Pipelining mehrerer Anweisungen und damit dem gesamten Rechendurchsatz erhöhen.
  • Die in 7 abgebildete Kein-SIMD-SW-Sequenz 742 ist eine beispielhafte Anweisungssequenz, die mit 32-Bit-Daten arbeitet, um Teilalignierungsdaten, die mit einer einzigen Position für ein einziges lokales Alignierungsproblem assoziiert sind, zu generieren. Wie gezeigt, wird in einigen Ausführungsformen eine erste VIADD.32-Anweisung in der Kein-SIMD-SW-Sequenz 742 in der Integer-Pipeline ausgeführt und setzt temp1 gleich E_top + gde. Eine erste VIADDMNMX.S32 in der Kein-SIMD SW-Sequenz 742 wird in der FP-Pipeline ausgeführt und setzt E gleich dem Maximum von (H_top + gde) und temp1. Eine zweite Anweisung VIADD.32-Anweisung in der Kein-SIMD-SW-Sequenz 742 wird in der Integer-Pipeline ausgeführt und setzt temp2 gleich F_left + gie. Eine zweite VIADDMNMX.S32-Anweisung in der Kein-SIMD SW-Sequenz 742 wird in der Integer-Pipeline ausgeführt und setzt F gleich dem Maximum von (H_left + gie) und temp2. Eine VIADD.32-Anweisung in der Kein-SIMD-SW-Sequenz 742 führt in der Integer-Pipeline aus und setzt temp3 gleich H_diag + S. Eine VIMNMX3.S32.RELU-Anweisung in der Kein-SIMD-SW-Sequenz 742 wird in der FP-Pipeline ausgeführt und setzt H gleich dem Maximum von temp1 , temp2, temp3 und 0.
  • Die in 7 abgebildete 2-Wege-SIMD-SW-Sequenz 744 ist eine beispielhafte Anweisungssequenz, die 16-Bit-Daten verarbeitet, um Teilalignierungsdaten zu generieren, die mit einer einzigen Position und zwei lokalen Alignierungsproblemen assoziiert sind. Relativ zu der Kein-SIMD-SW-Sequenz 742 werden die Kein-SIMD-Anweisungsvarianten VIADD.32, VIADDMNMX.S32 und VIMNMX3.S32.RELU jeweils mit den 2-Wege-SIMD-Anweisungsvarianten VIADD.16X2, VIADDMNMX.S16X2 und VIMNMX3.S16X2.RELU ersetzt.
  • Die in 7 abgebildete 4-Wege-SIMD-SW-Sequenz 746 ist eine beispielhafte Anweisungssequenz, die mit 8-Bit-Daten arbeitet, um Teilalignierungsdaten, die mit einer einzigen Position und vier lokalen Alignierungsproblemen assoziiert sind, zu generieren. Im Vergleich zu der Kein-SIMD-SW-Sequenz 742 werden die Kein-SIMD-Anweisungsvarianten VIADD.32, VIADDMNMX.S32 und VIMNMX3.S32.RELU werden jeweils mit den 4-Wege-SIMD-Anweisungsvarianten VIADD.8X4, VIADDMNMX.8X4 und VIMNMX3.8X4.RELU ersetzt.
  • Vorteilhafterweise und wie in einer SW-Sequenzverbesserungstabelle 790 abgebildet, erfordert die SW-Sequenz 740 weniger Anweisungen und weniger Zyklen als eine herkömmliche Sequenz aus 10 Anweisungen, um Teilalignierungsdaten, die mit einer einzigen Position in einer Bewertungsmatrix assoziiert sind, zu generieren. Zu Erläuterungszwecken basiert in dem Kontext der 7 die hierin beschriebene erforderliche Anzahl von Zyklen auf Ausführungsformen, die einen Durchsatz von einem Zyklus pro Anweisung aufweisen. In anderen Ausführungsformen kann der Zyklusdurchsatz für Anweisungen und daher die erforderliche Anzahl von Zyklen variieren.
  • Wie gezeigt, erfordert in einigen Ausführungsformen zum Berechnen von Teilalignierungsdaten, die mit einer einzigen Position in einer Bewertungsmatrix für ein einziges lokales Alignierungsproblem (das einer Kein-SIMD-Variante entspricht) assoziiert sind, eine herkömmliche Sequenz aus 10 Anweisungen zehn Anweisungen und zehn Zyklen, und die Kein-SIMD-SW-Sequenz 742 erfordert sechs Anweisungen und sechs Zyklen. Im Vergleich zu einer herkömmlichen Sequenz aus 10 Anweisungen kann die Kein-SIMD SW-Sequenz 742 daher 40 % weniger Anweisungen und 40 % weniger Zyklen erfordern.
  • In einigen Ausführungsformen erfordert zum Berechnen von Teilalignierungsdaten, die mit einer einzigen Position in einer Berechnungsmatrix für zwei lokale Alignierungsprobleme (die einer 2-Wege-SIMD-Variante entsprechen) assoziiert sind, eine herkömmliche Sequenz aus 10 Anweisungen zwanzig Anweisungen und zwanzig Zyklen, und die 2-Wege-SIMD-SW-Sequenz 744 erfordert sechs Anweisungen und sechs Zyklen. Im Vergleich zu einer herkömmlichen Sequenz aus 10 Anweisungen kann die 2-Wege-SIMD-SW-Sequenz 744 daher 70 % weniger Anweisungen und 70 % weniger Zyklen erfordern.
  • In einigen Ausführungsformen erfordert zum Berechnen von Teilalignierungsdaten, die mit einer einzigen Position in einer Bewertungsmatrix für vier lokale Alignierungsprobleme (die einer 4-Wege-SIMD-Variante entsprechen) assoziiert sind, eine herkömmliche Sequenz aus 10 Anweisungenen dreißig Anweisungen und dreißig Zyklen, und die 4-Wege-SIMD-SW-Sequenz 746 erfordert sechs Anweisungen und sechs Zyklen. Im Vergleich zu einer herkömmlichen Sequenz aus 10 Anweisungen kann die 4-Wege-SIMD-SW-Sequenz 746 daher 80 % weniger Anweisungen und 80 % weniger Zyklen erfordern.
  • In einigen Ausführungsformen, einschließlich der in 7 abgebildeten Ausführungsformen, sind die Quelloperanden und die Zieloperanden der VIADD-, VIADDMNMX- und VIMNMX3-Anweisungen sowohl mit dem verschachtelten Zellenlayout 450(0) der 4 als auch mit dem verschachtelten Zellenlayout 450(1) der 5 kompatibel. In einigen Ausführungsformen führt der SW-Kernel 192 die SW-Sequenz 740 aus, die ohne Einschränkung VIADD-, VIADDMNMX- und VIMNMX3-Anweisungen beinhaltet, die einen oder mehrere Operanden spezifizieren, die in einer oder mehreren SWcells 460 beinhaltet sind. In einigen anderen Ausführungsformen führt der SW-Kernel 192 die SW-Sequenz 740 aus, die ohne Einschränkung VIADD-, VIADDMNMX- und VIMNMX3-Anweisungen beinhaltet, die einen oder mehrere Operanden spezifizieren, die in einer oder mehreren der HEcells 560 beinhaltet sind.
  • In einigen Ausführungsformen beinhaltet der SW-Kernel 192, einen oder mehrere andere Kernel, eine oder mehrere SW-Bibliotheken oder eine beliebige Kombination davon, ohne Einschränkung eine oder mehrere intrinsische Funktionen, die Teilalignierungsdaten berechnen, die verschiedenen Abschnitten (z. B. Einzelposition, Zeile, Zeilensegmente, Gesamtheit) von Bewertungsmatrizen entsprechen, für eine beliebige Anzahl von SIMD-Varianten basierend auf der SW-Anweisung 610 und dem verschachtelten Zellenlayout 450(0), der SW-Sequenz 740 und dem verschachtelten Zellenlayout 450(0), der SW-Sequenz 740 und dem verschachtelten Zellenlayout 450(1) oder eine beliebige Kombination davon.
  • Es ist zu beachten, dass die hierin beschriebenen Techniken eher veranschaulichend als einschränkend sind und geändert werden können, ohne vom breiteren Geist und Umfang der Erfindung abzuweichen. Viele Modifikationen und Variationen der Funktionalität, die von dem SM 310, der VIADD-Anweisung, der VIADDMNMX-Anweisung, der VIMNMX3-Anweisung, der SW-Sequenz 740, der Kein-SIMD-SW-Sequenz 742, der 2-Wege-SIMD-SW-Sequenz 744, der 4-Wege-SIMD-SW-Sequenz 746 und dem SW-Kernel 192 bereitgestellt wird, für den Durchschnittsfachmann offensichtlich, ohne vom Umfang und Geist der beschriebenen Ausführungsformen abzuweichen. Beispielsweise verwenden in einigen anderen Ausführungsformen Varianten der SW-Sequenz 740 eine herkömmliche Addieranweisung, die in der Ganzzahl-Pipeline an Stelle der VIADD-Anweisung ausgeführt wird. In denselben oder anderen Ausführungsformen können die Kein-SIMD-SW-Sequenz 742, die 2-Wege-SIMD-SW-Sequenz 744 und die 4-Wege-SIMD-SW-Sequenz 746 mit 32-Bit-Ganzzahlen, zwei gepackten 16-Bit-Ganzzahlen und vier gepackten 8-Bit-Ganzzahlen arbeiten, die weder mit dem verschachtelten Zellenlayout 450(0) noch dem verschachtelten Zellenlayout 450(1) assoziiert sind.
  • 8 veranschaulicht einen minimalen/maximalen Wert und eine entsprechende Quellenangabeanweisung, die von dem SW-Kernel 192 der 1 gemäß verschiedenen Ausführungsformen ausgeführt wird. Der minimale/maximale Wert und die entsprechende Quellenangabeanweisung sind eine VIMNMX-Anweisung 810. In einigen Ausführungsformen verwendet der SW-Kernel 192 die VIMNMX-Anweisung 810, um eine maximale Teilalignierungsbewertung und eine entsprechende maximale Bewertungsspalte (in der Bewertungsmatrix) und/oder eine entsprechende maximale Bewertungszeile (in der Bewertungsmatrix) für jedes einer beliebigen Anzahl lokaler Sequenzalignierungsprobleme zu bestimmen.
  • Einige herkömmliche Ansätze zum Bestimmen der maximalen Teilalignierungsbewertung und der maximalen Bewertungsposition für ein einziges lokales Sequenzalignierungsroblem beinhalten das Ausführen einer herkömmlichen Maximalbewertungs-/Spaltensequenz 802 oder einer ähnliche Anweisungssequenz für jede Teilalignierungsbewertung. Wie gezeigt, ist die herkömmliche Maximalbewertungs-/Spaltensequenz 802 eine Sequenz aus drei Anweisungen. Die erste Anweisung ist eine ISETP.GT-Anweisung, die bestimmt, ob eine aktuelle Bewertung (bezeichnet als H) größer ist als eine maximale Bewertung (bezeichnet als maxH), und das Vergleichsergebnis (bezeichnet als P0) in ein Prädikatregister schreibt. Die zweite Anweisung ist eine SEL-Anweisung, die die maximale Bewertung mit der aktuellen Bewertung überschreibt, wenn das Prädikat angibt, dass die maximale Bewertung aktualisiert wurde. Die dritte Anweisung ist eine SEL-Anweisung, die eine maximale Bewertungsspalte (bezeichnet als maxHcol) mit einer aktuellen Spalte (bezeichnet als col) überschreibt, falls das Prädikat angibt, dass die maximale Bewertung aktualisiert wurde.
  • Wie gezeigt, erfordert das Ausführen der herkömmlichen Maximalbewertungs-/Spaltensequenz 802 3 Anweisungen und sechs Ausgangsschlitze in der Ganzzahl-Pipeline. Obwohl dies nicht gezeigt ist, erfordert im Vergleich zu der herkömmlichen Maximalbewertungs-/Spaltensequenz 802, das Bestimmen der maximalen Teilalignierungsbewertung und der entsprechenden maximalen Bewertungsspalte für das zusätzliche lokale Sequenzalignierungsproblem, das 2-Wege-SIMD entspricht, zusätzliche Anweisungen und zusätzliche Ausgangsschlitze in der Ganzzahl-Pipeline. Und das Bestimmen der maximalen Teilalignierungsbewertung und der entsprechenden maximalen Bewertungsspalte für die zusätzlichen lokalen Sequenzalignierungsprobleme, die 4-Wege-SIMD entsprechen, erfordert noch mehr Anweisungen und noch mehr Ausgangsschlitze in der Ganzzahl-Pipeline.
  • In einigen Ausführungsformen und wie von einer VIMNMX-Anweisungsbeschreibung 814 abgebildet, ist die VIMNMX-Anweisung 810 eine Per-Thread-Minimum/Maximum-Anweisung, die angibt, welcher der Operanden die Quelle des minimalen/maximalen Werts ist. In denselben oder anderen Ausführungsformen stellt die VIMNMX-Anweisung 810 ein Prädikat bereit, um anzugeben, welcher der Operanden die Quelle des minimalen/maximalen Werts ist. Nachfolgende Anweisungen können das Prädikat verwenden, um mehrere Werte basierend auf dem Prädikat auszuwählen und zu speichern. Vorteilhafterweise kann die VIMNMX-Anweisung 810 verwendet werden, um viele Software-Anwendungen, die mehrere Werte basierend auf einer herkömmlichen Vergleichsanweisung speichern, zu optimieren. In einigen Ausführungsformen unterstützt die SW-Anweisung 610 ohne Einschränkung mehrere SIMD-Varianten, Datentypen/Datengrößen oder jede Kombination davon.
  • Wie gezeigt, ist in einigen Ausführungsformen ein VIMNMX-Anweisungsformat 812 „VIMNMX{.fmt} result, pu, pv, px, py, source_a, source_b, min_or_max“. Dementsprechend beinhaltet jede VIMNMX-Anweisung 810 ohne Einschränkung einen Anweisungsnamen „VIMNMX“; einen optionalen .fmt-Modifikator; result, pu, pv, px, py, source_a, source_b, und einen min_or_max-Spezifizierer. In einigen Ausführungsformen ist result der Zieloperand, source_a und source_b sind Quelloperanden, und der min_or_max-Spezifizierer gibt an, ob die VIMNMX-Anweisung das Minimum oder Maximum von source_a und source_b berechnet.
  • In einigen Ausführungsformen sind pu, pv, px und pyjeweils Prädikatswerte für die Bahnen 0-3. In denselben oder anderen Ausführungsformen beinhalten zulässige Werte für den .fmt Modifikator unter anderem „.U32", „.S32", „.U16×2", „.S16×2", „.U16×2", „.S16×2", „.U8×4" und „.S8×4", die einer 32-Bit-Ganzzahl ohne Vorzeichen, einer 32-Bit-Ganzzahl mit Vorzeichen und zwei gepackten 16-Bit- Ganzzahlen ohne Vorzeichen, zwei gepackten 16-Bit-Ganzzahlen mit Vorzeichen, vier gepackten acht-Bit-Ganzzahlen ohne Vorzeichen bzw. vier gepackten acht-Bit-Ganzzahlen mit Vorzeichen entsprechen.
  • In einigen Ausführungsformen sind VIMNMX.U32 und VIMNMX.S32-Anweisungen Kein-SIMD-Varianten der VIMNMX-Anweisung 810, die das Ergebnis gleich minimum/maximum von source_a und source_b setzen und über den Prädikatswert pu angeben, ob source_b der minimum/maximum. In denselben oder anderen Ausführungsformen verwenden VIMNMX.U32- und VIMNMX.S32-Anweisungen pv, px und py nicht. In einigen Ausführungsformen können pv, px und py aus VIMNMX.U32- und VIMNMX.S32-Anweisungen weggelassen werden.
  • In einigen Ausführungsformen sind VIMNMX.U16x2 und VIMNMX.S16x2-Anweisungen 2-Wege-SIMD-Varianten der VIMNMX-Anweisung 810, die die ersten 16 Bits des Ergebnisses gleich minimum/maximum der ersten 16 Bit von source_a und der ersten 16 Bits von source_b setzen; ob die ersten 16 Bits der Quelle b sind minimum/maximum über das Prädikat pu angeben; die letzten 16 Bits von result gleich dem Minimum/Maximum der letzten 16 Bits von source _a und der letzten 16 Bits von source_b setzen; und über das Prädikat pv angeben, ob die letzten 16 Bits von source_b das Minimum/Maximum ist. In denselben oder anderen Ausführungsformen verwenden VIMNMX.U16x2- und VIMNMX.S16x2-Anweisungen nicht px und py nicht. In einigen Ausführungsformen können px und py aus VIMNMX.U16x2 und VIMNMX.S16x2 weggelassen werden.
  • In denselben oder anderen Ausführungsformen sind VIMNMX.U8x4- und VIMNMX.S8x4-Anweisungen 4-Wege-SIMD-Varianten der VIMNMX-Anweisung 810, die die gepackten 8-Bit-Ganzzahlen bestimmt, die den Bahnen 0-3 in result und den Prädikatswerten pu, pv, px, py entsprechen, basierend auf dem Ergebnis basierend auf den gepackten 8-Bit-Ganzzahlen, die jeweils den Bahnen 0-3 in source_a entsprechen, und den gepackten 8-Bit-Ganzzahlen, die jeweils den Bahnen 0-3 in source_b entsprechen.
  • Jeder SM 310 kann die VIMNMX-Anweisung 810 auf jede technisch machbare Weise ausgeben und ausführen. In einigen Ausführungsformen werden Operationen, die von dem SM 310 durchgeführt werden können, um die VIMNMX-Anweisung 810 auszuführen, von dem folgenden beispielhaften Pseudocode (11) veranschaulicht:
  •          // VIMNMX{.fmt} result, pu, pv, px, py, source_a, source_b, min_or_max
     (11) //.fmt: .U32, .S32, .U16x2, .S16x2, .U8x4, .S8x4
             // result: instruction result
             // pu: predicate value for lane 0, pv: predicate value for lane 1
             // px: predicate value for lane 2, py: predicate value for lane 3
             // source_a: value a, source_b: value b
             READ_SOURCE_DATA(*tmp, reg)
                tmp = register[reg]
             WRITE_DESTINATION_DATA(*tmp, reg, size)
                register[reg] = *tmp
             PRED_WRITE(*tmp, preg)
                wenn (preg == PT)
                    return;
                predicate_register &= ~(1 << preg);
                predicate_register |= (tmp & 0×1) << preg;
             MIN_MAX(value1, value2, width, min, signed)
                uint32_t MASK = (1 << width) - 1;
                wenn (signed) {
                    uint32_t SIGN EXT = -MASK;
                    uint32_t SIGN_BIT = 1 << (width - 1); 
    
    
    
    
    
                    int32_t a_int = (int)(a & MASK);
                    int32_t b_int = (int)(b & MASK);
                    wenn (a_int & SIGN_BIT) a_int |= SIGN_EXT;
                    wenn (b_int & SIGN_BIT) b_int |= SIGN_EXT;
                    int result;
                    wenn (min)
                         result = a_int < b_int ? a_int : b_int;
                    else
                         result = a_int >= b_int ? a_int : b_int;
                    return result & MASK;
             } else {
                    a &= MASK;
                    b &= MASK;
                    int result;
                    wenn (min)
                         result = a < b ? a : b;
                    else
                         result = a >= b ? a : b;
                    return result;
                }
             switch(inst.fmt) {
                case .S32: ELEMENTS = 1; SIGNED = true; WIDTH = 32; break;
                case .S16x2: ELEMENTS = 2; SIGNED = true; WIDTH = 16; break;
                case .S8x4: ELEMENTS = 4; SIGNED = true; WIDTH = 8; break;
                case .U32: ELEMENTS = 1; SIGNED = false; WIDTH = 32; break;
                case .U16x2: ELEMENTS = 2; SIGNED = false; WIDTH = 16; break;
                case .U8x4: ELEMENTS = 4; SIGNED = false; WIDTH = 8; break;
             uint32_.t MASK = (1 « WIDTH) - 1;
             uint32_.t Ergebnis = 0;
             bool pu = false, pv = false, px = false, py = false;
             READ_SOURCE_DATA(source_a, inst.source_a); 
    
    
    
    
    
             READ_SOURCE_DATA(source_b, inst.source_b);
             für (uint i = 0; i < ELEMENTS; ++i) {
                int32_t bits a = (source_a » (i * WIDTH)) & MASK;
                int32_t bits b = (source_b >> (i * WIDTH)) & MASK;
                tmp = MIN_MAX(a, b, WIDTH, min, SIGNED);
                wenn (inst.relu)
                    tmp = MlN_MAX(tmp, 0, WIDTH, False, True);
                wenn (i == 0) pu = (tmp == a);
                wenn (i == 1) pv = (tmp == a);
                wenn (i == 2) px = (tmp == a);
                wenn (i == 3) py = (tmp == a);
                result |= (tmp & MASK) << (WIDTH * i);
             }
             WRITE_DESTINATION_DATA(result, inst.result);
             PRED_WRITE(pu, inst.Pu);
             PRED_WRITE(pv, inst.Pu);
             PRED_WRITE(px, inst.Px);
             PRED_WRITE(py, inst.Py);
  • In einigen Ausführungsformen implementiert der SW-Kernel 192 eine Maximalbewertungs-/Spaltensequenz 830(0), um eine maximale Teilalignierungsbewertung und die entsprechende maximale Bewertungsspalte (in der Bewertungsmatrix) beim zeilenweise Berechnen für jedes einer beliebigen Anzahl lokaler Sequenzalignierungsprobleme zu bestimmen.
  • Wie gezeigt, ist die Maximalbewertungs-/Spaltensequenz 830(0) eine Zwei-Anweisungs-Sequenz. Die erste Anweisung ist die VIMNMX-Anweisung 810, die eine maximale Bewertung (als maxH bezeichnet) mit einer aktuellen Bewertung (als H bezeichnet) überschreibt, falls die aktuelle Bewertung größer als die maximale Bewertung ist, und schreibt ein Vergleichsergebnis (als P0 bezeichnet), das angibt, ob die maximale Bewertung in einem Prädikatsregister aktualisiert wurde. Die zweite Anweisung ist eine SEL-Anweisung, die eine maximale Bewertungsspalte (bezeichnet als maxHcol) mit einer aktuellen Spalte (bezeichnet als col) überschreibt, falls das Prädikat angibt, dass die maximale Bewertung aktualisiert wurde.
  • Wie gezeigt, erfordert die Ausführung der Maximalbewertungs-/Spaltensequenz 830(0) 2 Anweisungen. Im Vergleich zu der herkömmlichen Maximalbewertungs-/Spaltensequenz 802, erfordert die Maximalbewertungs-/Spaltensequenz 830(0) eine Anweisung weniger. Obwohl dies nicht gezeigt ist, kann im Vergleich zu zwei herkömmlichen Maximalbewertungs-/Spaltensequenzen die Verwendung einer 2-Wege-SIMD-Variante der VIMNMX-Anweisung 810 3 Anweisungen weniger erfordern. Und im Vergleich zu vier herkömmlichen Maximalbewertungs-/Spaltensequenzen kann die Verwendung einer 4-Wege-SIMD-Variante der VIMNMX-Anweisung 810 5 Anweisungen weniger erfordern.
  • In einigen anderen Ausführungsformen implementiert der SW-Kernel 192 eine Maximalbewertungs-/Spaltensequenz 830(1), um eine maximale Teilalignierungsbewertung und die entsprechende maximale Bewertungsspalte (in der Bewertungsmatrix) beim zeilenweise Berechnen für jedes einer beliebigen Anzahl lokaler Sequenzalignierungsprobleme zu bestimmen.
  • Wie gezeigt, ist die Maximalbewertungs-/Spaltensequenz 830(1) eine Zwei-Anweisungs-Sequenz. Die erste Anweisung ist die VIMNMX-Anweisung 810, die eine maximale Bewertung (als maxH bezeichnet) mit einer aktuellen Bewertung (als H bezeichnet) überschreibt, falls die aktuelle Bewertung größer als die maximale Bewertung ist, und schreibt ein Vergleichsergebnis (als P0 bezeichnet), das angibt, ob die maximale Bewertung in einem Prädikatsregister aktualisiert wurde. Die zweite Anweisung ist eine prädikatisierte BRA-Anweisung, die sich zu Code (bezeichnet als updateMaxHcol) verzweigt, der eine maximale Bewertungsspalte (bezeichnet als maxHcol) mit einer aktuellen Spalte (bezeichnet als col) überschreibt, falls das Prädikat angibt, dass die maximale Bewertung aktualisiert wurde.
  • Wie gezeigt, erfordert das Ausführen der Maximalbewertungs-/Spaltensequenz 830(1) 2 Ausgangsschlitze in der Ganzzahl-Pipeline und 1 Ausgangsschlitz in einer Verzweigungspipeline. Im Vergleich zu der Maximalbewertungs-/Spaltensequenz 802, erfordert die Maximalbewertungs-/Spaltensequenz 830(1) zwei Ausgangsschlitze weniger in der Ganzzahl-Pipeline und kann daher einen Gesamtrechendurchsatz erhöhen. Obwohl dies nicht gezeigt ist, kann im Vergleich zu zwei herkömmlichen Maximalbewertungs-/Spaltensequenzen die Verwendung einer 2-Wege-SIMD-Variante der VIMNMX-Anweisung 810 die Gesamtberechnung durchgehend weiter erhöhen. Und im Vergleich zu vier herkömmlichen Maximalbewertungs-/Spaltensequenzen kann die Verwendung einer 4-Wege-SIMD-Variante der VIMNMX-Anweisung 810 die Gesamtberechnung insgesamt weiter erhöhen.
  • Im Allgemeinen führt die VIMNMX-Anweisung 810 eine Minimum/Maximum-Operation auf 1-4 maximalen „Basis“-Wert(en) durch und stellt 1-4 Prädikat(e), die das/die Vergleichsergebnis(se) angeben, bereit. Wie die Maximalbewertungs-/Spaltensequenzen 830(0) und 830(1) veranschaulichen, kann die Verwendung des Prädikats/der Prädikate zum Speichern anderer Werte auf der Grundlage des Vergleichsergebnisses/der Vergleichsergebnisse den Rechendurchsatz durchgehend erhöhen, wenn mehrere Werte basierend auf vielen Typen herkömmlicher Vergleichsanweisung gespeichert werden.
  • 9 ist eine beispielhafte Veranschaulichung von SW-Zwei-Probleme-Pseudocode 910, der von dem SW-Kernel 192 der 1 gemäß verschiedenen Ausführungsformen ausgeführt wird. Zu Erläuterungszwecken veranschaulicht der SW-Zwei-Probleme-Pseudocode 910 eine Matrix-Füllphase, in der jeder Thread in dem CTA 312 eine Teilalignierungsbewertung für jede Position in der entsprechenden Bewertungsmatrix, eine maximale Teilalignierungsbewertung, eine maximale Bewertungsspalte, und eine Zeile mit maximaler Bewertung für jedes von zwei lokalen Alignierungsproblemen berechnet. Da jeder Thread Teilalignierungsbewertungen für zwei lokale Alignierungsproblemen berechnet, ist der Thread-Berechnungs-SIMD-Modus 2-Wege-SIMD. Insbesondere verwendet der SW-Einzelproblem-Pseudocode 1010 das verschachtelte Zellenlayout 450(0), die SW-Anweisung 610 und die VIMNMX-Anweisung 810.
  • Gemäß dem Initialisierungspseudocode 920 initialisiert der SW-Kernel 192 einen Ergebnissatz, die sich in einer Registerdatei und zwei Arrays (N+1) SWcell16s 464 davon befindet, die sich in der Registerdatei befinden. Der Ergebnissatz beinhaltet ohne Einschränkung sechs 16-Bit-Ganzzahlen, die einer maximalen Teilalignierungsbewertung, einer maximalen Bewertungsspalte und einer Zeile mit maximaler Bewertung für jedes von zwei lokalen Alignierungsproblemen entsprechen.
  • Der SW-Kernel 192 durchläuft eine Bewertungsmatrix Zeile für Zeile, beginnend mit der -Zeile nach der Anfangsinitialisierungszeile. Wie zuvor hierin in Verbindung mit 4 beschrieben, implementiert der SW-Kernel 192 eine Austauschtechnik mit aktueller Zeile/vorhergehender Zeile, um die zwei Arrays von SWcells16s 464 wiederzuverwenden. Der Zeilenkennungs-Austausch-Pseudocode 930 identifiziert den entsprechenden Abschnitt des SW-Zwei-Probleme-Pseudocodes 910.
  • Gemäß dem Substitutionswertzuweisungs-Pseudocode 940 kopiert der SW-Kernel 192 für alle Spalten mit Ausnahme der Initialisierungsspalten in einer aktuellen Zeile zwei Substitutionswerte aus der Substitutionsmatrix 444 in die richtigen SWcells16s 464. Vorteilhafterweise ermöglicht es das Implementieren einer Substitutionswertschleife vorher unabhängig von einer Teilalignierungsschleife einem Warp, die Substitutionswertschleife unter Verwendung eines Satzes von Anweisungen (z. B. Laden usw.) auszuführen, während ein anderer Warp eine Hauptschleife unter Verwendung eines anderen Satzes von Anweisungen (z. B. die SW.16-Anweisung usw.) ausführt.
  • Gemäß einer Hauptschleife des SW-Zwei-Probleme-Pseudocodes 910 führt der SW-Kernel 192 für alle Spalten mit Ausnahme der Initialisierungsspalten in einer aktuellen Zeile den Teilalignierungsberechnungs-Pseudocode 950 und den Ergebnisberechnungs-Pseudocode 960 aus. Der Teilalignierungsberechnungs-Pseudocode 950 ist ein Aufruf einer intrinsischen Funktion _SW_16, die ein Wrapper für die 2-Wege-SIMD-Variante (SW.2) der SW-Anweisung 610 ist. Das Ausführen der SW.2-Anweisung veranlasst den SM 310, die Teilalignierungsdaten für die aktuelle Zeile und die aktuelle Spalte für die zwei zugewiesenen lokalen Alignierungsprobleme zu berechnen. Dementsprechend führt der SW-Kernel 192 eine einzige Anweisung aus, um zwei E-Werte, zwei F-Werte und zwei Teilalignierungsbewertungen zu berechnen und zu speichern (in einer der SWcell16s 464, die sich in der Registerdatei befinden).
  • Wie gezeigt, beinhaltet der Ergebnisberechnungs-Pseudocode 960 ohne Einschränkung einen Aufruf einer intrinsischen Funktion _vimnmx_16, die ein Wrapper für eine 2-Wege-SIMD-Variante (VIMNMX.S16X2) der VIMNMX-Anweisung 810 gefolgt von zwei Sätzen von Prädikat-bedingtem Aktualisierungs-Pseudocode ist. Dementsprechend führt der SW-Kernel 192 eine einzige Anweisung aus, um die zwei maximalen bisherigen Teilalignierungsberechnungen und zwei Prädikatwerte pu und pv zu berechnen und zu speichern. Der SW-Kernel 192 aktualisiert dann bedingt die maximale Bewertungsspalte und die maximale Bewertungszeile für keines, eines oder beide der zugewiesenen lokalen Alignierungsprobleme basierend auf pu und pv.
  • 10 ist eine beispielhafte Veranschaulichung eines SW-Einzelproblem-Pseudocodes 1010, der von dem SW-Kernel 192 der 1 ausgeführt wird, gemäß anderen verschiedenen Ausführungsformen. Zur Erläuterung veranschaulicht der SW-Einzelproblem-Pseudocode 1010 eine Matrixfüllphase, in der jeder Thread in dem CTA 312 eine Teilalignierungsbewertung für jede Position in der entsprechenden Bewertungsmatrix, eine maximale Teilalignierungsbewertung, eine maximale Bewertungsspalte und eine maximale Bewertungszeile für ein einziges lokales Alignierungsproblem berechnet. Da jeder Thread Teilalignierungsbewertungen für ein einziges lokales Alignierungsproblem berechnet, ist der Thread-Berechnungs-SIMD-Modus Kein-SIMD.
  • Der SW-Einzelproblem-Pseudocode 1010 verwendet das verschachtelte Zellenlayout 450(1), den SW-Sequenz-Pseudocode 1002 und die VIMNMX-Anweisung 810. Wie gezeigt, ist der SW-Sequenz-Pseudocode 1002 eine intrinsische Funktion _sw6_1, die eine Sequenz aus sechs Anweisungen pro Thread für eine SW-Bewertungsberechnung für einen Thread-Berechnungsmodus von Kein-SIMD-Thread, der Matrix-Fülldatensatz 490(1) und 32-Bit-Ganzzahlen mit Vorzeichen ist. Die Sequenz aus sechs Anweisungen pro Thread ist eine spezifische Variante der SW-Sequenz 740, die dem Thread-Berechnungsmodus von Kein-SIMD, dem Matrix-Fülldatensatz 490(1) und 32-Bit-Ganzzahlen mit Vorzeichen entspricht. Wie gezeigt, verwendet der SW-Sequenz-Pseudocode 1002 intrinsische Funktionen_viadd, _viaddmnmx, und _vimnmx3, die Wrapper für die VIADD.32-Anweisung, die VIADDMNMX.S32-Anweisung bzw. die VIMNMX3.S32-Anweisung sind, um die zuvor hierin in Verbindung mit 5 beschriebene Kein-SIMD-SW-Sequenz 742 unter Verwendung von 32-Bit-Operanden mit Vorzeichen und Ganzzahlen, die in dem Matrix-Fülldatensatz 490(1) beinhaltet sind, zu implementieren.
  • Unter Bezugnahme auf den SW-Einzelproblem-Pseudocode 1010, initialisiert der SW-Kernel 192 gemäß dem Initialisierungs-Pseudocode 1020 einen Ergebnissatz, der sich in einer Registerdatei befindet, zwei Arrays von (N+1) HEcell32s 562, die sich in der Registerdatei befinden, ein F-Array von (N+1) 32-Bit-Ganzzahlen und ein S-Array von N 32-Bit-Ganzzahlen initialisiert. Der Ergebnissatz beinhaltet ohne Einschränkung drei 32-Bit-Ganzzahlen, die einer maximalen Teilalignierungsbewertung, einer maximalen Bewertungsspalte und einer maximalen Bewertungszeile entsprechen.
  • Der SW-Kernel 192 durchläuft eine Bewertungsmatrix Zeile für Zeile, beginnend mit der -Zeile nach der Anfangsinitialisierungszeile. Wie zuvor hierin in Verbindung mit 5 beschrieben, implementiert der SW-Kernel 192 eine Austauschtechnik mit aktueller Zeile/vorheriger Zeile, um die zwei Arrays von HEcell32s 562 wiederzuverwenden. Der Zeilenkennungs-Austausch-Pseudocode 1030 identifiziert den entsprechenden Teil des SW-Einzelproblem-Pseudocodes 1010.
  • Gemäß dem Substitutionswertzuweisungs-Pseudocode 1040 kopiert der SW-Kernel 192 für alle Spalten mit Ausnahme der Initialisierungsspalten in einer aktuellen Zeile einen Substitutionswert aus der Substitutionsmatrix 444 zu in dem S-Array. Vorteilhafterweise ermöglicht das Implementieren einer Substitutionswertschleife vorab unabhängig von einer Teilalignierungsschleife, dass ein Warp die Substitutionswertschleife unter Verwendung eines Satzes von Anweisungen (z. B. Laden usw.) ausführt, während ein anderer Warp eine Hauptschleife mit einem anderen Satz von Anweisungen (z. B. VIADD.32 Anweisung usw.) ausführt.
  • Gemäß einer Hauptschleife des SW-Einzelproblem-Pseudocodes 1010 führt der SW-Kernel 192 für alle Spalten mit Ausnahme der Initialisierungsspalten in einer aktuellen Zeile den Teilalignierungsberechnungs-Pseudocode 1050 und den Ergebnisberechnungs-Pseudocode 1060 aus. Der Teilalignierungsberechnungs-Pseudocode 1050 ist ein Aufruf einer intrinsischen Funktion _sw6_1, die oben in Verbindung mit dem SW-Einzelproblem-Pseudocode 1010 beschrieben ist. Das Ausführen der intrinsischen Funktion _sw6_1 veranlasst, dass der SM 310 eine Sequenz aus sechs Anweisungen ausführt, um für die aktuelle Zeile und die aktuelle Spalte für das zugewiesene lokale Alignierungsproblem den E-Wert und die Teilalignierungsbewertung in einer der HEcell32s 562 und den F-Wert in dem F-Array zu berechnen und zu speichern.
  • Wie gezeigt, beinhaltet der Pseudocode des Ergebnisberechnungs-Pseudocodes 1060 ohne Einschränkung einen Aufruf einer intrinsischen Funktion _vimnmx_32, die ein Wrapperfürdie Kein-SIMD-Variante (VIMNMX.U32) der VIMNMX-Anweisung 810 ist, gefolgt von einem Prädikat-bedingten Aktualisierungs-Pseudocode. Dementsprechend führt der SW-Kernel 192 eine einzige Anweisung aus, um die bisherigen maximalen Teilalignierungsbewertungen und einen Prädikatwert pu zu berechnen und zu speichern. Der SW-Kernel 192 aktualisiert dann bedingt die maximale Bewertungsspalte und die maximale Bewertungszeile der zugewiesenen lokalen Alignierungsprobleme basierend auf pu.
  • 11 veranschaulicht, wie die Anweisungen der 6 und 9 in den Ausführungseinheiten implementiert werden, gemäß verschiedenen Ausführungsformen. Wie gezeigt, beinhaltet eine Anweisungsimplementierung 1180 ohne Einschränkung eine VIADD-Implementierung 1182, eine VIADDMNMX-Implementierung 1184 und eine VIMNMX3-Implementierung 1186 so wie eine VIMNMX-Implementierung 1188. Nur zu Erläuterungszwecken werden optionale Negationen und .relu-Modifikatoren in Bezug auf 11 nicht berücksichtigt.
  • Unter erneuter Bezugnahme auf 3B sind in einigen Ausführungsformen eine Gleitkomma-Ausführungseinheit 1110 und eine Ganzzahl-Ausführungseinheit 1130 in jeder der Kerndatenpfadeinheiten 350 beinhaltet. In denselben oder anderen Ausführungsformen sind die Gleitkomma-Ausführungseinheit 1110 und die Ganzzahl-Ausführungseinheit 1130 Ausführungseinheiten. In einigen Ausführungsformen werden Anweisungen über Anweisungsdecodierer decodiert, die in der Arbeitsverteilungs-Kreuzschiene 316 beinhaltet sind, und über die Micro-Scheduler-Dispatch-Einheit 340 an Ausführungseinheiten und/oder die MIO-Steuereinheit 370 ausgegeben.
  • Die VIADD-Implementierung 1182 beschreibt in einigen Ausführungsformen die Implementierung der zuvor hierin in Verbindung mit 11 beschriebenen VIADD-Anweisung in Bezug auf einen Addierer 1120, der in einem Beispiel der Gleitkomma-Ausführungseinheit 1110 beinhaltet ist, die in einer FP-Pipeline des SM 310 implementiert ist, in einigen Ausführungsformen. Wie gezeigt, werden Signale, die den Quelloperanden source_a und source_b der VIADD-Anweisungen entsprechen, hier als „A“ und „B“ bezeichnet und in den Addierer 1120 eingegeben. Als Reaktion darauf berechnet der Addierer 1120 ein Signal, das als (A+B) bezeichnet wird, das dem Ergebnis der VIADD-Anweisung entspricht, und gibt es aus.
  • In einigen Ausführungsformen beschreiben die VIADDMNMX-Implementierung 1184, die VIMNMX3-Implementierung 1186 und die VIMNMX-Implementierung 1188 Implementierungen der entsprechenden Anweisungen in Bezug auf einen beispielhaften Teil der Ganzzahl-Ausführungseinheit 1130, die in einigen Ausführungsformen in einer Ganzzahl-Pipeline des SM 310 implementiert ist. In einigen Ausführungsformen beinhaltet die Ganzzahl-Ausführungseinheit 1130 ohne Einschränkung einen Addierer 1140, einen Mux 1150, einen Addierer 1160 und einen Mux 1170. Eine Anweisungssteuerung1132 wird zu dem Addierer 1140, Mux 1150, Addierer 1160 und Mux 1170 geleitet und steuert deren Betrieb.
  • Signale, die den Quelloperanden source_a und source_b von jeder der VIADDMNMX-Anweisung, der VIMNMX3-Anweisung und der VIMNMX-Anweisung 810 entsprechen, werden hier als „A“ und „B“ bezeichnet und werden in den Addierer 1140 eingegeben. Ein Signal, das dem Quelloperanden source_c jeder der VIADDMNMX-Anweisungen und der VIMNMX3-Anweisungen entspricht, wird hier als „C“ bezeichnet, wird in den Addierer 1160 und den Mux 1170 eingegeben.
  • In einigen Ausführungsformen berechnet der Addierer 1140 (A+B) gemäß der VIADDMNMX-Implementierung 1184. Der Mux 1150 wählt (A+B) aus. Der Addierer 1160 errechnet (A+B+C) und ein Steuersignal 1134(1) . Basierend auf dem Steuersignal 1134(1), gibt derMux 1170 das Maximum oder Minimum von(A+B) und das Signal C aus.
  • In einigen Ausführungsformen berechnet der Addierer 1140 (A+ B) gemäß der VIMNMX3-Implementierung 1186 und ein Steuersignal 1134(0). Basierend auf dem Steuersignal 1134(0) wählt der Mux 1150 das Minimum oder Maximum von A und B aus. DerAddierer 1160 berechnet C+ (Minimum oder Maximum von A und B) und ein Steuersignal 1134(1). Basierend auf dem Steuersignal 1134(1), gibt derMux 1170 das Maximum oder Minimum von A, B und C aus.
  • In einigen Ausführungsformen gibt der Addierer 1140 gemäß der VIMNMX-Implementierung 1188 (A+B) und die Prädikatwerte pu, pv, px und py aus.
  • 12A ist eine beispielhafte Veranschaulichung einer 2-Wege-SIMD-Matrix-Füllphase 1210(0), die von dem CTA 312 der 3A ausgeführt wird, gemäß verschiedenen Ausführungsformen. Genauer gesagt veranschaulicht 12A ein Beispiel dafür, wie das CTA 312 eine „Mehrfach-Probleme-pro-Thread“-Technik anwenden kann, um eine 2-Wege-SIMD-Matrix-Füllphase auszuführen. Bei den Techniken mit mehreren Problemen pro Thread werden jedem Thread in dem CTA 312 zwei unterschiedliche lokale Alignierungsprobleme zugewiesen. Für jedes lokale Alignierungsproblem berechnet der zugewiesene Thread Teilalignierungsbewertungen für jede Position in einer assoziierten Bewertungsmatrix in einer zeilenweisen Art, eine maximale Teilalignierungsbewertung und eine maximale Bewertungsposition, die die Zeile und Spalte der maximalen Teilalignierungsbewertung in der Bewertungsmatrix angibt.
  • Im Betrieb initialisiert ein gegebener Thread E0-, E1-, H0- und H1-Werte in jeder Anfangszelle in einer Anfangszeile 0, und F0-, F1-, H0- und H1-Werte in jeder Anfangszelle in einer Anfangsspalte 0, wobei E0, F0, und H0 einem der zugewiesenen lokalen Alignierungsprobleme entsprechen, und E1, F1 und H1 dem anderen zugewiesenen lokalen Alignierungsproblem entsprechen. Der Thread berechnet dann nacheinander die Werte E0, E1, H0 und H1 für die Positionen (1, 1)-(1, N+1), die einer Links-nach-Rechts-Durchquerung von Zeile 1, entsprechen, wobei eine oder beide der maximalen Teilalignierungsbewertungen und maximalen Bewertungspositionen nach Bedarf aktualisiert werden. Nach dem Durchqueren von Zeile 1 berechnet der Thread sequenziell E0-, E1-, H0- und H1-Werte für die Positionen (2, 1 )-(2, N+1), die einer Links-nach-Rechts-Durchquerung der Zeile 2 entsprechen. Der Thread fährt damit fort, Positionen in der Bewertungsmatrix auf diese Weise zu verarbeiten, bis der Thread die Verarbeitung der (M, N)-Position in der Bewertungsmatrix beendet. Der Thread speichert dann die maximale Teilalignierungsbewertung und die maximale Bewertungsposition für jedes der zugewiesenen lokalen Alignierungsprobleme in dem globalen Speicher.
  • Zu Erläuterungszwecken wird das inkrementelle Fortschreiten eines Threads 1220(0) und eines Threads 1220(1) über zwei Schnappschüsse, die einem früheren Zeitpunkt 1202 und einem späteren Zeitpunkt 1230 entsprechen, abgebildet. Wie gezeigt, verarbeitet der Thread 1220(0) ein lokales Alignierungsproblem 1212(0) und ein lokales Alignierungsproblem 1212(1 ). Wie gezeigt, verarbeitet der Thread 1220(1) ein lokales Alignierungsproblem 1212(2) und ein lokales Alignierungsproblem 1212(3).
  • Zu dem früheren Zeitpunkt 1202 hat der Thread 1220(0) ein Drittel der Zeilen in einer Bewertungsmatrix (nicht gezeigt), die mit dem Thread 1220(0) und den lokalen Alignierungsproblemen 1212(0) und 1212(1) assoziiert ist, verarbeitet. Die verarbeiteten Zeilen entsprechen einem Drittel der Zielsymbole, die mit dem lokalen Alignierungsproblem 1212(0) assoziiert sind, und einem Drittel der Zielsymbole, die mit dem lokalen Alignierungsproblem 1212(1) assoziiert sind. Zu dem früheren Zeitpunkt 1202, hat der Thread 1220(1) ein Drittel der Zeilen in einer Bewertungsmatrix (nicht gezeigt), die mit dem Thread 1220(1) und den lokalen Alignierungsproblemen 1212(2) und 1212(3) assoziiert ist, verarbeitet. Die verarbeiteten Zeilen entsprechen einem Drittel der Zielsymbole, die mit dem lokalen Alignierungsproblem 1212(2) assoziiert sind, und einem Drittel der Zielsymbole, die mit dem lokalen Alignierungsproblem 1212(3) assoziiert sind.
  • Zu dem späteren Zeitpunkt 1230, hat der Thread 1220(0) die Hälfte der Zeilen in der Bewertungsmatrix, die mit dem Thread 1220(0) und den lokalen Alignierungsproblemen 1212(0) und 1212(1) assoziiert ist, verarbeitet. Die verarbeiteten Zeilen entsprechen der Hälfte der Zielsymbole, die mit dem lokalen Alignierungsproblem 1212(0) assoziiert sind, und der Hälfte der Zielsymbole, die mit dem lokalen Alignierungsproblem 1212(1) assoziiert sind. Zu dem späteren Zeitpunkt 1230, hat der Thread 1220(1) die Hälfte der Zeilen in der Bewertungsmatrix, die mit dem Thread 1220(1) und den lokalen Alignierungsproblemen 1212(2) und 1212(3) assoziiert ist, verarbeitet. Die verarbeiteten Zeilen entsprechen der Hälfte der Zielsymbole, die mit dem lokalen Alignierungsproblem 1212(2) assoziiert sind, und der Hälfte der Zielsymbole, die mit dem lokalen Alignierungsproblem 1212(3) assoziiert sind.
  • Es ist zu beachten, dass die hierin beschriebenen Techniken eher veranschaulichend als einschränkend sind und geändert werden können, ohne vom breiteren Geist und Umfang der Erfindung abzuweichen. Zahlreiche Modifikationen und Variationen der Funktionalität, die von der Software-Anwendung 190, dem SW-Kernel 192, dem CTA 312, dem Parallelverarbeitungs-Teilsystem 112, den PPUs, den SMs und der CPU bereitgestellt werden, ergeben sich für den Durchschnittsfachmann, ohne von dem Umfang und Geist der beschriebenen Ausführungsformen abzuweichen. Darüber hinaus können viele Techniken dazu verwendet werden, Bewertungsmatrizen zu durchqueren, und eine beliebige Anzahl dieser Techniken kann in Verbindung mit einer beliebigen Anzahl der zuvor hierin beschriebenen Techniken verwendet werden.
  • 12B ist eine beispielhafte Veranschaulichung einer 2-Wege-SIMD-Matrix-Füllphase 1210(1), die von dem CTA 312 der 3A ausgeführt wird,gemäß anderen verschiedenen Ausführungsformen. Genauer gesagt veranschaulicht 12A ein Beispiel dafür, wie ein Warp in dem CTA 312 eine „gestaffelte Thread“-Technik anwenden kann, um eine 2-Wege-SIMD-Matrix-Füllphase auszuführen. In einigen Ausführungsformen werden in der gestaffelten Thread-Technik jedem Warp in dem CTA 312 zwei unterschiedliche lokale Alignierungsprobleme zugewiesen. Jedem Thread wird basierend auf der Thread-ID innerhalb des Warps ein Satz von Spalten zugewiesen. Dem Thread 1220(0) werden die Spalten 1-N/T zugewiesen, wobei T die Gesamtzahl von Threads in dem Warp (z. B. 32) ist, werden dem Thread 1220(1) die Spalten (N/T+1)-(2*N/T) zugewiesen, und so weiter.
  • Zu Erläuterungszwecken werden die lokalen Alignierungsprobleme, die dem in 12B abgebildeten Warp zugewiesen sind, als „Problem A“ und „Problem B“ bezeichnet. In einigen Ausführungsformen führt der Warp die Matrix-Füllphase für die Probleme A und B über eine Gesamtzahl von Iterationen 1280 aus, die gleich (M+T-1 ) ist. Jeder Thread nimmt an M Iterationen teil. Für jeden Thread ist eine Anfangsiteration gleich der Thread-ID, eine letzte Iteration ist gleich (Thread-ID + M -1), und der Thread verarbeitet die zugewiesenen Spalten in Zeile 1 während der Anfangsiteration, die zugewiesenen Spalten in Zeile 2 während der nächsten Iteration und so weiter. In einigen Ausführungsformen kann der SW-Kernel die hierin beschriebene Thread-Staffelung über den folgenden Pseudocode (12) implementieren:
  •          für (iteration = 0 ; iteration <= last_iteration; ++iteration) {
     (12)
                row = iteration - thread_ID + 1; // thread_ID from 0 to T-1
                wenn (row > 0 && row <= M) {
                // process assigned columns in row
         }
    
        // threads executing if statement above
        // and threads skipping if statement converge 
    
    
    
    
    
    
  • In einigen Ausführungsformen initialisiert jeder Thread einen anderen Matrix-Fülldatensatz, der sich in einer assoziierten Registerdatei befindet. Thread 1220(0) initialisiert auch ein Anfangs-H und ein Anfangs-F, die mit einer Anfangsspalte assoziiert sind, auf Null. Nach dem Verarbeiten jeder Zeile stellt jeder der Threads 1220(0)-1220(T-2) einen Überlaufdatensatz 1290 an den Thread mit der nächsten Thread-ID bereit. Die Threads können den Überlaufdatensatz 1290 auf jede technisch machbare Weise bereitstellen. In einigen Ausführungsformen führen die Threads Register-zu-Register-Datenaustausche über Warp-Shuffle-Anweisungen (z. B. SHFL_SYNC) zum Austauschen der Überlaufdatensätze 1290 aus. In einigen Ausführungsformen veranlasst jede Warp-Shuffle-Anweisung, dass jeder einer Teilmenge von Threads, die an der Warp-Shuffle-Anweisung teilnehmen, Daten von einem Register, das mit dem Thread assoziiert ist, zu einem anderen Register, das mit einem anderen Thread assoziiert ist, zu übertragen.
  • Wie gezeigt, beinhaltet in einigen Ausführungsformen jeder Überlaufdatensatz 1290 ohne Einschränkung ein rightmostH, ein rightmost F, ein maxH und ein maxHCol. In Bezug auf den Thread, der den Überlaufdatensatz 1290 bereitstellt, beinhaltet das rightmostH den/die H-Wert(e), die der Zeile und der letzten zugewiesenen Spalte für die zugewiesenen lokalen Alignierungsprobleme entsprechend, das rightmostF beinhaltet den/die F-Wert(e), der/die der Zeile und der letzten zugewiesenen Spalte für die zugewiesenen lokalen Alignierungsprobleme entsprechen, maxH, der dem/den maximalen Teilalignierungsbewertung(en) in der Zeile bisher entsprechen, für die zugewiesenen lokalen Alignierungsprobleme, und maxHcol, der die Spalte(n), die der/den maximalen Teilalignierungsbewertung(en) in der bisherigen Zeile entsprechen.
  • In einigen Ausführungsformen führt jeder der Threads 1220(1 )-1220(T-1) vor der Verarbeitung jeder Zeile Initialisierungsoperationen basierend auf dem Überlaufdatensatz 1290, der von dem Thread 1220 für die Zeile empfangen wird, durch. In denselben oder anderen Ausführungsformen initialisiert und aktualisiert der Thread 1220(T-1) gegebenenfalls maximale Teilalignierungsbewertungen und maximale Bewertungspositionen für die zugewiesenen lokalen Alignierungsprobleme basierend auf den Überlaufdatensätzen 1290, die von dem Thread 1220(T-2) empfangen werden. Nach dem Verarbeiten der letzten Zeile speichert der Thread 1220(T-1) die maximale Teilalignierungsbewertung und die maximale Bewertungsposition für jedes der zugewiesenen lokalen Alignierungsprobleme in dem globalen Speicher.
  • Zu Erläuterungszwecken veranschaulicht 12B das Fortschreiten der Threads 1220(0)-1220(4) nach der fünften Iteration. Insbesondere haben die Threads 1220(5)-1220(T-1) noch keine Zeilen verarbeitet. Wie gezeigt, wird dem Thread 1220(0) ein Teil 1252(0) des Problems A, der den Spalten 1-(N/T) des lokalen Alignierungsproblems A entspricht, und ein Teil 1254(0) des Problems B, der den Spalten 1-(N/T) des lokalen Alignierungsproblems B entspricht, zugewiesen. Dem Thread 1220(1) werden ein Problem-A-Abschnitt 1252(1) und ein Problem-B-Abschnitt 1254(1) zugewiesen, und so weiter.
  • Zu dem in 12B abgebildeten Zeitpunkt hat der Thread 1220(0) die Zeilen1-5des Teils 1252(0) des Problems A und die Zeilen1-5des Teil des 1254(0) des Problems B verarbeitet und Überlaufdatensätze 1290 mit dem Thread 1220(1) über Warp-Shuffle-Operationen ausgetauscht. Der Thread 1220(1) hat die Zeilen 1-4 des Teils 1252(1) von Problem A und die Zeilen 1-4 des Teils 1254(1) des Problems B verarbeitet und Überlaufdatensätze 1290 mit dem Thread 1220(2) über Warp-Shuffle-Operationen ausgetauscht. Obwohl dies nicht gezeigt ist, hat der Thread 1220(2) die Zeilen 1-3 des Teils 1252(2) des Problems A und Zeilen 1-3 von des Teils 1254(2) des Problems B verarbeitet und Überlaufdatensätze 1290 mit dem Thread 1220(3) über Warp-Shuffle-Operationen ausgetauscht. Der Thread 1220(3) hat die Zeilen 1-2 des Teils 1252(3) des Problems A und Zeilen 1-2 des Teils 1254(3) des Problems B verarbeitet und Überlaufdatensätze 1290 mit dem Thread 1220(4) über Warp-Shuffle-Operationen ausgetauscht. Wie gezeigt, hat der -Thread 1220(4) Zeile 1 des Abschnitts 1252(4) des Problems A und Zeile 1 des Abschnitts 1254(4) des Problems B verarbeitet und einen der Überlaufdatensätze 1290 mit dem Thread 1220(5) über eine Warp-Shuffle-Operation ausgetauscht.
  • Es ist zu beachten, dass die hierin beschriebenen Techniken eher veranschaulichend als einschränkend sind und geändert werden können, ohne vom breiteren Geist und Umfang der Erfindung abzuweichen. Zahlreiche Modifikationen und Variationen der Funktionalität, die von der Software-Anwendung 190, dem SW-Kernel 192, dem CTA 312, dem Parallelverarbeitungs-Teilsystem 112, den PPUs, den SMs und der CPU bereitgestellt werden, ergeben sich für den Durchschnittsfachmann, ohne von dem Umfang und Geist der beschriebenen Ausführungsformen abzuweichen. In einem Beispiel kann die hierin beschriebene gestaffelte Thread-Technik für 2-Wege-SIMD modifiziert und auf eine 4-Wege-SIMD-Matrix-Füllphase und eine Kein-SIMD-Matrix-Füllphase angewandt werden. In einem anderen Beispiel kann in einigen Ausführungsformen die gestaffelte Thread-Technik auf Halb-Warps an Stelle von Warps angewandt werden, wobei jedem Halb-Warp ein unterschiedlicher Satz von 1, 2 oder 4 lokalen Alignierungsproblemen zugewiesen wird.
  • 13 ist ein Ablaufdiagramm von Verfahrensschritten zum Speichern von Teilalignierungsdaten beim Ausführen einer Matrix-Füllphase eines Smith-Waterman-Algorithmus, gemäß verschiedenen Ausführungsformen. Obwohl die Verfahrensschritte unter Bezugnahme auf die Systeme der 1-12 beschrieben sind, versteht der Fachmann, dass ein beliebiges System, das dazu konfiguriert ist, die Verfahrensschritte in einer beliebigen Reihenfolge durchzuführen, in den Umfang der vorliegenden Erfindung fällt.
  • Wie gezeigt, beginnt ein Verfahren 1300 bei Schritt 1302, bei dem ein Programm (z. B. die Software-Anwendung 190 oder der SW-Kernel 192) Probleme pro Thread 412, bezeichnet als P, Spalten pro Thread 414, bezeichnet als C, und ob ein verschachteltes Zellenlayout mit der SW-Anweisung 610 kompatibel sein soll, bestimmt. Falls das Programm bei Schritt 1304 bestimmt, dass das verschachtelte Zellenlayout mit der SW-Anweisung 610 kompatibel sein soll, fährt das Verfahren 1300 mit Schritt 1306 fort.
  • Falls das Programm bei Schritt 1306 bestimmt, dass die Probleme pro Thread 412 vier sind, fährt das Verfahren 1300 mit Schritt 1308 fort. Bei Schritt 1308 bestimmt das Programm, dass jedes Zellenlayout eine Verschachtelung von vier aufeinanderfolgenden 8-Bit-H-Werten, vier aufeinanderfolgenden 8-Bit-E-Werten, vier aufeinanderfolgenden 8-Bit-F-Werten und vier aufeinanderfolgenden 8-Bit-S-Werten ist, und dass daher jede SWcell 460 SWcell8 486 ist. Das Verfahren 1300 fährt dann direkt mit Schritt 1316 fort. Bei Schritt 1316 veranlasst das Programm, dass jeder Thread in einem oder mehreren CTAs 312 Teilalignierungsdaten über zwei Arrays von (C+1) SWcells 460 speichert, wenn die SW - Anweisung 610 oder die SW-Sequenz 740 für jede Kombination von C Abfragesymbolen und M Zielsymbolen ausgeführt wird. Das Verfahren 1300 endet dann.
  • Falls das Programm jedoch bei Schritt 1306 feststellt, dass die Probleme pro Thread 412 nicht vier sind, fährt das Verfahren 1300 direkt mit Schritt 1310 fort. Falls das Programm bei Schritt 1310 bestimmt, dass die Probleme pro Thread 412 zwei sind, fährt das Verfahren 1300 mit Schritt 1312 fort. Bei Schritt 1312 bestimmt das Programm, dass jedes Zellenlayout eine Verschachtelung von zwei aufeinanderfolgenden 16-Bit-H-Werten, zwei aufeinanderfolgenden 16-Bit-E-Werten, zwei aufeinanderfolgenden 16-Bit-F-Werten und zwei aufeinanderfolgenden 8-Bit-S-Werten ist, und dass daher jede SWcell 460 SWcell16 484 ist. Das Verfahren 1300 fährt dann direkt mit Schritt 1316 fort. Bei Schritt 1316 veranlasst das Programm, dass jeder Thread in einem oder mehreren CTAs 312 Teilalignierungsdaten über zwei Arrays von (C+1) SWcells 460 speichert, wenn die SW - Anweisung 610 oder die SW-Sequenz 740 für jede Kombination von C Abfragesymbolen und M Zielsymbolen ausgeführt wird. Das Verfahren 1300 endet dann.
  • Falls das Programm jedoch bei Schritt 1310 bestimmt, dass die Probleme pro Thread 412 nicht zwei sind, geht das Verfahren 1300 direkt zu Schritt 1314 weiter. Bei Schritt 1314 bestimmt das Programm, dass jedes Zellenlayout eine Verschachtelung eines 32-Bit-H-Werts, eines 32-Bit-E-Werts, eines 32-Bit-F-Werts und eines 8-Bit-S-Werts ist, und dass daher jeder SWcell 460 SWcell132 482 ist. Das Verfahren 1300 fährt dann direkt mit Schritt 1316 fort. Bei Schritt 1316 veranlasst das Programm, dass jeder Thread in einem oder mehreren CTAs 312 Teilalignierungsdaten über zwei Arrays von (C+1) SWcells 460 speichert, wenn die SW - Anweisung 610 oder die SW-Sequenz 740 für jede Kombination von C Abfragesymbolen und M Zielsymbolen ausgeführt wird. Das Verfahren 1300 endet dann.
  • Unter erneuter Bezugnahme auf Schritt 1304, geht das Verfahren 1300 direkt zu Schritt 1318 weiter, falls das Programm bei Schritt 1304 bestimmt, dass das verschachtelte Zellenlayout nicht mit der SW-Anweisung 610 kompatibel sein soll. Falls das Programm bei Schritt 1318 bestimmt, dass die Probleme pro Thread 412 vier sind, fährt das Verfahren 1300 mit Schritt 1320 fort. Bei Schritt 1320 bestimmt das Programm, dass jede F-Struktur 570 vier 8-Bit-F-Werte beinhalten soll, und dass jede S-Struktur 580 vier 8-Bit-S-Werte beinhalten soll. Bei Schritt 1322 bestimmt das Programm, dass jedes Zellenlayout eine Verschachtelung von vier aufeinanderfolgenden 8-Bit-H-Werten und vier aufeinanderfolgenden 8-Bit-E-Werten ist, und dass daher jede HEcell 560 SWcell8 566 ist. Das Verfahren 1300 fährt dann direkt mit Schritt 1334 fort. Bei Schritt 1334 veranlasst das Programm, dass jeder Thread in einem oder mehreren CTAs 312 Teilalignierungsdaten über zwei Arrays von (C+1) HEcells 560 speichert, wenn der oder die SW-Sequenz 740 für jede Kombination von C Abfragesymbolen und M Zielsymbolen ausgeführt wird. Das Verfahren 1300 endet dann.
  • Falls das Programm jedoch bei Schritt 1318 feststellt, dass die Probleme pro Thread 412 nicht vier sind, fährt das Verfahren 1300 direkt mit Schritt 1324 fort. Falls das Programm bei Schritt 1324 bestimmt, dass die Probleme pro Thread 412 zwei sind, fährt das Verfahren 1300 mit Schritt 1326 fort. Bei Schritt 1326 bestimmt das Programm, dass jede F-Struktur 570 zwei 16-Bit-F-Werte beinhalten soll und jede S-Struktur 580 zwei 16-Bit-S-Werte beinhalten soll. Bei Schritt 1328 bestimmt das Programm, dass jedes Zellenlayout eine Verschachtelung von zwei aufeinanderfolgenden 16-Bit-H-Werten und zwei aufeinanderfolgenden 16-Bit-E-Werten ist und daher jede HEcell 560 SWcell16 564 ist. Das Verfahren 1300 fährt dann direkt mit Schritt 1334 fort. Bei Schritt 1334 veranlasst das Programm, dass jeder Thread in einem oder mehreren CTAs 312 Teilalignierungsdaten über zwei Arrays von (C+1) SWcells 560 speichert, wenn der oder die SW-Sequenz 740 für jede Kombination von C Abfragesymbolen und M Zielsymbolen ausgeführt wird. Das Verfahren 1300 endet dann.
  • Falls das Programm jedoch bei Schritt 1324 feststellt, dass die Probleme pro Thread 412 nicht zwei sind, fährt das Verfahren 1300 direkt mit Schritt 1330 fort. Bei Schritt 1330 bestimmt das Programm, dass jede F-Struktur 570 einen 32-Bit-F-Werte beinhalten soll, und dass jede S-Struktur 580 einen 32-Bit-S-Werte beinhalten soll. Bei Schritt 1332 bestimmt das Programm, dass jedes Zellenlayout eine Verschachtelung eines 32-Bit-H-Werts und eines 32-Bit-E-Werts ist, und dass daher jede HEcell 560 SWcell32 562 ist. Das Verfahren 1300 fährt dann direkt mit Schritt 1334 fort. Bei Schritt 1334 veranlasst das Programm, dass jeder Thread in einem oder mehreren CTAs 312 Teilalignierungsdaten über zwei Arrays von (C+1) SWcells 560 speichert, wenn der oder die SW-Sequenz 740 für jede Kombination von C Abfragesymbolen und M Zielsymbolen ausgeführt wird. Das Verfahren 1300 endet dann.
  • 14 ist ein Ablaufdiagramm von Verfahrensschritten zum Durchführen von Teilalignierungsberechnungen über eine einzige Anweisung, wenn eine Matrix-Füllphase eines Smith-Waterman-Algorithmus ausgeführt wird, gemäß verschiedenen Ausführungsformen. Obwohl die Verfahrensschritte in Verbindung mit den Systemen der 1-4, 6, 8-9 und 11-12 beschrieben sind, versteht der Fachmann, dass ein beliebiges System, das dazu konfiguriert ist, die Verfahrensschritte in einer beliebigen Reihenfolge zu implementieren, in den Umfang der vorliegenden Erfindung fällt.
  • Wie gezeigt, beginnt ein Verfahren 1400 bei Schritt 1402, wobei ein Thread, der den SW-Kernel 192 ausführt, zwei Arrays von (N+1) SWcells 460, die sich in einer Registerdatei befinden, die ein Array als vorherige Zeile und das andere Array als aktuelle Zeile bezeichnen, initialisiert. Bei Schritt 1404 initialisiert der Thread eine maximale Teilalignierungsbewertung und eine maximale Bewertungsposition, die in der Registerdatei vorhanden sind, und wählt das/die anfängliche(n) Zielsymbol(e) aus. Bei Schritt 1406 generiert der Thread für jedes ausgewählte Zielsymbol die entsprechenden N Substitutionswerte, die in den N SWcells 460 ganz links in der vorherigen Zeile beinhaltet sind. Bei Schritt 1408 wählt der Thread die Spalte am weitesten links aus.
  • Bei Schritt 1410 führt der Thread eine SW -Anweisung aus, um die H-, E- und F-Werte zu generieren, die in der SWcell 460 in der aktuellen Zeile und der ausgewählten Spalte beinhaltet sind, basierend auf den zwei SWcells 460 in der Spalte links von der ausgewählten Spalte und den SWcellls 460 in der vorherigen Zeile und der ausgewählten Spalte. Bei Schritt 1412 führt der Thread eine VIMNMX-Anweisung aus, um die maximale(n) Teilalignierungsbewertung(en) zu aktualisieren und entsprechende(s) Prädikat(e) zu setzen. Bei Schritt 1414 aktualisiert der Thread die maximale Bewertungsposition, die jedem Kein-Null-Prädikat entspricht.
  • Bei Schritt 1416 bestimmt der Thread, ob die ausgewählte Spalte die letzte Spalte ist. Falls der Thread bei Schritt 1416 bestimmt, dass die ausgewählte Spalte nicht die letzte Spalte ist, fährt das Verfahren 1400 mit Schritt 1418 fort. Bei Schritt 1418 wählt der Thread die nächste Spalte aus. Das Verfahren 1400 kehrt dann zu Schritt 1410 zurück, wo der Thread eine SW -Anweisung ausführt, um die H-, E- und F-Werte, die in der SWcell 460 in der aktuellen Zeile und der ausgewählten Spalte beinhaltet sind, zu generieren.
  • Falls der Thread jedoch bei Schritt 1416 bestimmt, dass die ausgewählte Spalte die letzte Spalte ist, fährt das Verfahren 1400 direkt mit Schritt 1420 fort. Bei Schritt 1420 bestimmt der Thread, ob alle ausgewählten Zielsymbole die letzten Zielsymbole für die entsprechenden Zielsequenzen sind. Falls der SW-Kernel 192 bei Schritt 1420 bestimmt, dass mindestens ein ausgewähltes Zielsymbol nicht das letzte Zielsymbol ist, fährt das Verfahren 1400 mit Schritt 1422 fort. Bei Schritt 1422 tauscht der SW -Kern 192 die Zeilenbezeichnungen aus und wählt das/die nächste(n) Zielsymbol(e) aus. Das Verfahren 1400 kehrt dann zu Schritt 1406 zurück, wo für jedes ausgewählte Zielsymbol der Thread die entsprechenden N Substitutionswerte, die in den N SWcells 460 ganz links in der vorherigen Zeile beinhaltet sind, generiert.
  • Falls der SW-Kernel 192 bei Schritt 1420 jedoch feststellt, dass alle ausgewählten Zielsymbole die letzten Zielsymbole der entsprechenden Zielsequenzen sind, endet das Verfahren 1400.
  • 15 ist ein Ablaufdiagramm von Verfahrensschritten zum Durchführen von Teilalignierungsberechnungen über eine Anweisungssequenz, wenn eine Matrix-Füllphase eines Smith-Waterman-Algorithmus ausgeführt wird, gemäß verschiedenen Ausführungsformen. Obwohl die Verfahrensschritte in Verbindung mit den Systemen der 1-5, 7-8 und 10-12 beschrieben sind, versteht der Fachmann, dass ein beliebiges System, das dazu konfiguriert ist, die Verfahrensschritte in einer beliebigen Reihenfolge zu implementieren, in den Umfang der vorliegenden Erfindung fällt.
  • Wie gezeigt, beginnt ein Verfahren 1500 bei Schritt 1502, wobei ein Thread, der den SW-Kernel 192 ausführt, einen Matrix-Fülldatensatz (z. B. den Matrix-Fülldatensatz 490(0) oder den Matrix-Fülldatensatz 490(1)), der sich in einer Registerdatei befindet, initialisiert, wobei ein Array von Zellen als vorherige Zeile und das andere Array von Zellen als aktuelle Zeile bezeichnet wird. Bei Schritt 1504 initialisiert der Thread für jedes lokale Alignierungsproblem eine maximale Teilalignierungsbewertung und eine maximalen Bewertungsposition, die in der Registerdatei vorhanden sind, und wählt ein Anfangszielsymbol aus.
  • Bei Schritt 1506 generiert jedes ausgewählte Zielsymbol die entsprechenden N Substitutionswerte, die in dem Matrix-Fülldatensatz beinhaltet sind. Bei Schritt 1508 wählt der Thread das Anfangsabfragesymbol für jedes lokale Teilalignierungsproblem aus. Bei Schritt 1510 führt der Thread eine Sequenz von VIADD-, VIADDMNMX-, VIADD-, VIADDMNMX-, VIADD- und VIMNMX3-Anweisungen aus, um E-Werte, F-Werte und Teilalignierungsbewertungen zu generieren, die in dem Matrix-Fülldatensatz beinhaltet sind, der dem ausgewählten Zielsymbol und dem ausgewählten Abfragesymbol entspricht.
  • Bei Schritt 1512 führt der Thread eine VIMNMX-Anweisung aus, um die maximale(n) Teilalignierungsbewertung(en) zu aktualisieren und entsprechende(s) Prädikat(e) zu setzen. Bei Schritt 1514 aktualisiert der Thread die maximale Bewertungsposition, die jedem Kein-Null-Prädikat entspricht.
  • Bei Schritt 1516 bestimmt der Thread, ob das ausgewählte Abfragesymbol das Abfragesymbol ist, Falls der Thread bei Schritt 1516 bestimmt, dass das ausgewählte Abfragesymbol nicht das letzte Abfragesymbol ist, fährt das Verfahren 1500 mit Schritt 1518 fort. Bei Schritt 1518 wählt der Thread das/die nächste(n) Abfragesymbol(e) aus. Das Verfahren 1500 kehrt dann zu Schritt 1510 zurück, wo der Thread eine Sequenz von VIADD-, VIADDMNMX-, VIADD-, VIADDMNMX-, VIADD- und VIMNMX3-Anweisungen ausführt, um E-Werte, F-Werte und Teilalignierungsbewertung(en) zu generieren, die in dem Matrix-Fülldatensatz beinhaltet sind, der dem ausgewählten Zielsymbol und dem ausgewählten Abfragesymbole entspricht.
  • Falls der Thread jedoch bei Schritt 1516 bestimmt, dass die ausgewählte Spalte die letzte Spalte ist, fährt das Verfahren 1500 direkt mit Schritt 1520 fort. Bei Schritt 1520 bestimmt der Thread, ob alle ausgewählten Zielsymbole die letzten Zielsymbole der entsprechenden Zielsequenzen sind. Falls der Thread bei Schritt 1520 bestimmt, dass mindestens ein ausgewähltes Zielsymbol nicht das letzte Zielsymbol ist, fährt das Verfahren 1500 mit Schritt 1522 fort. Bei Schritt 1522 tauscht der Thread die Zeilenbezeichnungen aus und wählt das/die nächste(n) Zielsymbol(e) aus. Das Verfahren 1500 kehrt dann zu Schritt 1506 zurück, wo für jedes ausgewählte Zielsymbol der Thread die entsprechenden N Substitutionswerte, die in den N SWcells 460 am weitesten links oder HEcells 560 in der vorherigen Zeile beinhaltet sind, generiert.
  • Falls der Thread jedoch bei Schritt 1520 jedoch feststellt, dass alle ausgewählten Zielsymbole die letzten Zielsymbole der entsprechenden Zielsequenzen sind, endet das Verfahren 1500.
  • 16 ist ein Ablaufdiagramm von Verfahrensschritten zum Ausführen einer Matrix-Füllphase eines Smith-Waterman-Algorithmus über eine Gruppe von Threads, gemäß verschiedenen Ausführungsformen. Obwohl die Verfahrensschritte unter Bezugnahme auf die Systeme der 1-12 beschrieben sind, versteht der Fachmann, dass ein beliebiges System, das dazu konfiguriert ist, die Verfahrensschritte in einer beliebigen Reihenfolge durchzuführen, in den Umfang der vorliegenden Erfindung fällt.
  • Wie gezeigt, beginnt ein Verfahren 1600 bei Schritt 1602, wo jeder Thread in einem Warp, der den SW-Kernel 192 ausführt, einen anderen Matrix-Fülldatensatz (z. B. den Matrix-Fülldatensatz 490(0) oder den Matrix-Fülldatensatz 490(1 )), die sich in einer zugehörigen Registerdatei befinden, initialisiert. Bei Schritt 1604 setzt jeder Thread eine Iteration auf 0. Bei Schritt 1606 setzt jeder Thread eine Zeile gleich der Iteration minus der Thread-ID + 1. Bei Schritt 1608 wählen sich Threads mit Zeilen, die größer als 0 und kleiner oder gleich M sind, selbst aus.
  • Bei Schritt 1610 setzt jeder ausgewählte Thread, der eine Thread-ID größer als 0 aufweist, eine Teilalignierungsbewertung ganz links, einen F-Wert ganz links, eine maximale Zeilenalignierungbewertung und eine maximale Bewertungsspalte basierend auf einem assoziierten Überlaufdatensatz. Bei Schritt 1612 berechnet jeder ausgewählte Thread Teilalignierungsdaten für zugewiesene Spalten der Zeile und aktualisiert die maximale Zeilenteilalignierungsberechnung und die maximale Bewertungsspalte für jedes lokale Alignierungsproblem, um die neu berechneten Teilalignierungsbewertungen widerzuspiegeln. Bei Schritt 1614 leitet jeder ausgewählte Thread mit einer Thread-ID, die kleiner als (T-1) ist, einen Überlaufdatensatz an den benachbarten Thread mit einer höheren Thread-ID weiter.
  • Falls bei Schritt 1616 der höchste Thread ausgewählt wird, aktualisiert der höchste Thread die maximale Teilalignierungsbewertung und die maximale Bewertungsposition für jedes lokale Alignierungsproblem. Bei Schritt 1618 bestimmen die Threads, ob die aktuelle Iteration die letzte Iteration ist. Falls die Threads bei Schritt 1618 bestimmen, dass die aktuelle Iteration nicht die letzte Iteration ist, fahren die Threads mit Schritt 1620 fort. Bei Schritt 1620 inkrementieren die Threads die Iteration. Das Verfahren 1600 kehrt dann zu Schritt 1606 zurück, wo jeder Thread eine Zeile gleich der Iteration minus der Thread-ID + 1 setzt.
  • Falls die Threads jedoch bei Schritt 1618 jedoch bestimmen, dass die aktuelle Iteration die letzte Iteration ist, gehen die Threads direkt zu Schritt 1622 über. Bei Schritt 1622 speichert der Thread, der die höchste Thread-ID aufweist, die maximale Teilalignierungsbewertung und die maximale Bewertungsposition für jedes lokale Alignierungsproblem in dem globalen Speicher. Das Verfahren 1600 endet dann.
  • In einigen Ausführungsformen beinhalten eine oder mehrere SW-Bibliotheken in dem Programmierplattform-Softwarestapel 160 und/oder ein oder mehrere SW-Kernel ohne Einschränkung vorab geschriebenen Code, Kernel, Subroutinen, intrinsische Funktionen, Makros, Klassen, Werte, Typspezifikationen usw., die die Verwendung von einem oder mehreren der verschachtelten Zellenlayouts 450( 0), dem verschachtelten Zellenlayout 450(1), der SW-Anweisung 610, der SW-Sequenz 740, des verschachtelten Zellenlayout 450(1), der VIADD-Anweisung, der VIADDMNMX-Anweisung, der VIMNMX3-Anweisung, der VIMNMX-Anweisung 810, der SIMD-Technik mit mehreren Problemen pro Thread, der gestaffelten SIMD-Thread-Technik erleichtern oder eine beliebige Kombination davon. Insbesondere können eine oder mehrere SW-Bibliotheken ohne Einschränkung intrinsische Funktionen beinhalten, die Teilalignierungsdaten basierend auf der SW-Anweisung 610 und dem verschachtelten Zellenlayout 450(0), der SW-Sequenz 740 und dem verschachtelten Zellenlayout 450(0), der SW-Sequenz 740 und dem verschachtelten Zellenlayout 450(1) oder irgendeine Kombination davon berechnen.
  • Zusammenfassend können die offenbarten Techniken verwendet werden, um die Matrix-Füllphase eines SW-Algorithmus unter Verwendung eines Parallelprozessors effizient zu beschleunigen. In einigen Ausführungsformen konfiguriert eine Software-Anwendung einen Warp, um einen SW-Kernel auf einem Parallelprozessor auszuführen, um gleichzeitig die Matrix-Füllphase für ein bis vier lokale Sequenzalignierungsprobleme durchzuführen. In einigen Ausführungsformen implementiert der SW-Kernel eine oder mehrere Datenverschachtelungstechniken, verwendet eine einzige SW-Anweisung oder eine SW-Anweisungssequenz, um Teilalignierungsbewertungen zu berechnen, verwendet eine Min/Max-Anweisung, die den ausgewählten Operanden angibt, um die maximale Teilalignierungsberechnung und die assoziierte Position oder eine beliebige Kombination davon zu bestimmen. In denselben oder anderen Ausführungsformen ist jeder Thread des Warps für die Matrix-Füllphase für ein, zwei oder vier verschiedene Alignierungsprobleme oder eine Teilmenge der Spalten für ein, zwei oder vier gemeinsame Alignierungsprobleme zuständig.
  • In einigen Ausführungsformen speichert jeder Thread des Warps Teilalignierungsdaten für eine vorherige Zeile und eine aktuelle Zeile in verschachtelter Weise über zwei Arrays von Zellen, die sich in einer Registerdatei befinden. Genauer gesagt, falls die aktuelle Zeile j ist, speichert die k-te Zelle in dem Array von Zellen, die der aktuellen Zeile entsprechen, 32-Bit-Daten, die mit H(j, k) bezeichnet sind, 32-Bit-Daten, die mit E(j, k) bezeichnet sind, 32-Bit-Daten, die mit F(j,k) bezeichnet sind, und 32-Bit-Daten, die mit S(j+1, k+1) bezeichnet sind. Die k-te Zelle in dem anderen Array von Zellen speichert 32-Bit-Daten, die H(j-1, k) darstellen, 32-Bit-Daten, die E(j-1, k) darstellen, 32-Bit-Daten mit F(j-1,k) bezeichnet sind, und 32-Bit-Daten, die mit S(j, k+1) bezeichnet sind. Jedes von H(j, k), E(j, k), F(j,k), S(j+1, k+1), H(j-1, k), E(j-1, k), F(j-1,k) und S(j, k+1) kann einen einzigen 32-Bit-Wert beinhalten, der einem einzigen Alignierungsproblem entspricht, zwei gepackte 16-Bit-Werte, die zwei Alignierungsproblemen entsprechen, oder vier gepackte 8-Bit-Werte, die vier Alignierungsproblemen entsprechen. Die SW-Anweisung und die SW-Anweisungssequenz können in Verbindung mit SWcells verwendet werden.
  • In einigen anderen Ausführungsformen speichert jeder Thread, um die Menge an Registerspeicher zu reduzieren, die zum Speichern von Teilalignierungsdaten benötigt wird, relevante H-Werte und relevante E-Werte für eine vorherige Zeile und eine aktuelle Zeile in zwei Arrays von HEcells, die sich in der Registerdatei befinden, relevante F-Werte für eine aktuelle Zeile über ein Array von 32-Bit-Werten, das sich in der Registerdatei befindet, und relevante S-Werte für eine aktuelle Zeile in einem Array von 32-Bit-Werten, das sich in der Registerdatei befindet. Die SW-Anweisungssequenz, aber nicht die einzige SW-Anweisung kann in Verbindung mit HEcells verwendet werden.
  • Die SW-Anweisung ist eine Thread-spezifischer Anweisungen, die SW-Teilalignierungsberechnungen für eine einzige Stelle durchführt. In einigen Ausführungsformen ist das SW-Anweisungsformat SW{.variant} result, diag, top, left, consts. Der variant-Modifikator ist 1 (nicht-SIMD), 2 (2-Wege-SIMD) oder 4 (4-Wege-SIMD); result, diag, top und left sind Instanzen von SWcell; und die Konstanten sind GapDeleteExtend, GaplnsertExtend, GapDeleteExtend und GaplnsertOpen.
  • Die SW-Anweisungssequenz ist eine Sechs-Anweisungssequenz pro Thread, die SW-Teilalignierungsberechnungen für eine einzige Stelle durchführt und Kein-SIMD, 2-Wege-SIMD und 4-Wege-SIMD unterstützt. Die Anweisungssequenz beinhaltet ohne Einschränkung eine erste VIADD-Anweisung, eine erste VIADDMNMX-Anweisung, eine zweite VIADD-Anweisung, eine zweite VIADDMNMX-Anweisung, eine dritte VIADD-Anweisung und eine VIMNMX3-Anweisung. Jedes des VIADD-Anweisungsformats, des VIADDMNMX-Anweisungsformats und des VIMNMX3-Anweisungsformats unterstützt Kein-SIMD-, 2-Wege-SIMD- und 4-Wege-SIMD-Varianten.
  • In einigen Ausführungsformen ist jeder Thread in dem Warp für ein, zwei oder vier unterschiedliche lokale Alignierungsprobleme zuständig. Jeder Thread in der Thread-Gruppe führt gleichzeitig Kein-SIMD-, 1-Wege-SIMD- oder 4-Wege-SIMD- SW-Teilalignierungsberechnungen sequenziell für Positionen durch, die einem assoziierten Satz von Spalten und einer Zeile entsprechen, bevor Bewertungsberechnungen für Positionen durchgeführt werden, die den Sätzen von Spalten und der nächsten Zeile entsprechen. In einigen anderen Ausführungsformen sind ein, zwei oder vier Alignierungsprobleme auf die Threads des Warps verteilt. Jeder Thread führt Kein-SIMD-, 1-Wege-SIMD- oder 4-Wege-SIMD- SW-Teilalignierungsberechnungen für Positionen durch, die einem unterschiedlichen Satz von Spalten entsprechen, und jeder Thread außer Thread 0 ist eine Zeile hinter dem unmittelbar niedrigeren Thread in Bezug auf Teilalignierungsberechnungen.
  • Mindestens ein technischer Vorteil der offenbarten Techniken im Vergleich zum Stand der Technik besteht darin, dass mit den offenbarten Techniken die Anzahl der Anweisungen, die ausgeführt wird, um jede Teilalignierungsbewertung zu berechnen, beim Ausführen der Matrix-Füllphase des SW-Algorithmus unter Verwendung von Parallelprozessoren reduziert werden kann. In dieser Hinsicht kann mit den offenbarten Techniken eine einzige SW-Anweisung oder eine SW-Sequenz mit sechs Anweisungen verwendet werden, um gleichzeitig eine, zwei oder vier Teilalignierungsbewertungen, die jeweils mit einem, zwei oder vier unterschiedlichen lokalen Alignierungsproblemen assoziiert sind, zu berechnen. Da Teilalignierungsbewertungen und Zwischenergebnisse, die mit jeder Position in der Bewertungsmatrix assoziiert sind, mit den offenbarten Techniken in einer einzigen Zelle verschachtelt gespeichert werden können, können mit der Datenbewegung assoziierte Ineffizienzen im Vergleich zu herkömmlichen Techniken, die dieselben Daten aus separaten Matrizen abrufen, reduziert werden. Darüber hinaus kann mit den offenbarten Techniken eine Anweisung, die den ausgewählten Operanden angibt, wenn das Minimum oder Maximum von zwei Operanden bestimmt wird, verwendet werden, um die Anzahl von Anweisungen zu reduzieren, die ausgeführt werden, wenndie maximale Teilalignierungsbewertung und damit assoziierte Position bestimmt und gespeichert wird. Diese technischen Vorteile stellen einen oder mehrere technologische Fortschritte gegenüber den Ansätzen des Standes der Technik dar.
  • Beliebige und alle Kombinationen beliebiger Anspruchselemente, die in einem der Ansprüche vorgetragen werden, und/oder beliebige Elemente, die in dieser Anmeldung beschrieben sind, liegen in jeglicher Weise innerhalb des angedachten Umfangs der vorliegenden Offenbarung und deren Schutzbereich.
  • Die Beschreibungen der verschiedenen Ausführungsformen wurden zu Zwecken der Veranschaulichung dargelegt, sollen jedoch nicht erschöpfend sein oder auf die offenbarten Ausführungsformen beschränkt sein. Zahlreiche Modifikationen und Abwandlungen sind für den Durchschnittsfachmann ersichtlich, ohne vom Umfang und Geist der beschriebenen Ausführungsformen abzuweichen.
  • Aspekte der vorliegenden Ausführungsformen können als ein System, ein Verfahren oder ein Computerprogrammprodukt ausgeführt sein. Dementsprechend kann die vorliegende Erfindung die Form einer vollständigen Hardware-Ausführungsform, einer vollständigen Software-Ausführungsform (einschließlich Firmware, residenter Software, Mikrocode usw.) oder eine Ausführungsform annehmen, die Software- und Hardware-Aspekte kombiniert, die alle im Allgemeinen hierin als „Modul“; ein „System“ oder ein „Computer“ bezeichnet werden können. Darüber hinaus kann jede Hardware- und/oder Softwaretechnik, jeder Prozess, jede Funktion, jede Komponente, jeder Motor, jedes Modul oder jedes System, die in der vorliegenden Offenbarung beschrieben sind, als eine Schaltung oder ein Satz von Schaltungen implementiert werden. Des Weiteren können Ausführungsformen der vorliegenden Erfindung die Form eines Computerprogrammprodukts annehmen, das in einem materiellen Ausdrucksdatenträger mit computernutzbarem Programmcode ausgeführt sein kann, der im Datenträger ausgeführt ist.
  • Jede Kombination von einem oder mehreren computerlesbaren Medien kann verwendet werden. Das computerlesbare Medium kann ein computerlesbares Signalmedium oder ein computerlesbares Speichermedium sein. Ein computerlesbares Speichermedium kann zum Beispiel unter anderem ein/e elektronische/s, magnetische/s, optische/s, elektromagnetische/s, Infrarot- oder Halbleitersystem, -gerät, -vorrichtung oder eine beliebige geeignete Kombination der vorstehenden sein. Konkretere Beispiele des computerlesbaren Speichermediums (eine nicht erschöpfende Liste) würden Folgendes beinhalten: eine elektrische Verbindung mit einem oder mehreren Drähten, eine tragbare Computerdiskette, einer Festplatte, einen Direktzugriffsspeicher (RAM), einen Festwertspeicher, einen löschbaren programmierbaren Festwertspeicher, eine optische Faser, einen tragbaren Compact Disc-Festwertspeicher, eine optische Speichervorrichtung, eine magnetische Speichervorrichtung oder eine beliebige geeignete Kombination der vorstehenden. Im Kontext dieser Schrift kann ein computerlesbares Speichermedium ein beliebiges materielles Medium sein, das ein Programm zur Verwendung durch oder in Verbindung mit einem/einer Anweisungsausführungssystem, -gerät oder -vorrichtung enthalten oder speichern kann.
  • Aspekte der vorliegenden Offenbarung sind vorstehend unter Bezugnahme auf Flussdiagrammveranschaulichungen und/oder Blockdiagramme von Verfahren, Geräten (Systemen) und Computerprogrammprodukten gemäß den Ausführungsformen der Offenbarung beschrieben. Es versteht sich, dass jeder Block der Flussdiagrammveranschaulichungen und/oder Blockdiagramme und Kombinationen von Blöcken in den Flussdiagrammveranschaulichungen und/oder Blockdiagrammen durch Computerprogrammanweisungen implementiert sein kann. Diese Computerprogrammanweisungen können einem Prozessor eines Universalcomputers, Spezialcomputers oder einem anderen programmierbaren Datenverarbeitungsgerät bereitgestellt werden, um eine Maschine herzustellen. Die Anweisungen ermöglichen, wenn sie über den Prozessor des Computers oder einem anderen programmierbaren Datenverarbeitungsgerät ausgeführt werden, die Implementierung der Funktionen/Aktionen, die in dem Flussdiagramm und/oder Blockdiagrammblock oder - blöcken spezifiziert sind. Derartige Prozessoren können unter anderem Universalprozessoren, Spezialprozessoren, anwendungsspezifische Prozessoren oder feldprogrammierbar sein.
  • Die Ablauf- und Blockdiagramme in den Figuren veranschaulichen die Architektur, Funktionen und den Betrieb möglicher Implementierungen von Systemen, Verfahren und Computerprogrammprodukten gemäß verschiedenen Ausführungsformen der vorliegenden Offenbarung. In dieser Hinsicht kann jeder Block in den Fluss- oder Blockdiagrammen ein Modul, ein Segment oder einen Abschnitt eines Codes darstellen, das bzw. der eine oder mehrere ausführbare Anweisungen zum Implementieren der angegebenen logischen Funktion(en) umfasst. Es sei auch angemerkt, dass die in dem Block angegebenen Funktionen in einigen alternativen Implementierungen in anderer Reihenfolge als in den Figuren angegeben auftreten können. Beispielsweise können zwei aufeinanderfolgend gezeigte Blöcke tatsächlich im Wesentlichen gleichzeitig ausgeführt werden, oder die Blöcke können mitunter abhängig von der jeweiligen Funktion in der umgekehrten Reihenfolge ausgeführt werden. Es sei auch angemerkt, dass jeder Block der Blockdiagramme und/oder Flussdiagrammdarstellung und Kombinationen von Blöcken der Blockdiagramm- und/oder Flussdiagrammdarstellung durch spezielle hardwarebasierte Systeme, die die angegebenen Funktionen oder Handlungen durchführen, oder durch Kombinationen von spezieller Hardware und Computeranweisungen, implementiert sein können.
  • Auch wenn das Vorstehende auf Ausführungsformen der vorliegenden Offenbarung gerichtet ist, können andere und weitere Ausführungsformen der Offenbarung ohne Abweichung von deren grundlegendem Umfang erarbeitet werden, und deren Umfang wird durch die nachfolgenden Ansprüche bestimmt.
  • Claims (20)

    1. Computerimplementiertes Verfahren zum Durchführen von Teilalignierungsberechnungen beim Ausführen einer Matrix-Füllphase eines Smith-Waterman-Algorithmus, wobei das Verfahren Folgendes umfasst: Ausführen einer ersten Anweisung zum Generieren erster Teilalignierungsdaten, die in einer ersten Zelle in einem ersten Array von Zellen beinhaltet sind, basierend auf zweiten Teilalignierungsdaten, die in einer zweiten Zelle in dem ersten Array von Zellen und einem zweiten Array von Zellen beinhaltet sind; und Ausführen einer zweiten Anweisung zum Generieren dritter Teilalignierungsdaten, die in einer dritten Zelle in dem ersten Array von Zellen beinhaltet sind, basierend auf den ersten Teilalignierungsdaten, die in der ersten Zelle und dem zweiten Array von Zellen beinhaltet sind.
    2. Computerimplementiertes Verfahren nach Anspruch 1, wobei das Ausführen der ersten Anweisung einen Parallelprozessor veranlasst zum: Generieren eines ersten E-Werts, der in den ersten Teilalignierungsdaten beinhaltet ist, basierend auf vierten Teilalignierungsdaten, die in einer vierten Zelle in dem zweiten Array von Zellen beinhaltet sind; Generieren eines ersten F-Werts, der in den ersten Teilalignierungsdaten beinhaltet ist, basierend auf den zweiten Teilalignierungsdaten, die in der zweiten Zelle beinhaltet sind; und Generieren einer ersten Teilalignierungsbewertung, die in den ersten Teilalignierungsdaten beinhaltet ist, basierend auf dem ersten E-Wert, dem ersten F-Wert und einer fünften Zelle in dem zweiten Array von Zellen.
    3. Computerimplementiertes Verfahren nach Anspruch 1 oder 2, wobei die ersten Teilalignierungsdaten eine unterschiedliche Teilalignierungsbewertung für jedes lokale Alignierungsproblem beinhalten, das in einer Vielzahl von lokalen Alignierungsproblemen beinhaltet ist.
    4. Computerimplementiertes Verfahren nach einem vorstehenden Anspruch, wobei die ersten Teilalignierungsdaten mindestens eine Teilalignierungsbewertung, mindestens einen E-Wert und mindestens einen F-Wert beinhalten.
    5. Computerimplementiertes Verfahren nach einem vorstehenden Anspruch, wobei sowohl die erste Anweisung als auch die zweite Anweisung einen ersten Anweisungsnamen spezifizieren.
    6. Computerimplementiertes Verfahren nach einem vorstehenden Anspruch, das ferner das Ausführen einer dritten Anweisung zum Überschreiben von vierten Teilalignierungsdaten, die in einer vierten Zelle in dem zweiten Array von Zellen beinhaltet sind, mit fünften Teilalignierungsdaten basierend auf sechsten Teilalignierungsdaten umfasst, die in einer fünften Zelle in dem zweiten Array von Zellen und dem ersten Array von Zellen beinhaltet sind.
    7. Computerimplementiertes Verfahren nach Anspruch 6, wobei die vierten Teilalignierungsdaten und die fünften Teilalignierungsdaten mit derselben Position in mindestens einer ersten Abfragesequenz und unterschiedlichen Positionen in mindestens einer ersten Zielsequenz assoziiert sind.
    8. Computerimplementiertes Verfahren nach einem vorstehenden Anspruch, ferner umfassend: Ausführen einer dritten Anweisung zum Bestimmen einer maximalen Teilalignierungsbewertung und eines Prädikats basierend auf einer ersten Teilalignierungsbewertung, die in den dritten Teilalignierungsdaten beinhaltet ist, und einer vorherigen maximalen Teilalignierungsbewertung, wobei das Prädikat angibt, dass die erste Teilalignierungsbewertung eine Quelle der maximalen Teilalignierungsbewertung ist; und basierend auf dem Prädikat, Ausführen einer vierten Anweisung, um eine maximale Bewertungsspaltenposition gleich einer Spaltenposition zu setzen, die mit der ersten Teilalignierungsbewertung assoziiert ist.
    9. Computerimplementiertes Verfahren nach einem vorstehenden Anspruch, wobei die ersten Teilalignierungsdaten eine 32-Bit-Teilalignierungsbewertung, erste gepackte Daten, die zwei 16-Bit-Teilalignierungsbewertungen beinhalten, oder zweite gepackte Daten, die vier 8-Bit-Teilalignierungsbewertungen beinhalten, beinhalten.
    10. Computerimplementiertes Verfahren nach einem vorstehenden Anspruch, wobei ein erster Thread die erste Anweisung und die zweite Anweisung ausführt.
    11. Ein oder mehrere nichtflüchtige computerlesbare Medien, die Anweisungen beinhalten, die, wenn sie von einem oder mehreren Prozessoren ausgeführt werden, den einen oder die mehreren Prozessoren veranlassen, Teilalignierungsberechnungen beim Ausführen einer Matrix-Füllphase eines Smith-Waterman-Algorithmus durchzuführen, indem die folgenden Schritte durchgeführt werden: Ausführen einer ersten Anweisung zum Generieren erster Teilalignierungsdaten, die in einer ersten Zelle in einem ersten Array von Zellen beinhaltet sind, basierend auf zweiten Teilalignierungsdaten, die in einer zweiten Zelle in dem ersten Array von Zellen und einem zweiten Array von Zellen beinhaltet sind; und Ausführen einer zweiten Anweisung zum Generieren dritter Teilalignierungsdaten, die in einer dritten Zelle in dem ersten Array von Zellen beinhaltet sind, basierend auf den ersten Teilalignierungsdaten, die in der ersten Zelle und dem zweiten Array von Zellen beinhaltet sind.
    12. Das eine oder die mehreren nichtflüchtigen computerlesbaren Medien nach Anspruch 11, wobei das Ausführen der ersten Anweisung einen Parallelprozessor veranlasst zum: Generieren eines ersten E-Werts, der in den ersten Teilalignierungsdaten beinhaltet ist, basierend auf vierten Teilalignierungsdaten, die in einer vierten Zelle in dem zweiten Array von Zellen beinhaltet sind; Generieren eines ersten F-Werts, der in den ersten Teilalignierungsdaten beinhaltet ist, basierend auf den zweiten Teilalignierungsdaten, die in der zweiten Zelle beinhaltet sind; und Generieren einer ersten Teilalignierungsbewertung, die in den ersten Teilalignierungsdaten beinhaltet ist, basierend auf dem ersten E-Wert, dem ersten F-Wert und einer fünften Zelle in dem zweiten Array von Zellen.
    13. Das eine oder die mehreren nichtflüchtigen computerlesbaren Medien nach Anspruch 11 oder 12, wobei die ersten Teilalignierungsdaten eine unterschiedliche Teilalignierungsbewertung für jedes lokale Alignierungsproblem beinhalten, das in einer Vielzahl von lokalem Alignierungsproblemen beinhaltet ist.
    14. Das eine oder die mehreren nichtflüchtigen computerlesbaren Medien nach einem der Ansprüche 11 bis 13, wobei das erste Array von Zellen aneinandergrenzend in einer ersten Registerdatei gespeichert ist.
    15. Das eine oder die mehreren nichtflüchtigen computerlesbaren Medien nach einem der Ansprüche 11 bis 14, wobei die erste Anweisung und die zweite Anweisung einen ersten Anweisungsnamen spezifizieren und 2-Wege-Einzelanweisung, Mehrfachdaten, SIMD, Anweisungen oder 4-Wege-SIMD-Anweisungen umfassen.
    16. Das eine oder die mehreren nichtflüchtigen computerlesbaren Medien nach einem der Ansprüche 11 bis 15, das ferner das Ausführen einer dritten Anweisung zum Überschreiben von vierten Teilalignierungsdaten, die in einer vierten Zelle in dem zweiten Array von Zellen beinhaltet sind, mit fünften Teilalignierungsdaten basierend auf sechsten Teilalignierungsdaten umfasst, die in einer fünften Zelle in dem zweiten Array von Zellen und dem ersten Array von Zellen beinhaltet sind.
    17. Computerimplementiertes Verfahren nach Anspruch 16, wobei die vierten Teilalignierungsdaten und die fünften Teilalignierungsdaten mit derselben Position in mindestens einer ersten Abfragesequenz und unterschiedlichen Positionen in mindestens einer ersten Zielsequenz assoziiert sind.
    18. Das eine oder die mehreren nichtflüchtigen computerlesbaren Medien nach einem der Ansprüche 11 bis 17, wobei die erste Anweisung eine erste SIMD-Anweisung umfasst, die zweite Anweisung eine zweite SIMD-Anweisung umfasst und ferner Folgendes umfasst: Ausführen einer dritten SIMD-Anweisung zum Bestimmen eines Satzes maximaler Teilalignierungsbewertungen und eines Satzes von Prädikaten basierend auf einem Satz von Teilalignierungsbewertungen, die in den dritten Teilalignierungsdaten und einem Satz vorhergehender maximaler Teilalignierungsbewertungen beinhaltet sind; und Generieren eines Satzes maximaler Bewertungspositionen basierend auf dem Satz von Prädikaten, einem Satz vorheriger maximaler Bewertungspositionen und einer Position, die mit dem Satz von Teilalignierungsbewertungen assoziiert ist.
    19. Das eine oder die mehreren nichtflüchtigen computerlesbaren Medien nach einem der Ansprüche 11 bis 18, wobei die ersten Teilalignierungsdaten eine 32-Bit-Teilalignierungsbewertung, erste gepackte Daten, die zwei 16-Bit-Teilalignierungsbewertungen beinhalten, oder zweite gepackte Daten, die vier 8-Bit-Teilalignierungsbewertungen beinhalten, beinhaltet.
    20. System, umfassend: einen oder mehrere Speicher, die Anweisungen speichern; und einen oder mehrere Prozessoren, die an den einen oder die mehreren Speicher gekoppelt sind, die beim Ausführen der Anweisungen die folgenden Schritte durchführen: Ausführen einer ersten Anweisung zum Generieren erster Teilalignierungsdaten, die in einer ersten Zelle in einem ersten Array von Zellen beinhaltet sind, basierend auf zweiten Teilalignierungsdaten, die in einer zweiten Zelle in dem ersten Array von Zellen und einem zweiten Array von Zellen beinhaltet sind; und Ausführen einer zweiten Anweisung zum Generieren dritter Teilalignierungsdaten, die in einer dritten Zelle in dem ersten Array von Zellen beinhaltet sind, basierend auf den ersten Teilalignierungsdaten, die in der ersten Zelle und dem zweiten Array von Zellen beinhaltet sind.
    DE102022124496.2A 2021-09-30 2022-09-23 Techniken zum beschleunigen von smith-waterman-sequenzalignierungen Pending DE102022124496A1 (de)

    Applications Claiming Priority (2)

    Application Number Priority Date Filing Date Title
    US17/491,276 US20230101085A1 (en) 2021-09-30 2021-09-30 Techniques for accelerating smith-waterman sequence alignments
    US17/491,276 2021-09-30

    Publications (1)

    Publication Number Publication Date
    DE102022124496A1 true DE102022124496A1 (de) 2023-03-30

    Family

    ID=85477697

    Family Applications (1)

    Application Number Title Priority Date Filing Date
    DE102022124496.2A Pending DE102022124496A1 (de) 2021-09-30 2022-09-23 Techniken zum beschleunigen von smith-waterman-sequenzalignierungen

    Country Status (3)

    Country Link
    US (1) US20230101085A1 (de)
    CN (1) CN115905786A (de)
    DE (1) DE102022124496A1 (de)

    Also Published As

    Publication number Publication date
    US20230101085A1 (en) 2023-03-30
    CN115905786A (zh) 2023-04-04

    Similar Documents

    Publication Publication Date Title
    DE202008017916U1 (de) Virtuelle Architektur und virtueller Befehlssatz für die Berechnung paralleler Befehlsfolgen
    DE102021102589A1 (de) Berechnungsgraph-optimierung
    DE102012221502A1 (de) System und Verfahren zum Durchführen von gestalteter-Speicherzugriff-Operationen
    DE112010003750T5 (de) Hardware für parallele Befehlslistenerzeugung
    DE102021104561A1 (de) Asynchrone datenbewegungspipeline
    DE102021103492A1 (de) Anwendungsprogrammierschnittstelle zum beschleunigen von matrixoperationen
    DE102021104970A1 (de) Kooperative parallele speicherzuteilung
    DE102021106797A1 (de) Techniken zur orchestrierung von phasen der thread-synchronisation
    DE112021005433T5 (de) Verfahren zur leistungsbalancierung mehrerer chips
    DE112022003222T5 (de) Multi-architektur-ausführungsgraphen
    DE102022132008A1 (de) Asynchrone speicherdeallokation
    DE112022002953T5 (de) Parallele verarbeitung von thread-gruppen
    DE112022001917T5 (de) Synchronisieren einer graphausführung
    DE102022131530A1 (de) Verfahren zum modifizieren von graphencode
    DE102022132013A1 (de) Anwendungsprogrammierschnittstellen für interoperabilität
    DE102022124362A1 (de) Benutzerkonfigurierbare speicherzuweisung
    DE102022114509A1 (de) Speicherzuweisung unter verwendung von graphen
    DE112022000425T5 (de) Gleichzeitiges einführen von code
    DE102022124496A1 (de) Techniken zum beschleunigen von smith-waterman-sequenzalignierungen
    DE102022105958A1 (de) Techniken zum ausgleichen von arbeitslasten beim parallelisieren von multiplizier-akkumulier-berechnungen
    DE112022002258T5 (de) Tensormodifikation basierend auf der verarbeitung von ressourcen
    DE102022124943A1 (de) Umsetzen spezialisierter anweisungen zum beschleunigen von smith-waterman-sequenzalignierungen
    DE102022124370A1 (de) Techniken zum speichern von teilalignierungsdaten beim beschleunigen von smith-waterman-sequenzalignierungen
    DE102021122965A1 (de) Kontaktverfahren zur simulation
    DE112020007283T5 (de) Dockingboard für eine Multiformat-Grafikverarbeitungseinheit

    Legal Events

    Date Code Title Description
    R012 Request for examination validly filed