2017-12-01 2 views
1

저는 10M float 벡터를 가지고 있습니다. 나는 100 개 요소의 합계를 알고 싶다. 따라서 총 10000 개의 합계를 알아야한다. 가장 빠른 방법은 무엇입니까?Boost :: vector vector partial sum의 가장 빠른 방법은 무엇입니까

+0

는'OpenCL' 2, 그때는 [여기] huseyin의 대답 (https://stackoverflow.com/questions/46861492/what-is-the-optimum-opencl-2-kernel @ 추천 -to-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에서는 하나 또는 두 단계 (커널)의 벡터에서 100 개 요소를 합계 할 수 있습니다. – haahh

관련 문제