我正在尝试编写一个修剪过的均值内核,它接受一组帧(~100)作为输入。我正在考虑使用插入排序(大小约为8)。这意味着我需要从输入图像中一次读取一个浮点数/ uint/ushort,并将其与一个8宽的向量进行比较,将元素向上移位并在正确的点插入新值(如果需要),并将最大值添加到平均值。
我很难找到一种可移植的方法来移动向量中的元素,并将新元素插入到正确的位置。例如,我知道AMD有ds_permute,但它们是不可移植的,我想不出一个聪明的方法来使用算术和关系运算符来做这件事(因为这些运算符只在它们的通道上操作,而AFAIK未对齐的向量访问在OpenCL中是UB )。
发布于 2020-07-30 07:14:14
如果您的列表中只有8个项目,那么您可以添加一些间接地址,并拥有一个索引表uchar8。您可以为预先排序的元素指定值0-7。在执行排序时,您不会重新排列这些项,而是将它们的索引插入到表中。
为了获得加速,您需要使用4位来存储每个索引,以便将所有8位存储到一个32位字中。老实说,我不认为这在你的情况下会更快。
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];
}
https://stackoverflow.com/questions/62979932
复制相似问题