開発
2013/9/13
D言語でParallel foreach
mima
他の言語と同じように、D言語でも普通のforeachのようにParallel foreachを書くことができます。
import std.parallelism : parallel; import std.range : iota; import std.array : array; import std.stdio : writeln; void main() { int[] ary = 10.iota().array(); // [0,10)の配列 foreach(i; ary.parallel()) // parallel foreach { i.writeln(); } }
実行すると、
0 8 9 3 4 5 6 7 1 2
となります。
i.writelnが並列に実行されているのが分かります。
普通のforeachとParallel foreachで、簡単に速度を比べてみます。
import std.parallelism : parallel; import std.range : iota; import std.datetime : benchmark; import std.math : log; import std.stdio : writeln; enum times = 10_000_000; void f() { foreach(i; times.iota()) { cast(void)(log(i + 1)); } } void g() { foreach(i; times.iota().parallel()) { cast(void)(log(i + 1)); } } void main() { auto result = benchmark!(f, g)(1); writeln("nonparallel: ", result[0].length); writeln("parallel: ", result[1].length); }
結果は、自分の環境では
nonparallel: 2020100671 parallel: 370251501
となりました。文字通り、桁違いです。
要素数が多く、個々の処理が比較的重いforeachの場合、できるだけ並列に処理するのが良さそうに見えます。
担当:美馬(まさにThe free lunch is over)