5

我需要在 CPU 内存(使用 C++11 代码)中创建的布尔数组bool[](注意,不是 a std::vector<bool>)上进行 GPU 计算,然后通过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++11bool类型似乎是 8 位,这是否意味着我不能对bools直接从 CPU 复制到 GPU 内存的数组进行操作,因此我需要将boolsfirst 的数组转换为某种类型的 PTX 逻辑操作吗?操作,即u32u16等?

4

1 回答 1

1

第一个答案:

不,这不能保证。请参阅[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

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


第三个答案:

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

于 2012-10-15T11:26:30.547 回答