将字节数组转换为向量

时间:2015-10-05 15:29:13

标签: opencl

将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:缓冲区实际上是一个本地缓冲区。

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

块的代码部分对齐