Types OpenCL:如何从uint4(或ulong[2])访问每个16个uchar值?
我有16个从0到255(每个8位)的索引存储在一个大uint4中,另一个存储在一个ulong中[2] 如何转换它们,以便访问它们各自的8位(uchar)值 现在我正在为uint4进行这样的转换:Types OpenCL:如何从uint4(或ulong[2])访问每个16个uchar值?,types,opencl,uint,ulong,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; 然后我可以像这
index1 = myUint4Val.s0 & 0xff;
index2 = (myUint4Val.s0 >>8) & 0xff;
...
index16 =(myUint4Val.s3 >>24) & 0xff;
然后我可以像这样使用它们:
value = dataAt[index1]; ....
我不希望使用那些>
,&0xff
,因为这些是我希望避免的额外操作
而是以uchar8.s0
的形式访问它们<代码>uchar8.s7,似乎没问题
但是我在将类型转换为我想要的类型方面遇到了困难…您可以获取您的
myUint4Val
的地址,将结果指针强制转换为uchar*
,并将其视为uchar变量数组:
uchar* index_array = (uchar*)&myUint4Val;
value = dataAt[index_array[0]];
value = dataAt[index_array[1]];
或者,您可以执行C风格的重新解释强制转换构造,它告诉编译器将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];
注意:我没有机会测试这一点,但我希望总体思路能有所帮助。在OpenCL中,函数
被重新解释为*()
比如说,
uint16 a = as_uint16(myUint4Val); // now you can use a.s0, a.s01, a.s2 etc
uint16 b = as_uint16(myUint8Val);
我不认为我们可以像C那样做,因为当我看到openCL中的代码时,我从未见过如此简单的转换数据类型的方法。谢谢你的信息