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

C++ 从Nvidia PTX访问bool数组(C+;+;11)的便携式方式,c++,c++11,boolean,gpu,ptx,C++,C++11,Boolean,Gpu,Ptx,我需要在CPU内存(使用C++11代码)中创建的布尔数组bool[](注意,不是std::vector)上进行GPU计算,然后通过cuMemCpy或类似方式复制到GPU 第一个问题: sizeof(bool)报告1字节。这是由C++11标准保证的吗 第二个问题: true(false)是否始终表示为1(0)(在无符号字符表示中)或者编译器在这里有自由?(如果需要,它可以使用任何小于256的非零整数) 第三个问题(特定于PTX): 在PTX逻辑操作中,或,异或等仅对大于8位的类型进行操作。也就是说

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

第一个问题:

sizeof(bool)
报告1字节。这是由C++11标准保证的吗

第二个问题:

true
false
)是否始终表示为
1
0
)(在
无符号字符
表示中)或者编译器在这里有自由?(如果需要,它可以使用任何小于256的非零整数)

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


在PTX逻辑操作中,
异或
等仅对大于8位的类型进行操作。也就是说,我可以使用
或.u32,,
无符号int
执行逻辑运算。然而,由于C++11
bool
类型似乎是8位,这是否意味着我不能对直接从CPU复制到GPU内存的
bool
数组进行操作,因此我需要首先将
bool
数组转换为PTX逻辑操作可以操作的某种类型,即
u32
u16
,等等?

第一个答案:

不,这不是保证。参见
[expr.sizeof]/1
,以及相关脚注:

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

75)sizeof(bool)不要求为1


第二个答案:

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

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


第三个答案:


我不知道,但从您的描述来看,您肯定需要更改类型。

true
保证转换为
1
(同样
false
转换为
0
)当从
bool
转换为整数类型时,实际的表示完全取决于实现,包括大小以及
true
false
所使用的位。因此,不幸的是,前两个问题的答案是,即使在实践中通常与您假设的行为完全一致。您知道您在上一个问题中描述的限制是因为寄存器大小始终为32位?您可以自由地将8位类型加载到32位寄存器的低位,并在其上执行您认为合适的逻辑操作。但在bool上,您仍然只有1位。您确定这真的是你想要的方法吗?除了32位之外,还有其他寄存器大小。例如,PTX允许对
u16
u64
进行逻辑操作。为了解决你的问题:是的,我必须在GPU上进行逻辑计算。我看到了两种方法:将CPU内存中的数据转换为PTX可以处理或保留数据格式的内容,加载8位(
ld.u8
)并转换为更大的类型,即
cvt.u32.u8
。但是我担心portability@Frank我认为Talonmes的最后一句话(请原谅任何可能的误解)更倾向于考虑使用布尔数组的一些更抽象的表示,例如
uint32
s数组,其中的单个位表示实际的布尔值,其16/32:1的数据和计算减少可能确实会支付额外的抽象开销,特别是对于大型布尔数组。但是这取决于你对这个数组做了什么,除了整个过程中的逻辑。