33 src.materialize_to_uninitialized(range, dst);
46 dst.slice(range).copy_from(src.slice(range));
67 const int64_t grain_size = 4096)
83 constexpr int64_t chunk_size = 1024;
87 for (const int64_t i : range) {
88 const int64_t start = i * chunk_size;
89 const Span<T> chunk = data.slice_safe(start, chunk_size);
90 const T partial_sum = std::accumulate(chunk.begin(), chunk.end(), T());
91 partial_sums[i] = partial_sum;
94 return std::accumulate(partial_sums.begin(), partial_sums.end(),
T());
100template<
typename T,
typename IndexT>
104 const int64_t grain_size = 4096)
108 for (const int64_t i : range) {
109 dst[indices[i]] = src[i];
118 const int64_t grain_size = 4096)
147 const int64_t grain_size = 4096)
151 src.materialize_compressed_to_uninitialized(indices.slice(range), dst.slice(range));
162 const int64_t grain_size = 4096)
167 for (
const int64_t i : segment.index_range()) {
168 dst[segment_pos +
i] = src[segment[
i]];
176template<
typename T,
typename IndexT>
180 const int64_t grain_size = 4096)
184 for (const int64_t i : range) {
185 dst[i] = src[indices[i]];
193template<
typename T,
typename IndexT>
197 const int64_t grain_size = 4096)
202 for (const int64_t i : range) {
203 dst[i] = src[indices[i]];
240 dst.
slice(dst_offsets[dst_i]).
fill(src[src_i]);
306 if (span[
i - 1] == value && span[
i] != value) {
310 else if (span[
i] == value) {
326 std::iota(span.
begin(), span.
end(), start);
333 for (
const int i :
indices.index_range()) {
334 if (all_values[
indices[
i]] != values[
i]) {
MINLINE uint64_t divide_ceil_ul(uint64_t a, uint64_t b)
BMesh const char void * data
IndexRange index_range() const
static constexpr IndexRange from_end_size(const int64_t end, const int64_t size)
constexpr IndexRange drop_front(int64_t n) const
constexpr int64_t size() const
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
constexpr void fill(const T &value) const
constexpr T * end() const
constexpr T * begin() const
constexpr void copy_from(Span< T > values) const
constexpr Span slice(int64_t start, int64_t size) const
constexpr const T & first() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
IndexRange index_range() const
void materialize_compressed(const IndexMask &mask, MutableSpan< T > r_span) const
void append(const T &value)
void foreach_index_optimized(Fn &&fn) const
void foreach_index(Fn &&fn) const
float length(VecOp< float, D >) RET
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
void gather_to_groups(const OffsetIndices< int > dst_offsets, const IndexMask &src_selection, const Span< T > src, MutableSpan< T > dst)
void copy(const GVArray &src, GMutableSpan dst, int64_t grain_size=4096)
T compute_sum(const Span< T > data)
void copy_group_to_group(OffsetIndices< int > src_offsets, OffsetIndices< int > dst_offsets, const IndexMask &selection, GSpan src, GMutableSpan dst)
Vector< IndexRange > find_all_ranges(const Span< T > span, const T &value)
void gather_group_to_group(const OffsetIndices< int > src_offsets, const OffsetIndices< int > dst_offsets, const IndexMask &selection, const Span< T > src, MutableSpan< T > dst)
bool indexed_data_equal(const Span< T > all_values, const Span< int > indices, const Span< T > values)
BooleanMix booleans_mix_calc(const VArray< bool > &varray, IndexRange range_to_check)
void gather(const GVArray &src, const IndexMask &indices, GMutableSpan dst, int64_t grain_size=4096)
void fill_index_range(MutableSpan< T > span, const T start=0)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
void devirtualize_varray(const VArray< T > &varray, const Func &func, bool enable=true)
closure color scatter(string phase, float Anisotropy, float IOR, float Backscatter, float Alpha, float Diameter)