2009年03月27日

CPUの気持ちになってプログラムを書くということ Kansai.pm#11 参加記その1 - プログラマになりたい

 ちなみに、下記のコードはデータハザードを解消する為のコーディング例です。データハザードは、命令が利用するデータ間に依存関係がある場合に発生します。前の命令が終わらないと後ろの命令が実行できないとか。ですので、それを解きほぐしてやれば、並列で処理が出来るようになります。
という感じでnaoyaさんもぶこめで
loop unrolling は perl でもちゃんと効果がある
って書いてるけど、それforブロック(スコープ)が一段増えてる事で差が出てるんじゃないかと思うわけです。はい。

以下検証コード

use strict;
use warnings;
use Benchmark qw(:all);

cmpthese(5000000, {
    'pseudo loop unrolling' => sub {
        my $sum = 10;
        my $i   = 1;
        $sum = $sum + ($i + 0);
        $sum = $sum + ($i + 1);
        $sum = $sum + ($i + 2);
    },
    'scope 1' => sub {
        {
            my $sum = 10;
            my $i   = 1;
            $sum = $sum + ($i + 0);
            $sum = $sum + ($i + 1);
            $sum = $sum + ($i + 2);
        };
    },
});
そして結果
$ perl ./loop.pl 
                           Rate               scope 1 pseudo loop unrolling
scope 1               1524390/s                    --                  -25%
pseudo loop unrolling 2040816/s                   34%                    --
なぜかブロックを1つ増やしただけなのに、こんなに差がでちゃいましたね!不思議!

まとめ

ブロックがあるという事は、スコープがあると同義なのは当たり前ですが、スコープが変わるという事はレキシカル変数の処理などをやらなきゃいけないわけで、{}があるだけでもPerlは処理をいっぱいするわけです。
別にブロック増やすなというわけではないですが、ベンチマークを取る時にはこういう所にも気をつけたい所ですね。

追記

!hyoshiokさんが、そもそもloop unrollingがperlで意味あるか?というのを気にしていたようなので、効果あるよって言うベンチマークしたす。

forしたコードと、for文だと3回scopeの出入りがあるので、それにあわせるコードも追記して、さらにmy $jのコストも加算するようにした。

use strict;
use warnings;
use Benchmark qw(:all);

cmpthese(5000000, {
    'pseudo loop unrolling' => sub {
        my $sum = 10;
        my $i   = 1;
        $sum = $sum + ($i + 0);
        $sum = $sum + ($i + 1);
        $sum = $sum + ($i + 2);
    },
    'scope 1' => sub {
        {
            my $sum = 10;
            my $i   = 1;
            $sum = $sum + ($i + 0);
            $sum = $sum + ($i + 1);
            $sum = $sum + ($i + 2);
        }
    },
    'scope 3' => sub {
        {
            my $sum = 10;
            my $i   = 1;
            {
                $sum = $sum + ($i + 0);
            }
            {
                $sum = $sum + ($i + 1);
            }
            {
                $sum = $sum + ($i + 2);
            }
        }
    },
    'scope 3 and my $j' => sub {
        {
            my $sum = 10;
            my $i   = 1;
            {
                my $j = 0;
                $sum = $sum + ($i + $j);
            }
            {
                my $j = 1;
                $sum = $sum + ($i + $j);
            }
            {
                my $j = 2;
                $sum = $sum + ($i + $j);
            }
        }
    },
    'loop' => sub {
        my $sum = 10;
        my $i   = 1;
        for my $j (0..2) {
            $sum = $sum + ($i + $j);
        }
    },
});
結果
$ perl ./loop.pl 
                           Rate loop scope 3 and my $j scope 3 scope 1 pseudo loop unrolling
loop                   683995/s   --              -11%    -17%    -48%                  -63%
scope 3 and my $j      772798/s  13%                --     -6%    -42%                  -58%
scope 3                823723/s  20%                7%      --    -38%                  -55%
scope 1               1322751/s  93%               71%     61%      --                  -28%
pseudo loop unrolling 1824818/s 167%              136%    122%     38%                    --
dh004:t ko$ perl ~/bin/htmlescape.pl loop.pl 
やる意義については置いておいて、意味はあるとは思うですよ。

Posted by Yappo at 2009年03月27日 13:49 | TrackBack | Perl
Comments

rs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Moneyrs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Moneyrs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Moneyrs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Moneyrs gold | RS money | buy rs money | buy rs gold | cheap rs gold | cheap rs money | Runescape gold | Runescape money | Runescape power leveling | Runescape powerleveling | rs power leveling | rs powerleveling | rs accounts | rs account | runescape accounts | runescape account | rs powerleveling | Runescape powerleveling | rs power leveling | Runescape power leveling | Runescape gold|Runescape Money | Runescape gold|Runescape Money | rs gold|rs Money

Posted by: Runescpae power leveling at 2009年06月23日 15:44
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。