1

Ist es überhaupt möglich? Ich weiß, dass OpenCL im Moment keine normalen Bitfelder unterstützt.OpenCL fake bitfield

Könnte es eine Möglichkeit sein, einen bestimmten 64-Bits aus Bool myBool [64] oder so etwas wie

union newType{ 
    double value; 
    bool bit[64]; 
}; 

oder irgendetwas überhaupt fern zu bekommen zusammen, dass hilfreich sein könnte? Ich möchte einige statische Bitmuster haben, um mit Werten verglichen zu werden und in der Lage zu sein, einzelne Bits der Muster schnell zu manipulieren.

Antwort

2

Die OpenCL Spec garantiert, dass ein double 64 Bit sein wird, und dass Sie sie neu interpretieren as_long() oder eine Vereinigung mit einem long zu erhalten, die 64 Bits ist.

Reinterpreting einen 64-Bit-Skalar so etwas wie ein char[8] oder ein char8 legal ist (eine Vereinigung und as_char8() jeweils verwendet wird), aber das Ergebnis ist die Implementierung definiert. Dinge wie Endianness-Conversions können auftreten, daher müssen Sie möglicherweise darauf achten, ob sich Ihre GPU in dieser Hinsicht von Ihrer CPU unterscheidet.

Die einzige Möglichkeit, Bit-Manipulationen an einem double durchzuführen, besteht darin, bitweise Operatoren für einen 64-Bit-Skalar-Integertyp zu verwenden, der long oder ulong entspricht.

+0

Portabilität ++ vielen Dank =) –

1

Ja, es ist möglich. Verwenden Sie binäre Operatoren auf einem 64-Bit-Int. Nicht sicher, ob 64-Bit-Ints gültig sind. Erstellen Sie also einfach eine Struktur mit 2 Ints und maskieren und verschieben Sie sie wie gewünscht.

Ich schlage vor, Sie die Operatoren untersuchen &|^~

+0

super danke! wird ein struct myStruct { char [8]; } funktionieren auch? –

+1

ja, aber hüte dich vor endedness-Problemen und @ user57368 Staaten in seiner/ihrer Antwort – EnabrenTane

+0

vielleicht könnte ich einen kleinen Endian-Kernel und eine große Endian-Kernel-Version basierend auf der Initialisierungsphase der Anwendung oder so etwas haben, danke nochmal! –