STL remove_ifの並列バージョンを実行しようとしています。私が行ったことは、グローバル メモリにカウンターを作成し、各スレッドが 1 つの要素で動作するようにすることです。その要素がキーと等しくない場合は、結果の配列にコピーされ、アトミック加算によってカウンターによって決定されたインデックスが付けられます。頻繁なアトミック操作を避けるためのより良い代替手段はありますか?
スラスト ライブラリにも 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;
}
これはエレメント除去を順番に行っているのではないでしょうか?
ご提案ありがとうございます。