Cuda 从数组中并行删除元素

Cuda 从数组中并行删除元素,cuda,Cuda,我正在尝试做一个并行版本的。我所做的是在全局内存中创建一个计数器,让每个线程处理一个元素。如果该元素不等于键,那么它将被复制到结果数组,其索引由计数器通过原子加法确定。有没有更好的办法来避免频繁的原子操作 我发现推力库也有一个remove\u if,但我对位于“推力\detail\backend\cpp\remove.h”目录中的源代码感到非常困惑: template<typename ForwardIterator, typename InputIterator, t

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

我发现推力库也有一个remove\u if,但我对位于“推力\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;
}
模板
ForwardIterator remove_if(ForwardIterator first,
ForwardIterator last,
输入计算器模板,
谓词pred)
{
//推进迭代器,直到pred(*stencil)为真或到达输入的末尾
while(first!=last&&!bool(pred(*stencil)))
{
++第一,;
++模板;
}
如果(第一个==最后一个)
先返回;
//结果总是排在第一位
ForwardIterator结果=第一个;
++第一,;
++模板;
while(第一个!=最后一个)
{
如果(!bool(pred(*模具)))
{
*结果=*第一;
++结果;
}
++第一,;
++模板;
}
返回结果;
}
这不是按顺序执行元素删除吗


谢谢你的建议

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

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


如果你有一个垂直的应用程序,而且推力不够快,那么最后一个办法就是使用基于扫描的实现。该算法的一行摘要是在谓词的倒数上进行并行前缀和(“扫描”),然后由扫描的相应元素指定要保留的元素的输出索引。

我忘了提到可以在哪里与推力用户社区接触:谢谢你的建议。使用前缀sum是个好主意!