我正在尝试做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;
}
这不是按顺序执行元素删除吗?
感谢您的任何建议!