Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么OpenCL中不允许使用位字段?_Opencl_Bit Fields - Fatal编程技术网

为什么OpenCL中不允许使用位字段?

为什么OpenCL中不允许使用位字段?,opencl,bit-fields,Opencl,Bit Fields,OpenCL语言不支持位字段。不支持他们的原因是什么?与其他被省略的部分(递归、函数指针等)不同,这里有明显的理由不支持它们,我没有看到位字段的原因。我肯定这不是代表委员会的疏忽,但原因是什么 (我将一些位存储在int中,使用它们阅读代码会更好。我认为位字段是避免位来回移动和屏蔽的好语法,这就是它们在汇编中的转换方式。)我能够向工作组中的某个人提出这个问题。以下是他不得不说的: 位字段是不可移植的,因此它们不能 在用于内核参数的类型中使用 它们只能用于局部变量的类型 在内核中声明 OpenCL工

OpenCL语言不支持位字段。不支持他们的原因是什么?与其他被省略的部分(递归、函数指针等)不同,这里有明显的理由不支持它们,我没有看到位字段的原因。我肯定这不是代表委员会的疏忽,但原因是什么


(我将一些位存储在int中,使用它们阅读代码会更好。我认为位字段是避免位来回移动和屏蔽的好语法,这就是它们在汇编中的转换方式。)

我能够向工作组中的某个人提出这个问题。以下是他不得不说的:

位字段是不可移植的,因此它们不能 在用于内核参数的类型中使用

它们只能用于局部变量的类型 在内核中声明

OpenCL工作组并不认为这是非常有用的。在里面 此外,有人担心编译器可能无法生成 使用位字段时的高效代码。所有这些导致了 工作组同意在OpenCLC中不支持位字段的决定


Wikipedia在以下方面提供了一些信息:

上述结构中的钻头构件存在潜在的实际缺陷。首先,内存中位的顺序取决于CPU,不同编译器的内存填充规则可能有所不同。此外,优化程度较低的编译器有时会生成用于读取和写入位成员的低质量代码,并且存在与位字段相关的潜在线程安全问题,因为大多数计算机无法操作内存中的任意位集,而必须加载和存储整个字


我认为所有这些缺点在OpenCL环境中都是相关的。

请记住,OpenCL允许使用小型endian主机和大型endian设备。允许位字段只会使混合端性支持更加复杂。不可移植。。。它只适用于相同的终结性的论点是软弱的。许多OpenCL代码(包括我的)都是为特定的硬件编写的。程序员应该更好地知道使用什么和不使用什么。(我有一段代码可以访问int中的位组;使用位字段会容易得多:-|)OpenCL类型(在一致性实现中)具有相同的内存布局,否则将缓冲区从主机复制到设备将毫无意义。比特排序的要点。对于其余部分(线程安全、编译器质量),这与CPU没有什么不同。我可以将我的代码粘贴到int格式的位域中:这是非常不雅观的。大概,endianness只会影响long数组等等?如果我们以无符号字符数组的形式存储/发送,那么字节的顺序以及字节内位的顺序是有保证的吗?