I need to do GPU computations on an boolean array bool[] (note, not a std::vector<bool>) which was created in CPU memory (with C++11 code) and then copied to the GPU via cuMemCpy or similar.
First question:
sizeof(bool) reports 1 byte. Is this guaranteed by the C++11 standard?
Second question:
Is true (false) always represented as 1 (0) (in the unsigned char representation) or does the compiler have freedom here ? (It could use any non-zero integer less than 256 if it wanted)
Third question (PTX specific):
In PTX logical operations or, xor, etc. only operate on types larger than 8 bit. That is I can do logical operations on an unsigned int with or.u32 <out>,<in1>,<in2>. However since C++11 bool type seems to be 8 bits does this mean I can not operate on an array of bools that was copied directly from CPU to GPU memory and thus do I need to convert the array of bools first into some type PTX logical operations can operate on, i.e. u32, u16, etc.?
First answer:
No, this is not guaranteed. See [expr.sizeof]/1, and the associated footnote:
... sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1. The result of sizeof applied to any other fundamental type (3.9.1) is implementation-defined. [Note: in particular, sizeof(bool), sizeof(char16_t), sizeof(char32_t), and sizeof(wchar_t) are implementation-defined75. ...
75) sizeof(bool) is not required to be 1.
Second Answer:
I'm pretty sure that the value representation for bool objects is implementation defined, but I can't find anything explicitly stating that. The closest that I can get is [basic.types]/4:
... For trivially copyable types, the value representation is a set of bits in the object representation that determines a value, which is one discrete element of an implementation-defined set of values.
Third Answer:
I don't know, but from your description, it certainly looks like you would have to change the types.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With