/* * Copyright 2008-2012 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include namespace thrust { namespace system { namespace omp { namespace detail { template OutputType reduce(execution_policy &exec, InputIterator first, InputIterator last, OutputType init, BinaryFunction binary_op) { typedef typename thrust::iterator_difference::type difference_type; const difference_type n = thrust::distance(first,last); // determine first and second level decomposition thrust::system::detail::internal::uniform_decomposition decomp1 = thrust::system::omp::detail::default_decomposition(n); thrust::system::detail::internal::uniform_decomposition decomp2(decomp1.size() + 1, 1, 1); // allocate storage for the initializer and partial sums // XXX use select_system for Tag thrust::detail::temporary_array partial_sums(exec, decomp1.size() + 1); // set first element of temp array to init partial_sums[0] = init; // accumulate partial sums (first level reduction) thrust::system::omp::detail::reduce_intervals(exec, first, partial_sums.begin() + 1, binary_op, decomp1); // reduce partial sums (second level reduction) thrust::system::omp::detail::reduce_intervals(exec, partial_sums.begin(), partial_sums.begin(), binary_op, decomp2); return partial_sums[0]; } // end reduce() } // end detail } // end omp } // end system } // end thrust