Eyes, JAPAN Blog > D言語でParallel foreach

D言語でParallel foreach

mima

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

他の言語と同じように、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)

Comments are closed.