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