// Create a partition which acts as a proxy to a part of the embedded array. // The proxy is assumed to refer to either the left or the right boundary // element. partition_data(partition_data const& base, std::size_t min_index) : data_(base.data_.data()+min_index, 1, buffer_type::reference), size_(base.size()), min_index_(min_index) { HPX_ASSERT(min_index < base.size()); }
// Create a partition which acts as a proxy to a part of the embedded array. // The proxy is assumed to refer to either the left or the right boundary // element. partition_data(partition_data const& base, std::size_t min_index) : data_(base.data_.data()+min_index, 1, buffer_type::reference, hold_reference(base.data_)), // keep referenced partition alive size_(base.size()), min_index_(min_index) { HPX_ASSERT(min_index < base.size()); }
// The partitioned operator, it invokes the heat operator above on all // elements of a partition. static partition_data heat_part(partition_data const& left, partition_data const& middle, partition_data const& right) { std::size_t size = middle.size(); partition_data next(size); next[0] = heat(left[size-1], middle[0], middle[1]); for (std::size_t i = 1; i != size-1; ++i) next[i] = heat(middle[i-1], middle[i], middle[i+1]); next[size-1] = heat(middle[size-2], middle[size-1], right[0]); return next; }
// The partitioned operator, it invokes the heat operator above on all // elements of a partition. static partition_data heat_part(partition_data const& left, partition_data const& middle, partition_data const& right) { std::size_t size = middle.size(); partition_data next(size); next[0] = heat(left[size-1], middle[0], middle[1]); // Visual Studio requires OMP loop variables to be signed :/ # pragma omp parallel for for (boost::int64_t i = 1; i < boost::int64_t(size-1); ++i) next[i] = heat(middle[i-1], middle[i], middle[i+1]); next[size-1] = heat(middle[size-2], middle[size-1], right[0]); return next; }
// The partitioned operator, it invokes the heat operator above on all // elements of a partition. static partition_data heat_part(partition_data const& left, partition_data const& middle, partition_data const& right) { std::size_t size = middle.size(); partition_data next(size); typedef boost::counting_iterator<std::size_t> iterator; next[0] = heat(left[size-1], middle[0], middle[1]); using namespace hpx::parallel; for_each(par, iterator(1), iterator(size-1), [&next, &middle](std::size_t i) { next[i] = heat(middle[i-1], middle[i], middle[i+1]); }); next[size-1] = heat(middle[size-2], middle[size-1], right[0]); return next; }