首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCL中的可移植向量移位/置换?

OpenCL中的可移植向量移位/置换?
EN

Stack Overflow用户
提问于 2020-07-19 19:54:50
回答 1查看 75关注 0票数 0

我正在尝试编写一个修剪过的均值内核,它接受一组帧(~100)作为输入。我正在考虑使用插入排序(大小约为8)。这意味着我需要从输入图像中一次读取一个浮点数/ uint/ushort,并将其与一个8宽的向量进行比较,将元素向上移位并在正确的点插入新值(如果需要),并将最大值添加到平均值。

我很难找到一种可移植的方法来移动向量中的元素,并将新元素插入到正确的位置。例如,我知道AMD有ds_permute,但它们是不可移植的,我想不出一个聪明的方法来使用算术和关系运算符来做这件事(因为这些运算符只在它们的通道上操作,而AFAIK未对齐的向量访问在OpenCL中是UB )。

EN

回答 1

Stack Overflow用户

发布于 2020-07-30 07:14:14

如果您的列表中只有8个项目,那么您可以添加一些间接地址,并拥有一个索引表uchar8。您可以为预先排序的元素指定值0-7。在执行排序时,您不会重新排列这些项,而是将它们的索引插入到表中。

为了获得加速,您需要使用4位来存储每个索引,以便将所有8位存储到一个32位字中。老实说,我不认为这在你的情况下会更快。

代码语言:javascript
运行
复制
float elements[8];
uint index_table = 0;
uint sorted_size = 0;

// insert elements[i]
void insert(uint i)
{
    uint temp = index_table
    for (j = 0; j < sorted_size ; ++j)
    {
        if (elements[i] < elements[temp & 0xf])
        {
            // Insert i
            temp = (temp << 4) | i;
            index_table = (index_table & (4 * j - 1)) | (temp << (4 * j));
            return;
        }
        temp >>= 4;
    }

    // Insert at end
    index_table  |= i << 4 * sorted_size ;
}

void insertion_sort()
{
    // We can skip the first iteration since the 1st element is always inserted at the start
    for (sorted_size = 1; sorted_size < 8; ++sorted_size)
    {
        insert(sorted_size);
    }
}

float ith_smallest(uint i)
{
    return elements[(index_table >> 4 * i) & 0xf]; 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62979932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档