从Nvidia PTX访问bool(C++ 11)数组的便携方式

rit*_*ter 5 c++ gpu boolean c++11 ptx

我需要对在CPU内存中创建的布尔数组bool[](注意,而不是a std::vector<bool>)进行GPU计算(使用C++ 11代码),然后通过cuMemCpy或类似地复制到GPU .

第一个问题:

sizeof(bool)报告1个字节.这是否由C++ 11标准保证?

第二个问题:

true(false)总是表示为1(0)(在unsigned char表示中)还是编译器在这里有自由?(如果需要,它可以使用任何小于256的非零整数)

第三个问题(特定于PTX):

在PTX逻辑运算orxor,等仅对大于8位的类型进行操作.那就是我可以在unsigned intwith 上进行逻辑运算or.u32 <out>,<in1>,<in2>.但是,由于C++ 11 bool类型似乎是8位,这是否意味着我无法操作bools直接从CPU复制到GPU内存的数组,因此我需要将第一个数组转换bools为某种类型的PTX逻辑操作可以操作上,也就是说u32,u16等?

Man*_*rse 1

第一个答案:

不,这不能保证。请参阅[expr.sizeof]/1和相关脚注:

... sizeof(char)、sizeof(signed char) 和 sizeof(unsigned char) 均为 1。应用于任何其他基本类型 (3.9.1) 的 sizeof 的结果是实现定义的。[注意:特别是, sizeof(bool)、sizeof(char16_t)、sizeof(char32_t) 和 sizeof(wchar_t) 是实现定义的75。...

75) sizeof(bool) 不需要为 1。


第二个答案:

我很确定bool对象的值表示是实现定义的,但我找不到任何明确说明这一点的内容。我能得到的最接近的是[basic.types]/4

...对于普通可复制类型,值表示是对象表示中确定值的一组位,该值是实现定义的一组值的一个离散元素。


第三个答案:

我不知道,但从你的描述来看,你肯定必须改变类型。