OpenCL:如何从uint4(或ulong [2])访问每个16 uchar值?

时间:2017-11-03 15:37:28

标签: types opencl uint ulong

我有16个索引,从0到255(每个8位)存储在一个大的uint4中,另一个存储在一个ulong [2]中。

如何转换它们以便我可以访问它们各自的8位(uchar)值?

现在我正在为uint4做这样的转换:

index1 =  myUint4Val.s0       & 0xff;  
index2 = (myUint4Val.s0 >>8)  & 0xff;
...
index16 =(myUint4Val.s3 >>24) & 0xff;

然后我可以使用它们:

value = dataAt[index1]; ....

我不想使用那些>>& 0xff,因为这些是我希望避免的额外操作。

相反,以uchar8.s0 .. uchar8.s7访问它们似乎没问题,

但我仍然坚持将类型转换为我想要的类型......

2 个答案:

答案 0 :(得分:1)

在OpenCL中有重新解释函数as_*()

例如,

uint16 a = as_uint16(myUint4Val); // now you can use a.s0, a.s01, a.s2 etc
uint16 b = as_uint16(myUint8Val);

答案 1 :(得分:0)

您可以获取myUint4Val的地址,将结果指针强制转换为uchar*并将其视为uchar变量数组:

uchar* index_array = (uchar*)&myUint4Val;

value = dataAt[index_array[0]];
value = dataAt[index_array[1]];

或者你可以做一个C-Style重新解释 - 转换构造,它告诉编译器将myUint4Val的内存视为其他类型(这里要小心类型大小)。要将前8个索引转换为uchar8,您可以尝试以下操作,从而创建正确类型的副本。它基本上通过&获取地址,将指针类型更改为所需的uchar8*指针类型,并取消引用指向uchar8值类型的指针。

uchar8 index = *((uchar8*)&myUint4Val); // takes first 8 byte
value = dataAt[index.s0];

或者,您可以只创建一个正确类型的指针:

uchar8* index = (uchar8*)&myUint4Val;
value = dataAt[(*index).s0];

注意:我没有机会对此进行测试,但我希望这个概念有所帮助。