OpenCL语言不支持位域。什么是不支持他们的原因?与其他部分不同(递归,指向函数的指针,...),如果有明显的理由不支持它们,我不会看到一个位域。我相信这不是代表委托人的疏忽,但是原因是什么?我将bitfields理解为避免位移和屏蔽的好语法,而这正是它们在汇编中转换到的东西。不管怎么说, )为什么在OpenCL中不允许位域?
回答
我可以问一个涉及工作组的人的这个问题。以下是他不得不说的:
位字段不可移植 - 因此它们不能在用于内核参数的类型中使用 。
可以使用的唯一地方是用于在内核中声明的局部变量 的类型。
OpenCL工作组不认为这是非常有用的。此外,还有人担心编译器在使用位域时可能不会生成 高效代码。所有这些都导致了 工作组,决定不支持位字段中的OpenCL C.
维基百科对drawbacks of bitfields一些信息:在结构
位成员如上文中所具有的潜力实际的缺点。首先,内存中位的排序取决于CPU,并且内存填充规则可能因编译器而异。另外,较少优化的编译器有时会生成质量差的代码来读写位成员,并且存在与位字段相关的潜在线程安全问题,因为大多数机器不能处理内存中的任意位集,而必须加载和存储整个字。
我认为所有这些缺点在OpenCL环境中都是相关的。
OpenCL类型具有(符合实现的)相同的内存布局,否则将缓冲区从主机复制到设备会使没有意义。点位取决于排序。对于其余部分(线程安全性,编译器质量),这与CPU没有区别。我可以将我的代码粘贴到整个字段中:它非常不雅观。 – eudoxos 2012-01-31 10:04:29
推测,endianness只影响长阵列等?如果我们作为一个无符号字符数组进行存储/发送,那么字节的排序和字节内各位的排序是有保证的? – 2015-04-26 00:55:20
- 1. OpenCL中不允许使用变长数组声明 - 为什么?
- 2. 为什么正常变量不允许位域?
- 3. %为什么不允许
- 4. 域中允许的字符是什么?
- 5. 为什么header允许跨域不允许使用echo来输出变量值?
- 6. 为什么不允许跨域AJAX调用?
- 7. 为什么java允许NPE
- 8. 尝试在调试中编辑时不允许更改为64位,为什么?
- 9. 为什么样式表列不允许?
- 10. 为什么Java不允许以
- 11. 为什么CalendarProvider不允许写入ExtendedProperties?
- 12. 为什么System.out.println(super)不允许?
- 13. 为什么变量不允许绑定
- 14. 为什么不允许密码验证?
- 15. 为什么我的XMLHttpRequest不允许XSS?
- 16. 为什么不允许我调试
- 17. 为什么IDBKeyRange.only()不允许布尔值?
- 18. 为什么PHP不允许比较?
- 19. 为什么a,b = 1不允许?
- 20. 为什么C++不允许使用typeof?
- 21. 为什么sfinae如果constexpr不允许?
- 22. Spy ++ 32和64位不允许同时运行。为什么?
- 23. 为什么不在PHP上传表单域中指定“允许”文件类型?
- 24. 为什么移位超过允许位仍然有效?
- 25. 为什么在功能内允许“做”?
- 26. 允许装箱的空值,那么为什么拆箱不被允许?
- 27. 为什么在UDF中不允许TRY-CATCH块?
- 28. 为什么Postgres允许我的列不在组中?
- 29. 为什么在匿名方法中不允许out参数?
- 30. 为什么#不允许在标识符中?
重要的是要记住,OpenCL允许像小端主机和大端设备这样的东西。允许位域只会使混合排序支持进一步复杂化。 – user57368 2012-01-28 06:34:22
不可移植...它只适用于相同的排序的参数很弱。许多OpenCL代码(包括我的)将被编写为特定的硬件。程序员应该更好地知道要使用什么,什么不使用。 (我有一段代码来访问一个int内的位组;这对位域来说会更容易: - |) – eudoxos 2012-01-29 11:09:10