【问题标题】:parallel removal of elements from an array从数组中并行删除元素
【发布时间】:2012-09-09 04:40:28
【问题描述】:

我正在尝试制作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;
}

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

感谢您的任何建议!

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多