将16字节数组转换为最有效的方法是什么? 一个uint4矢量?目前,我手动将字节输入uints,然后设置 带有完成的uint的向量组件。是否有OpenCL支持执行此任务?
这适用于OpenCL 1.2
编辑:这是我的代码:
local uchar buffer[16];
uint v[4];
for (int i = 0; i < 4; ++i) {
v[i]=0;
for (int j = 0; j < 4; ++j) {
v[i] |= (buffer[(i<<2)+j]) << (j<<3);
}
}
uint4 result = (uint4)(v[0],v[1],v[2],v[3]);
编辑2:缓冲区实际上是一个本地缓冲区。
答案 0 :(得分:2)
您应该能够在不复制数据的情况下即时转换它:
CREATE FUNCTION f_CalculateDebt(
@RegistrationDate DATETIME,
@Activity NVARCHAR(100),
@Debt MONEY
)
RETURNS MONEY
AS
BEGIN
DECLARE
@Amount MONEY = 0,
@IndividualYear INT = YEAR(@RegistrationDate)
WHILE (@IndividualYear < YEAR(GETDATE()) AND @Activity = 'YES') BEGIN
IF @IndividualYear = 1998
SET @Amount = @Amount + 60000
-- Removed for readability --
ELSE IF @IndividualYear = 2013
SET @Amount = @Amount + 60000
ELSE
SET @Amount = @Amount + 75000
SET @IndividualYear = @IndividualYear + 1
END
RETURN @Amount - @Debt
END
GO
结果:
local uchar buffer[16];
if(get_local_id(0) == 0)
{
for (int x = 0; x < 4; ++x)
{
buffer[x] = x + 1;
buffer[x + 4] = x + 2;
buffer[x + 8] = x + 3;
buffer[x + 12] = x + 4;
}
local uint4 *result = (local uint4*)buffer;
printf("0x%x 0x%x 0x%x 0x%x\n", (*result).x, (*result).y, (*result).z, (*result).w);
}
如果你需要复制数据:
0x4030201 0x5040302 0x6050403 0x7060504
答案 1 :(得分:1)
如果您以不同的方式塑造数据,则可以获得相关说明:
ushort[n] upsample (uchar[n] hi, uchar[n] lo){
result[i]= ((short)hi[i]<< 8) | lo[i]
}
uint[n] upsample (ushort[n] hi, ushort[n] lo){
result[i]= ((uint)hi[i]<< 8) | lo[i]
}
但你需要uchar16 buffer' = (uchar16)(buffer[0], buffer[4], buffer[8], buffer[12], buffer[1], buffer[5], buffer[9], buffer[13], ....)
(请检查!)
为了能够执行简单的操作:
uint4 result = upsample(upsample(buffer'));
这可能是最快的方法,因为它执行矢量操作。 如果你有正确的数据形状......
但如果你的数据是对齐的,你可以直接投射它,它会起作用。
uint4 result = *((local uint4 *)(&buffer));
对于你的情况,我认为不是,所以你可以这样做:
uchar16 bufferR = (uchar16)(buffer[3], buffer[2], buffer[1], buffer[0], buffer[7], buffer[6], buffer[5], buffer[4], ....)
uint4 result = *((uint4 *)(&bufferR));
或者可以将其与创建uchar16