Die verschiedenen Adressierungsmodi von CUDA Texturen

8

Ich verwende eine CUDA-Textur im Grenzadressierungsmodus ( cudaAddressModeBorder ). Ich lese Texturkoordinaten mit tex2D<float>() . Wenn die Texturkoordinaten außerhalb der Textur liegen, gibt tex2D<float>() 0 zurück.

Wie kann ich diesen zurückgegebenen Grenzwert von 0 auf etwas anderes ändern? Ich könnte die Texturkoordinate manuell überprüfen und den Randwert selbst einstellen. Ich habe mich gefragt, ob es CUDA API gibt, wo ich einen solchen Grenzwert setzen kann.

    
Ashwin Nanjappa 26.09.2013, 06:31
quelle

2 Antworten

10

Wie von sgarizvi erwähnt, unterstützt CUDA nur vier nicht anpassbare Adressmodi, nämlich clamp , border , wrap und Spiegel , die in Abschnitt 3.2.11.1 beschrieben sind. des CUDA-Programmierhandbuchs.

Die ersten beiden arbeiten sowohl in nicht normalisierten als auch in normalisierten Koordinaten, während die letzten beiden nur in normalisierten Koordinaten arbeiten.

Um die ersten beiden zu beschreiben, betrachten wir den Fall der nichtnormalisierten Koordinaten und betrachten 1D-Signale der Einfachheit halber. In diesem Fall lautet die Eingabefolge c[k] , mit k=0,...,M-1 .

cudaAddressModeClamp

Das Signal c[k] wird außerhalb von k=0,...,M-1 fortgesetzt, so dass c[k] = c[0] für k < 0 und c[k] = c[M-1] für k >= M .

cudaAddressModeBorder

Das Signal c[k] wird außerhalb von k=0,...,M-1 fortgesetzt, so dass c[k] = 0 für k < 0 und für k >= M .

Um die letzten beiden Adressmodi zu beschreiben, müssen wir nun normalisierte Koordinaten berücksichtigen, so dass die 1D-Eingangssignal-Abtastwerte als c[k / M] mit k=0,...,M-1 angenommen werden.

cudaAddressModeWrap

Das Signal c[k / M] wird außerhalb von k=0,...,M-1 fortgesetzt, so dass es periodisch mit der Periode gleich M ist. Mit anderen Worten c[(k + p * M) / M] = c[k / M] für jede (positive, negative oder verschwindende) ganze Zahl p .

cudaAddressModeMirror

Das Signal c[k / M] wird außerhalb von k=0,...,M-1 fortgesetzt, so dass es periodisch mit der Periode gleich 2 * M - 2 ist. Mit anderen Worten: c[l / M] = c[k / M] für l und k für (l + k)mod(2 * M - 2) = 0 .

Der folgende Code veranschaulicht alle vier verfügbaren Adressmodi

%Vor%

Das sind die Ausgaben

%Vor%     
JackOLantern 10.12.2014, 22:02
quelle
2

Ab sofort (CUDA 5.5) ist das CUDA-Textur-Abrufverhalten nicht anpassbar. Nur 1 der 4 automatischen integrierten Modi (z. B. Rahmen , Klammer , Umbruch und Spiegel ) kann sein verwendet für außer Reichweite Textur abrufen.

    
sgarizvi 26.09.2013 07:05
quelle