我正在尝试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;
}
这不是按顺序执行元素删除吗?
感谢您的任何建议!
答案 0 :(得分:2)
除非您有令人信服的理由推出自己的实现,否则我建议您使用Thrust remove_if()。 Thrust是在STL上建模的,如果您对通用性的要求相似,那么您最终将编写与Thrust源代码非常相似的代码。
如果Thrust的表现不尽如人意,Thrust社区(包括主要作者)可能会就如何制定代码以获得更好的性能提出很好的建议。
失败 - 如果你有一个垂直应用程序并且Thrust不够快 - 将基于扫描的实现作为最后的手段。该算法的一行摘要是在谓词的反转上进行并行前缀和(“扫描”) - 然后由扫描的相应元素指定要保留的元素的输出索引。