Frage

Ich erstellte ein lokales Array in meinem OpenCl-Kernel über LLVM, rufen Sie sie auf, um die Größe aufzurufen [256 x I32]. Später lege ich den Code über LLVM ein, um das Array mit Werten zu füllen. Mein Problem ist, dass, wenn ich versuche, Code zu generieren, der auf das Array zugreift, nicht scheint, den Zeiger nicht auf das Element, das ich wünsche, nicht korrekt zu isolieren. Ich kann mich falsch an einem Element indexizieren, wenn ich eine dunkle lokale Variable namens abgeflacht benutze:

generasacodicetagpre.

Dies wäre die dimensionsabgeflachte lokale Arbeitsgruppen-ID. Das ist irrelevant.

So wird der Gep erstellt (Builder ist eine Instanz von Irbuilder):

generasacodicetagpre.

m in diesem Fall ist das Modulobjekt. Die produzierte Tabelle_ADDR lautet:

generasacodicetagpre.

Wenn ich es jedoch korrekt füllen möchte, indem ich durch die Indizes in LLVM mit einem für Loop-Loop-Code (die Schleifenstruktur weglassen, und wo "Index" ein I32-Schleifenzähler ist):

generasacodicetagpre.

Der Müllkippe () des TABLE_ADDR in diesem Fall ist (wenn Index== 0):

generasacodicetagpre.

was bedeutet, dass weiter unten, wenn ich den Laden mache:

generasacodicetagpre.

Ich erhalte diese Ausgabe:

generasacodicetagpre.

was nicht richtig aussieht, aber noch wichtiger ist, bekomme ich einen Sigabrt auf einem Assent, wenn "Index"> 0:

generasacodicetagpre.

Ich bin ein bisschen stecken. Ich verstehe nicht, was der Unterschied zwischen einem expliziten Wert zum Index in das Array versus ist, ein dünnerer Wert, der zur Laufzeit berechnet wird. Alle Einsichten wären sehr geschätzt.

update: Was ich endete, ist, dass (Alloc ist nur einmal fertig, ich gehe es nur in diesem Code-Block für optische Zwecke, es ist eigentlich außerhalb der für Schleife):

generasacodicetagpre.

das diesen Code emittierte (für Index== 0 und 1):

generasacodicetagpre.

Es sieht jetzt richtig aus, für mich scheint es wie ein seltsamer Weg zum EMI-Code, da ich dann sofort geladen habe, aber ich nehme an, das wird optimiert, oder ich werde versuchen, dieses MEM2REG zu verwenden. Danke für die Hilfe @oak.

War es hilfreich?

Lösung

Dieser Snippet ist problematisch:

generasacodicetagpre.

IRBuilder::getInt32 erstellt eine konstante int.Der BeEP wird also immer auf den ersten Punkt im Array zugreifen, was Sie nicht möchten.Deshalb zeigt auch der IR einen Konstanter Ausdruck gep anstelle eines echten Gep-Anweisungen.Was Sie benötigen, ist, einen generationspoDicetagcode zu erstellen, und verwenden Sie ihn als 2. Index - wie Sie in dem ersten Beispiel erfolgen.

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