1

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

我发现thrust库也有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;
}

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

感谢您的任何建议!

4

1 回答 1

2

除非您有令人信服的理由推出自己的实现,否则我建议您只使用 Thrust remove_if()。Thrust 以 STL 为模型,如果您对通用性的要求相似,您最终会编写看起来与 Thrust 源代码非常相似的代码。

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

如果做不到这一点 - 如果你有一个垂直应用程序并且 Thrust 不够快 - 作为最后的手段滚动基于扫描的实现。该算法的一行总结是对谓词的逆进行并行前缀求和(“扫描”)——然后由扫描的相应元素指定要保留的元素的输出索引。

于 2012-09-08T20:40:28.497 回答