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

时间:2012-01-27 13:28:56

标签: opencl bit-fields

OpenCL语言不支持位域。不支持他们的原因是什么?与其他忽略的部分(递归,函数指针,......)不同,有明显的理由不支持它们,我没有看到一个用于位域。我确信这不是代表委员会的疏忽,但是原因是什么?

(我存储了一些打包在int中的位,并且代码可以更好地与它们一起读取。我理解bitfields是一种很好的语法,可以避免位移和来回屏蔽,无论如何它们都是在汇编中转换的。 )

2 个答案:

答案 0 :(得分:9)

我能够问这个涉及工作组的人的问题。这就是他要说的话:

  

位字段不可移植 - 所以他们不能   用于内核参数的类型。

     

他们可以使用的唯一地方是局部变量的类型   在内核中声明。

     

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

答案 1 :(得分:1)

维基百科有关于drawbacks of bitfields的一些信息:

  

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

我认为所有这些缺点都与OpenCL环境有关。