開発
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)
2024/09/13
2024/05/17
2024/05/10
2024/01/05
2023/08/18
2023/07/14
2023/05/12