Skip to content

Instantly share code, notes, and snippets.

@VlasovRoman
Last active May 31, 2016 06:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save VlasovRoman/4c78a123acd44b3da8b96b43637df080 to your computer and use it in GitHub Desktop.
Save VlasovRoman/4c78a123acd44b3da8b96b43637df080 to your computer and use it in GitHub Desktop.
module pmap;
import std.algorithm;
import std.parallelism;
import std.range;
template pmap(fun...) {
auto pmap(Range) (Range inputRange) {
alias RangeElementType = ElementType!Range;
auto chunkSize = taskPool.defaultWorkUnitSize(inputRange.length);
auto inputChunks = inputRange.chunks(chunkSize);
alias Result = typeof(MapResult!(fun, Range).front);
auto size = inputRange.length;
Result[] outputRange = new Result[size];
auto outputChunks = outputRange.chunks(chunkSize);
foreach(ioChunk; zip(inputChunks, outputChunks).parallel) {
auto inputChunk = ioChunk[0];
auto outputChunk = ioChunk[1];
int i = 0;
foreach(atom; inputChunk) {
outputChunk[i++] = fun[0](atom);
}
}
return MapResult!(a => a, Result[])(outputRange);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment