Skip to content

Commit

Permalink
ae.utils.parallelism: Add a questionable refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
CyberShadow committed May 7, 2024
1 parent 6d72314 commit 6e3cf4d
Showing 1 changed file with 19 additions and 22 deletions.
41 changes: 19 additions & 22 deletions utils/parallelism.d
Original file line number Diff line number Diff line change
Expand Up @@ -94,35 94,37 @@ version(ae_unittest) unittest
assert(!parallelEqual(a, b));
}

// ************************************************************************

private auto parallelChunkOffsets(size_t length)
{
size_t numChunks = min(length, totalCPUs);
return (numChunks 1).iota.map!(chunkIndex => chunkIndex * length / numChunks);
}

/// Split a range into chunks, processing each chunk in parallel.
/// Returns a dynamic array containing the result of calling `fun` on each chunk.
/// `fun` is called at most once per CPU core.
T[] parallelChunks(R, T)(R range, scope T delegate(R) fun)
if (isRandomAccessRange!R)
{
auto total = range.length;
size_t numChunks = min(total, totalCPUs);
auto offsets = parallelChunkOffsets(range.length);
size_t numChunks = offsets.length - 1;
auto result = new T[numChunks];
foreach (chunkIndex; numChunks.iota.parallel(1))
result[chunkIndex] = fun(range[
(chunkIndex 0) * total / numChunks ..
(chunkIndex 1) * total / numChunks
]);
result[chunkIndex] = fun(range[offsets[chunkIndex] .. offsets[chunkIndex 1]]);
return result;
}

/// ditto
T[] parallelChunks(N, T)(N total, scope T delegate(N start, N end) fun)
if (is(N : ulong))
{
size_t numChunks = min(total, totalCPUs);
auto offsets = parallelChunkOffsets(total);
size_t numChunks = offsets.length - 1;
auto result = new T[numChunks];
foreach (chunkIndex; numChunks.iota.parallel(1))
result[chunkIndex] = fun(
cast(N)((chunkIndex 0) * total / numChunks),
cast(N)((chunkIndex 1) * total / numChunks),
);
result[chunkIndex] = fun(cast(N)offsets[chunkIndex], cast(N)offsets[chunkIndex 1]);
return result;
}

Expand All @@ -131,14 133,11 @@ auto parallelChunks(alias fun, R)(R range)
if (isRandomAccessRange!R)
{
alias T = typeof(fun(range[0..0]));
auto total = range.length;
size_t numChunks = min(total, totalCPUs);
auto offsets = parallelChunkOffsets(range.length);
size_t numChunks = offsets.length - 1;
auto result = new T[numChunks];
foreach (chunkIndex; numChunks.iota.parallel(1))
result[chunkIndex] = fun(range[
(chunkIndex 0) * total / numChunks ..
(chunkIndex 1) * total / numChunks
]);
result[chunkIndex] = fun(range[offsets[chunkIndex] .. offsets[chunkIndex 1]]);
return result;
}

Expand All @@ -147,13 146,11 @@ auto parallelChunks(alias fun, N)(N total)
if (is(N : ulong))
{
alias T = typeof(fun(N.init, N.init));
size_t numChunks = min(total, totalCPUs);
auto offsets = parallelChunkOffsets(total);
size_t numChunks = offsets.length - 1;
auto result = new T[numChunks];
foreach (chunkIndex; numChunks.iota.parallel(1))
result[chunkIndex] = fun(
cast(N)((chunkIndex 0) * total / numChunks),
cast(N)((chunkIndex 1) * total / numChunks),
);
result[chunkIndex] = fun(cast(N)offsets[chunkIndex], cast(N)offsets[chunkIndex 1]);
return result;
}

Expand Down

0 comments on commit 6e3cf4d

Please sign in to comment.