2012-01-27 20 views
6

OpenCL语言不支持位域。什么是不支持他们的原因?与其他部分不同(递归,指向函数的指针,...),如果有明显的理由不支持它们,我不会看到一个位域。我相信这不是代表委托人的疏忽,但是原因是什么?我将bitfields理解为避免位移和屏蔽的好语法,而这正是它们在汇编中转换到的东西。不管怎么说, )为什么在OpenCL中不允许位域?

回答

9

我可以问一个涉及工作组的人的这个问题。以下是他不得不说的:

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

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

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

+1

重要的是要记住,OpenCL允许像小端主机和大端设备这样的东西。允许位域只会使混合排序支持进一步复杂化。 – user57368 2012-01-28 06:34:22

+0

不可移植...它只适用于相同的排序的参数很弱。许多OpenCL代码(包括我的)将被编写为特定的硬件。程序员应该更好地知道要使用什么,什么不使用。 (我有一段代码来访问一个int内的位组;这对位域来说会更容易: - |) – eudoxos 2012-01-29 11:09:10

1

维基百科对drawbacks of bitfields一些信息:在结构

位成员如上文中所具有的潜力实际的缺点。首先,内存中位的排序取决于CPU,并且内存填充规则可能因编译器而异。另外,较少优化的编译器有时会生成质量差的代码来读写位成员,并且存在与位字段相关的潜在线程安全问题,因为大多数机器不能处理内存中的任意位集,而必须加载和存储整个字。

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

+0

OpenCL类型具有(符合实现的)相同的内存布局,否则将缓冲区从主机复制到设备会使没有意义。点位取决于排序。对于其余部分(线程安全性,编译器质量),这与CPU没有区别。我可以将我的代码粘贴到整个字段中:它非常不雅观。 – eudoxos 2012-01-31 10:04:29

+0

推测,endianness只影响长阵列等?如果我们作为一个无符号字符数组进行存储/发送,那么字节的排序和字节内各位的排序是有保证的? – 2015-04-26 00:55:20