인덱스 테이블에서의 순서 보존 선택은 직렬 코드에서는 쉽지 않지만 멀티 스레딩에서는 덜 효율적입니다. 특히 효율성을 유지하려는 경우 (전체 점 멀티 스레딩)을 피할 수 있습니다. 시리얼 코드 나는이 멀티 스레드 (TBB 또는 OpenMP를를 사용하는 말), 특히 data.size() < key.size()
경우를 할 수있는 방법인덱스 테이블에서의 순서 보존 선택을위한 병렬 알고리즘
template<typename T>
std::vector<T> select_in_order(
std::vector<std::size_t> const&keys, // permutation of 0 ... key.size()-1
std::vector<T> const&data) // anything copyable
{ // select data[keys[i]] allowing keys.size() >= data.size()
std::vector<T> result;
for(auto key:keys)
if(key<data.size())
result.push_back(data[key]);
return result;
}
생각해?
+1 (모든 GPU에서는 너무 무겁지만) 스트림 압축 알고리즘을 언급합니다. – Walter
tbb에는'parallel_scan()'도 있습니다. – Walter