2017-12-01 11 views
1

私は10M floatのベクトルを持っています。 100要素ごとの合計を知りたいので、10000合計です。 これを行う最も速い方法は何ですか?Boostの最速の方法::ベクトルの部分和を計算する

+0

あなたは 'OpenCL' 2を使用することができるなら、私は([こちら]フセインの答え@お勧めしますhttps://stackoverflow.com/questions/46861492/what-is-the-optimum-opencl-2-kernel 〜sum-floats) – kenba

答えて

1

reduce_by_keyアルゴリズム、空想反復子、Boost.Compute lambda exprの使用をお勧めします。 100個の要素ごとに同じキーでマークされ、縮小されます。パフォーマンスを節約するためにkeys_outputdiscard_iteratorに置き換えることができるかどうかはわかりません。

boost::compute::vector<int> keys_output(values_input.size()/100, context); 
boost::compute::vector<int> values_output(values_input.size()/100, context); 

boost::compute::reduce_by_key(
    boost::compute::make_transform_iterator(
     boost::compute::make_counting_iterator<int>(0), 
     boost::compute::_1/100 
    ), 
    boost::compute::make_transform_iterator(
     boost::compute::make_counting_iterator<int>(values_input.size()), 
     boost::compute::_1/100 
    ), 
    values_input.begin(), 
    keys_output.begin(), 
    values_output.begin(), 
    queue 
); 
+0

awsome!ありがとう。 – Parker

+0

誰かがパフォーマンス/生成コードをテストしましたか? – sehe

+0

手書きのOpenCLコードほど高速ではありません。これは特別なケースです。ほとんどのGPUでは、1つまたは2つのステップ(カーネル)でベクターから100要素を合計することができます。 – haahh

関連する問題