OpenCL中的保留数据类型是什么?

OpenCL中的保留数据类型是什么?,c,opencl,C,Opencl,我想编写一个内核,它接受float3数据类型并返回bool4数据类型。我查看了规范,booln没有像floatn一样列在内置向量数据类型下,而是列在保留数据类型下,所以我尝试这样使用它: ( __global const float3 *vectors , __global bool4 *booleans) 但它返回一个错误未知类型名'bool4'。那么什么是保留数据类型以及如何使用它们呢?保留数据类型 float3是保留的,以及floatn,n不是2的幂。因此,我建议使用float4,不要

我想编写一个内核,它接受float3数据类型并返回bool4数据类型。我查看了规范,booln没有像floatn一样列在内置向量数据类型下,而是列在保留数据类型下,所以我尝试这样使用它:

( __global const float3 *vectors , __global bool4 *booleans)
但它返回一个错误
未知类型名'bool4'
。那么什么是保留数据类型以及如何使用它们呢?

保留数据类型

  • float3
    是保留的,以及
    floatn
    ,n不是2的幂。因此,我建议使用
    float4
    ,不要在意最后一个组件

  • bool4
    是保留的,以及所有n的
    booln
    。不过,您仍然可以使用
    char4

如果内存大小真的很重要,可以使用以下方法:

union {
    char raw;
    struct st {
        unsigned int i : 1; // bit field to use only one bit
    } c[4];
} my_bool4;
然后使用[0,3]中所有i的
my_bool4.c[i]
my_bool4.raw
和位掩码访问每个组件


这样,
my_bool4
的长度将仅为1字节,而不是
char4
的长度为4字节(这取决于编译器,但您要求的是1字节)。

Google,第一个结果:我读到了,但我仍然不明白。如果不能使用,为什么要在规范中编写它们?使用bool4的替代方案是什么?
bool4
不保留。似乎
typen
是保留的,如果n不是2的幂。所以float3是保留的,但您可以简单地使用float4。您的意思是使用float4而不是bool4?这将是超级低效的,因为我将复制到主机内存。