并行从数组中删除元素

时间:2012-09-08 05:45:36

标签: cuda

我正在尝试STL remove_if的并行版本。我所做的是在全局内存中创建一个计数器,让每个线程在一个元素上工作。如果该元素不等于键,则它将被复制到结果数组,其中索引由计数器通过原子添加确定。有没有更好的替代方法来避免频繁的原子操作?

我发现推力库也有一个remove_if,但我对位于“thrust \ detail \ backend \ cpp \ remove.h”目录中的源代码感到非常困惑:

template<typename ForwardIterator,
     typename InputIterator,
     typename Predicate>
ForwardIterator remove_if(ForwardIterator first,
                        ForwardIterator last,
                        InputIterator stencil,
                        Predicate pred)
{
// advance iterators until pred(*stencil) is true or we reach the end of input
while(first != last && !bool(pred(*stencil)))
{
    ++first;
    ++stencil;
}

if(first == last)
    return first;

// result always trails first 
ForwardIterator result = first;

++first;
++stencil;

while(first != last)
{
    if(!bool(pred(*stencil)))
    {
        *result = *first;
        ++result;
    }
    ++first;
    ++stencil;
}

return result;
}

这不是按顺序执行元素删除吗?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

除非您有令人信服的理由推出自己的实现,否则我建议您使用Thrust remove_if()。 Thrust是在STL上建模的,如果您对通用性的要求相似,那么您最终将编写与Thrust源代码非常相似的代码。

如果Thrust的表现不尽如人意,Thrust社区(包括主要作者)可能会就如何制定代码以获得更好的性能提出很好的建议。

失败 - 如果你有一个垂直应用程序并且Thrust不够快 - 将基于扫描的实现作为最后的手段。该算法的一行摘要是在谓词的反转上进行并行前缀和(“扫描”) - 然后由扫描的相应元素指定要保留的元素的输出索引。