2017-12-01 16 views
1

Ich habe einen Vektor von 10M float. Ich möchte die Summe aller 100 Elemente wissen, also insgesamt 10000 Summen. Was ist der schnellste Weg, dies zu tun?Was ist der schnellste Weg von Boost :: compute Vektor Partialsumme

+0

Wenn Sie verwenden können, 'OpenCL' 2, dann empfehle ich @ huseyin Antwort [hier] (https://stackoverflow.com/questions/46861492/what-is-the-optimum-opencl-2-kernel -to-sum-floats) – kenba

Antwort

1

Ich würde empfehlen, reduce_by_key Algorithmus, extravagant Iteratoren und Boost.Compute Lambda ausdr verwenden. Alle 100 Elemente sind mit demselben Schlüssel gekennzeichnet und reduziert. Ich bin mir nicht sicher, ob Sie keys_output durch eine discard_iterator ersetzen können, um etwas Leistung zu sparen.

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

fantastisch! Vielen Dank. – Parker

+0

Hat jemand die Leistung/den generierten Code getestet? – sehe

+0

Sicherlich ist es nicht so schnell wie handgeschriebener OpenCL-Code. Dies ist ein besonderer Fall. Auf den meisten Grafikprozessoren können Sie alle 100 Elemente aus Vektoren in ein oder zwei Schritten (Kernel) summieren. – haahh

Verwandte Themen