C++ 从Nvidia PTX访问bool数组(C+;+;11)的便携式方式
我需要在CPU内存(使用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位的类型进行操作。也就是说
bool[]
(注意,不是std::vector
)上进行GPU计算,然后通过cuMemCpy
或类似方式复制到GPU
第一个问题:
sizeof(bool)
报告1字节。这是由C++11标准保证的吗
第二个问题:
true
(false
)是否始终表示为1
(0
)(在无符号字符
表示中)或者编译器在这里有自由?(如果需要,它可以使用任何小于256的非零整数)
第三个问题(特定于PTX):
在PTX逻辑操作中,
或
,异或
等仅对大于8位的类型进行操作。也就是说,我可以使用或.u32,,
对无符号int
执行逻辑运算。然而,由于C++11bool
类型似乎是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的数据和计算减少可能确实会支付额外的抽象开销,特别是对于大型布尔数组。但是这取决于你对这个数组做了什么,除了整个过程中的逻辑。