Ich baue eine Simulation des Ising-Modells in OpenCL, was bedeutet, dass meine Daten aus einer Reihe von Zuständen bestehen, die entweder oben/1 oder unten sein können/-1.OpenCL - Der effizienteste Weg, um Byte in einen 8-Komponenten-Vektor zu teilen
Um Speicherbandbreite zu sparen, werden 8 dieser Zustände in ein einzelnes Byte codiert (nach oben = 1, nach unten = 0). Nun benötige ich in einer der Berechnungen einen ganzzahligen Vektor mit Werten, die den ursprünglichen Zuständen entsprechen, d. H. 1 oder -1.
Beispiel:
Eingangsbyte (uchar in OpenCL): 01010011
Umrechnen in: (int8)(-1,1,-1,1,-1,-1,1,1);
Ich habe eine funktionierende Lösung für dieses Problem, aber ich frage mich, ob es ein schneller, effizienter übrigens:
uchar c = spins[id];
int8 spin;
spin.s0 = (c >> 0) & 1;
spin.s1 = (c >> 1) & 1;
spin.s2 = (c >> 2) & 1;
spin.s3 = (c >> 3) & 1;
spin.s4 = (c >> 4) & 1;
spin.s5 = (c >> 5) & 1;
spin.s6 = (c >> 6) & 1;
spin.s7 = (c >> 7) & 1;
spin = spin * 2 - 1;
EDIT:
scheinen nicht schneller in meiner Situation zu sein, aber es ist prägnanter bei leas t:
__constant uchar8 bits = (uchar8)(0,1,2,3,4,5,6,7);
uchar c = spins[id];
int8 spin = convert_int8((uchar8)(c) >> bits & 1) * 2 - 1;
Das scheint schon eine ziemlich saubere Lösung, warum etwas komplizierter gehen? 'int8 spin = ((int8) (c) >> (int8) (0,1,2,3,4,5,6,7) & 1) * 2 - 1;' – DarkZeros