Überleg dir lieber, was du am Ende mit deinen Bool'schen Werten machen willst. Willst du Werte selektieren? Muss
true aufgrund irgendeines Hacks
1 sein? Nehmen wir mal zwei Beispiele aus der Welt der alten 8086-Mühlen. Nehmen wir an, dass du einen Algorithmus haben willst, der sich aus einem Bild alle Pixel anschaut, mit einer "Vorher"-Farbe vergleicht, und jedes Aufkommen der "Vorher"-Farbe durch die "Nachher"-Farbe ersetzt. Dein Code sieht dann in etwa so aus, wenn du SIMD verwendest:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
// stuff...
_current = _mm256_add_epi32( // _current => aktuelle 8 Pixel
_current,
_mm256_and_si256(
_diff, // __m256i{_after.RGBA - _before.RGBA}
_mm256_cmpeq_epi32(_cmp,_current) // _cmp => __m256i{_before.RGBA}
) // diff*(pixel==before)
); // pixel += diff*(pixel==before)
// ...
|
Hier liefert das Ergebnis von Vergleichen mit SSE/AVX
(hier _mm256_cmpeq_si256()) immer
0 oder
-1 pro SIMD-Zelle. Dadurch erspart man sich eine zeitaufwändige Multiplikation und erledigt den ganzen Salat einfach mit einer Bitweise-Und-Verknüpfung.
|
C-/C++-Quelltext
|
1
|
inline int branchfree_min(int a, int b) noexcept {return b^((a^b)&-(a<b));}
|
Dieser kleine Hack hier, der ohne bedingte und unbedingte Sprünge das Minimum zweier Zahlen liefert, vertraut wiederum darauf, dass
true zu
1 evaluiert.
(Gut, dreht das ganze dann zu -1 um, aber pff...)
Worauf ich damit hinaus wollte ist, dass abhängig davon, was du für Algorithmen durch die GPU jagen willst, es vielleicht sinnvoll wäre einen neuen Typen
GPU_bool zu definieren, der sich fix zu und von
bool casten lässt.
Allerdings musst du schon ganz schön Ärger mit Größe usw. haben, dass solche Überlegungen/Hacks es wert sind, in Erwägung gezogen zu werden. D: