VectorOperators

mr.kernel

Mitglied
Hallo!

Ich versuche folgenden Skalaren Code

Java:
int red = (color & 0xFF0000) >> 16;

in Vektor Code

Java:
var red = color.lanewise(VectorOperators.AND, 0xFF0000);
red = red.lanewise(VectorOperators.ASHR, 16);

umzuwandeln.

Leider klappt das nicht so wie es soll.
Scheinbar wird nicht das bitweise UND ausgeführt.
Kann mir da jemand weiterhelfen?
 

ByteBitch

Mitglied
Verzeihung, es war alles richtig, du musst nur die richtige Lane abgreifen:

Java:
    public static int red(IntVector color) {
        System.out.println(color);
        var red = color.lanewise(VectorOperators.AND, 0xFF0000);
        System.out.println(red);
        red = red.lanewise(VectorOperators.ASHR, 16);
        System.out.println(red);
        return red.lane(1);
    }

    public static void main(String[] args) {
        System.out.printf("0x%X%n", red(IntVector.fromArray(IntVector.SPECIES_64, new int[]{0, 0x12345678}, 0)));
    }

Das gibt dir 0x34 aus, der Wert für Rot.

Auch wichtig:

Code:
compileJava {
    options.compilerArgs.addAll(['--release', '23'])
    options.compilerArgs.addAll(['--enable-preview'])
    options.compilerArgs.addAll(['--add-modules', 'jdk.incubator.vector'])
}

application {
    applicationDefaultJvmArgs = ['--enable-preview',
                                 '--add-modules', 'jdk.incubator.vector']
}
 

mr.kernel

Mitglied
Verzeihung, es war alles richtig, du musst nur die richtige Lane abgreifen:

Java:
    public static int red(IntVector color) {
        System.out.println(color);
        var red = color.lanewise(VectorOperators.AND, 0xFF0000);
        System.out.println(red);
        red = red.lanewise(VectorOperators.ASHR, 16);
        System.out.println(red);
        return red.lane(1);
    }

    public static void main(String[] args) {
        System.out.printf("0x%X%n", red(IntVector.fromArray(IntVector.SPECIES_64, new int[]{0, 0x12345678}, 0)));
    }

Das gibt dir 0x34 aus, der Wert für Rot.

Auch wichtig:

Code:
compileJava {
    options.compilerArgs.addAll(['--release', '23'])
    options.compilerArgs.addAll(['--enable-preview'])
    options.compilerArgs.addAll(['--add-modules', 'jdk.incubator.vector'])
}

application {
    applicationDefaultJvmArgs = ['--enable-preview',
                                 '--add-modules', 'jdk.incubator.vector']
}

Danke dir, Ich hab mittlerweile gemerkt dass der Fehler woanders liegt :rolleyes:

Kann mir jemand auch helfen folgendes zu vektorisieren?
Java:
for (i = 0; i < tresholds.length - 1; ++i) {
                            if (redint > tresholds[i] && tresholds[i + 1] > redint) {
                                redint = tresholds[i];
                            }
                        }
 

mr.kernel

Mitglied
Schade dass ihr nur die Sinnhaftigkeit hinterfragt, die Vektor Erweiterung wurde ja nicht umsonst entwickelt.

Für die beiden Bedingungen
Java:
for (i = 0; i < tresholds.length - 1; ++i) {
    if (redint > tresholds[i] && tresholds[i + 1] > redint) {
        redint = tresholds[i];
    }
}

habe ich Masken erstellt:
Java:
VectorMask<Integer> maskredgt = red.compare(VectorOperators.GT, tresholds[j]);
VectorMask<Integer> maskredlt = red.compare(VectorOperators.LT, tresholds[j + 1] );
ich verzweifle "nur" daran diese beiden Masken zu kombinieren (UND Verknüpfen) damit dann die Lane auf den Wert tresholds gesetzt wird.
 

Oneixee5

Top Contributor
Schade dass ihr nur die Sinnhaftigkeit hinterfragt, die Vektor Erweiterung wurde ja nicht umsonst entwickelt.

Für die beiden Bedingungen
Java:
for (i = 0; i < tresholds.length - 1; ++i) {
    if (redint > tresholds[i] && tresholds[i + 1] > redint) {
        redint = tresholds[i];
    }
}

habe ich Masken erstellt:
Java:
VectorMask<Integer> maskredgt = red.compare(VectorOperators.GT, tresholds[j]);
VectorMask<Integer> maskredlt = red.compare(VectorOperators.LT, tresholds[j + 1] );
ich verzweifle "nur" daran diese beiden Masken zu kombinieren (UND Verknüpfen) damit dann die Lane auf den Wert tresholds gesetzt wird.
Ich finde es ganz interessant, habe nur leider keine Ahnung davon.
 

mihe7

Top Contributor
Leider klappt das nicht so wie es soll.
Zunächst einmal ist es natürlich ziemlicher Unfug, eine skalare Operation zu "vektorisieren", wenn man weiterhin mit einem Skalar arbeitet.

Nehmen wir mal ein 16x16-Pixel großes Bild an, d. h. ein Bild mit 256 Bildpunkten. Daten könnte man sich mal so erstellen:
Java:
int[] pixels = new Random(1L).ints(256, 0, 1 << 24).toArray();

Das lässt sich jetzt vektorisieren:
Java:
VectorSpecies<Integer> species = IntVector.SPECIES_PREFERRED;

int[] pixels = new Random(1L).ints(256, 0, 1 << 24).toArray();
int[] redValues = new int[256];

for (int ix = 0; ix < pixels.length; ix += species.length()) {
    IntVector rgb = IntVector.fromArray(species, pixels, ix); // enthält auf meinem System z. B. 16 int-Werte (16 Lanes)
    IntVector red = rgb.lanewise(VectorOperators.AND, 0xff0000).lanewise(VectorOperators.ASHR, 16); // alle Lanes auf "einmal" berechnen
    red.intoArray(redValues, ix); // den Vektor ins Array kopieren
}

Kann mir jemand auch helfen folgendes zu vektorisieren?
Schwierig, wenn man nicht weiß, was Du eigentlich genau willst.

Nehmen wir mal an, ich möchte die Rotwerte, die zwischen 50 und 150 liegen, durch 50 ersetzen:
Java:
IntVector lowerThreshold = IntVector.broadcast(species, 50);
IntVector upperThreshold = IntVector.broadcast(species, 150);
for (int ix = 0; ix < species.loopBound(pixels.length); ix += species.length()) {
    IntVector rgb = IntVector.fromArray(species, pixels, ix); // enthält auf meinem System z. B. 16 int-Werte (16 Lanes)
    IntVector red = rgb.lanewise(VectorOperators.AND, 0xff0000).lanewise(VectorOperators.ASHR, 16); // alle Lanes auf "einmal" berechnen
    VectorMask<Integer> threshold = red.compare(VectorOperators.GT, lowerThreshold)
            .and(red.compare(VectorOperators.LT, upperThreshold));  // Vergleich
    red = red.blend(lowerThreshold, threshold); // wenn threshold zutrifft, Wert aus lowerThreshold, sonst aus red
    red.intoArray(redValues, ix); // den Vektor ins Array kopieren
}

Kleine Anmerkung: wenn die Anzahl der Pixel kein Vielfaches von species.length() ist, dann werden nicht alle Pixel in der Schleife verarbeitet und man muss den Rest zu Fuß machen.
 

Neue Themen


Oben