« 2006年10月 | メイン | 2006年12月 »

2006年11月30日

モヒカンになりました

これからはお洒落モヒカンがブームですよ。

ということで、Yappoさんに早速はてなセリフマッシュアップされてしまいました。(><)

「弊社はモヒカン族も歓迎しております。」 by halt

2006年11月29日

jcode.plの歌代さんはまだまだ現役バリバリでした

先日、チームチドリtessyさんのご紹介により、 株式会社セキュアスカイ・テクノロジー歌代さんを含む約8名のサイボウズ・ラボ見学会を開催しました。

会社紹介プレゼン

せっかくなのでプチ勉強会もやりましょうということで、有志によるハック紹介が行なわれました。 残念ながら公開されている資料は2件のみとなっております。 お察しください。

歌代さんは自宅でContessaを使っていらっしゃるということで、Cruise & Atlasの試乗会も兼ねての参加となりました。 その昔、歌代さん作のjcode.plには大変お世話になりました。ありがとうございました。 歴史を振り返ってみるとjcode.plって1992年の時点でもうあったんですね。 感慨深いものがあります。

2006年11月28日

KENTさんと対談しました

先日、日経ソフトウエア様の対談企画で、 :: KENT WEB - CGIスクリプト :: で有名な KENT さんと対談させていただきました。 このような貴重な機会を与えてくださった編集部の英断に感謝いたします。

KENTさんの最新著書:最速攻略 CGI/Perl 作り方入門「はじめに」より

もし、他人が書いたPerlプログラムのコードを見て、残念なことに その未熟さを批評する人がいたとしたら、実は彼自身のほうが未熟です。 彼はPerlが何たるかを理解していないからです。

この言葉の書かれているページにKENTさんご本人のサインをいただきました。ありがとうございます!

最速攻略 CGI/Perl 作り方入門

Perlの哲学でもあるTMTOWTDI (There's more than one way to do it.) のスローガンは Perlのコミュニティの中でも浸透していて、 There's more Dan the way to do it. といった形式で今もその一端を見ることができます。

昔はレンタルサーバの都合上、CPANモジュールの利用を前提としたPerlプログラミングは大人数に配布するCGIでは最善ではないという事情がありました。 当時はまだJcode.pmやEncode.pmがリリースされていなかった頃で、日本ではjcode.plやjperlが使われることが多かった頃です。 そのような制約上、最小公約数のイディオムでプログラミングを行なうといったスタイルがフリーのCGI作成者の間で流行ったのは必然ともいえます。 フリーで配布しているCGIスクリプトに関して、 時々「最近のプログラミングスタイルで書かれていない」と外部から指摘されることがありますが、 そういう時代背景があったのも一因だったと思っています。
Perlで言えばKENTさんの掲示板CGI、Rubyで言えばたださんのtDiaryなどは 日本のインターネットWebサービス聡明期黎明期において、 スクリプト言語の利用を普及させた功績も大きいです。 その側面からもっと評価されるべきだとも思っています。

しかし、最近のWebサービスの開発現場ではそのような制約がなくなってきています。 Perl以外のプログラミング言語RubyやPython、PHP、Javaの選択肢も増えました。 その中で職業プログラマーがどのようにして最新のプログラミングスタイルを学習していけばよいのか、 何を心がけてプログラミングしていけばよいのか、今どきのCGIの書き方について お互いの立場からそれぞれ意見を交わしました。

対談の内容は写真と一緒に今度の日経ソフトウエア2007年3月号(1月下旬発売)に詳しくまとめられる予定です。

どのように記事がまとまるか私も楽しみです。 乞うご期待ください。


Shibuya Perl Mongers 弐代目総長

2006年11月27日

ESPer2006 秋の陣とぬいぐるみ

IPAの未踏ソフトウェア創造事業(Exploratory Software Project)関係者のイベント ESPer2006 秋の陣に行ってきました。

日時 2006年11月25日(土)
会場 神戸国際会議場 国際会議室

----- 第一部(国際会議室) ----- 

13:00 開場 

13:15 開会の挨拶 

13:20 IPA「未踏ソフトウェア創造事業/事業紹介」
13:40 油井 誠氏「スケーラブルなXQueryプロセッサの開発」
14:05 平林 幹雄氏「未踏で作った検索エンジンと作者の今後」

14:30(休憩)

14:35 ショートプレゼン・デモ紹介 

・朝倉 民枝氏 「幼児向けインタラクティブWebソフト」 
・平野 未来氏「ソーシャルネットワークを利用した新しい広告エンジン」 
・山形 頼之氏「HatenaTail - はてなブックマークのしっぽを捉まえる」 
・大澤 昇平氏「ブックマーク連携型検索エンジン「netPlant」の開発」 
・中本 崇志氏「scim-rubyの紹介」 
・田村 修氏「組込み軽量コンパイラ」 
・西岡 健自氏 / 成島 康之氏「アーテインのゲーム開発の実例紹介」 
・大崎 瑶氏「XAAフレームワーク」 
・柳生 辰夫氏「Cソースを見易いブロックに変換、MATLABとの連携」 

14:55 (休憩) 

15:00 森 悠紀氏「ぬいぐるみ作成のためのインタラクティブな型紙デザイン」
15:25 竹迫 良範氏「Apache わっふるモジュールで SQL injection 対策」
15:50 笠原 健治氏「mixiのこれまでと今後」

16:15 (休憩) 

16:25 藤本 和則氏
「ベイジアンネットワークによる新事業創造を目指す」モデライズ株式会社 

16:50 尾藤 正人氏
「アーリーステージのベンチャーのCTOとしてやってきたこと/感じてきたこと」

17:15 仙石 浩明氏
「作ることと売ること~「未踏」技術者から見た KLab(株)の創業から現在まで~」

17:40 第一部終了の挨拶 

----- 第二部(レセプションホール) ----- 

18:15 第二部開始の挨拶 
18:20 デモ開始 
18:40 PM談議 
19:00 車座企画 
19:30 閉会の挨拶 

場所は噂の神戸空港のすぐ近くということで飛行機で日帰りで行ってきました。

当日の朝にプログラムの詳細を受けとったのですが、 自分の発表の直前にぬいぐるみモデラー作者の森さんが発表されることがわかり、 Namazu つながりということで、 急遽 Open Source Toys Project の紹介スライドを追加しました。

"open source toys project" - Google イメージ検索

アイスブレイク重要ですね。

他の皆さんの発表やデモも大変面白く、あっという間に1日が過ぎてしまいました。
またESPerのイベントがあれば参加させていただきたいと思います。

2006年11月25日

第9回XML開発者の日

前回参加できなかった第九回XML開発者の日に行ってきました。

主催: 画像電子学会VMA研究会
日時: 2006年11月24日(金) 10:00-18:00 
会場: 日本印刷会館(東京都中央区新富1丁目16番8号) 

現実的な REST の実践(仮) / 山本陽平 
Ruby on RailsにみるRESTfulアプリケーションの方向性 / 川村 徹
カレンダーアプリへのGData実装 / Masa and Tak (xfy Community) 
Plagger: the duct tape of the Web / 宮川達彦(Six Apart, Ltd.) 
ODFとOOXMLの標準化戦争 / 村田 真 
microformatsに触れてみよう / 上之郷谷太一 
Syndy Chronicle / 山口琢 
ブログエディタへのMicroformatsの実装  / 後藤康成、室田直匡(feedpath)

今回は4つテーマ「REST」「Plagger」「標準化」「Microformats」の話題を中心に発表者が集まり、学会の主催とは思えないほどの(と言ったら失礼にあたるかもしれませんが)、現実の問題を見据えた面白い発表ばかりでした。

Plagger: the duct tape of the Web (Why Pluggable?)

中でも宮川さんのPlaggerの発表はUSからのインターネット中継ということで、一時回線が途切れるトラブルがありました。一時どうなるかと思いましたが、すぐに復旧してプレゼン続行できました。今度の Shibuya.pm でもUSからのリモートプレゼン実現できそうですね。ちなみに、プレゼン中に以下のスライドが紹介されたのを見て、宮川さんってユーモアがある人だなぁと思いました。

それPla脳

あと、最後のfeedpathのmicroformatsのプレゼンも好評で、ブログエディタのデモの途中で「おぉ」と歓声が上がっていました。本当によく作りこまれていて私もびっくりしました。お疲れ様です。

そして夜の懇親会ではPlaggerケータイのデモをしたり、最新のそれPla話で盛り上がったりしました。

参加者の感想などは はてなブックマーク - タグ「xmldevday」を含む新着エントリー から。

また次回も参加したいと思います。来年のテーマは「Web APIの認証」になりそうでしょうか。

2006年11月23日

インターナショナルGPLv3カンファレンス

11/21(火)から2日間、秋葉原UDXで開催された第5回インターナショナルGPLv3カンファレンスに参加してきました。

akihabara-udx.jpg

第5回インターナショナルGPLv3カンファレンス in Japan

GPLv3 (GNU General Public License Version 3) の策定に関するワールドワイドなイベントで、全世界のフリーソフトウェア活動組織のメンバーが日本に集まる歴史的な会合でした。FSIJの人に聞いてみると、世界規模でFSF関係者が一堂に集まったのでこれが最初でたぶん最後になるかもしれない、とおっしゃっていました。

■ Day 1 : 2006年11月21日(火) インターナショナルデイ

10:00 - 10:45 g新部裕 (FSIJ)  Opening Remarks: "Device for Software Freedom"  
10:45 - 11:30 Georg Greve (FSFE) GPLv3 and Free Software Movement in Europe  
13:00 - 14:30  Richard M. Stallman (FSF) GPLv3 Update: FDL, SFDL and forthcoming draft3 of GPLv3
14:45 - 15:30  Nagarjuna G. (FSF India) GPLv3 and Free Software Movement in India  
15:30 - 16:15  Alexandre Oliva (FSFLA) GPLv3 and Free Software Movement in Latin America  
16:15 - 17:15  パネル  International coordination of Free Software Movement  

■ Day 2 : 2006年11月22日(水) ジャパンデイ

10:00 - 10:45  Ciaran O'Riordan (FSFE)  Linux kernel: DRM and GPLv3  
10:45 - 11:30  Brett Smith (FSF) GPL Compliance  
13:00 - 14:30  パネルディスカッション
  「GPLv3 and Free Software Activities in Japan」
   コーディネータ: 鵜飼文敏 (FSIJ)
   パネラー:
    まつもとゆきひろ (Ruby)
    岡村久道
    鈴木裕信 (FSIJ)  
15:00 - 16:30  パネルディスカッション
  「Free Software and Embedded System」
   コーディネータ: 野首貴嗣 (FSIJ)
   パネラー: 
    竹岡尚三 ((株)アックス)
    佐藤嘉則 (SIOS Technology)
    神田雅透 (NTT) 
16:30 - 16:45  Closing g新部 裕 (FSIJ)  
gplv3-fsij.jpg

仮説その1: GPLv3はツンデレ?

GPLv3カンファレンスに参加する前に私が思っていたのは、GPLv3って実は「ツンデレ」じゃないのか、ということです。GPLv3の最初の草案が出たときは、各界からいろいろとツッコミを受けた「ツン」の状態だったけど、現在では対特許条項の修正も行なわれ「デレ」の状態になったという仮説です。ただ、GPLv3で譲れない部分もあり、それはDRM(デジタルジャイアニズム)とTivoizationの阻止だということが今回のカンファレンスに参加することによって明確に理解できました。これをツンデレと表現して良いかどうかは議論の分かれるところかもしれませんが。やはりライセンスの細かい文言から必死に裏の意図を読み取るよりも、直接ライセンス策定に係っている人から生の意見を聞けて良かったです。誤解も少なく理解も早まりました。

リチャード M. ストールマンについて

初日のリチャード M. ストールマンの講演はかなりアグレッシブで、会場からオープンソースというNGワードを含む質問が出たときに「私はオープンソースに興味はない。多くの場合オープンソースはビジネスモデルや開発モデルのことで、倫理を見ないようにしている。フリーソフトウェアは倫理を重視している。我々は自由なソフトウェア社会の実現を望んでいる。社会運動だ。」と、すかさずモヒカンな回答を返しておられました。ここ十数年の時代の変化によってGPLの解釈に曖昧な部分がでてきたので、GPLv3ではそれを明確化したこと。米国以外の国でも運用できるように国際化の作業を最初からしていること。例えば「distribute」という言葉は意味が広すぎるので「propagate」や「convey」という意味の狭い用語を使うようにしたことなどが挙げられていました。あと、フリーソフトウェアの抱える諸問題をすべてライセンスの変更だけで解決しようとするのは賢くない、という意見も聞けて個人的には目から鱗でした。

仮説その2: GPLはその昔バズワードだった?

二日目のパネルディスカッションで
「過去の日本においてGPLは一種のバズワードだったのではないか?GPLv3は難解で誤解も多いからそれを払拭するためにもGPLv3に代わる新しいバズワードを提唱するべきでは?」
という半分冗談のような質問をしてみました。日本ではGPLを採用したフリーソフトウェアの数が多いという統計がukaiさんから紹介されていたですが、それはなぜ?という話です。単に使用しているライブラリがGPLだったとか、いろいろな理由があったと思うのですが、FSFの理念をきちんと理解してGPLを積極的に採用したソフトウェアって実は少ないんじゃないかという仮説です。過去の自分がそうだったからかもしれませんが、自分で作ったソフトウェアのソースコードを公開するときに、自分自身は開発者だからライセンスの事をあんまり考えたくない、という後ろ向きの理由でGPLを採用したソフトウェアって結構あるんじゃないかと。そのときよく聞くライセンスの中からGPLにしたけど、その後にFSFの理念を理解した、というケースです。日本のGPL専門家と言われる先生でもGPLv3は難解だ、と言わしめるものなので、この状況を打開するにはバズワードによる戦略がまた必要なのではないか、という提案です。本質的な解決にはなっていませんが、企業の中ではGNUやGPLというキーワードに対して良いイメージを持っていない人もいるので。炎上ネタしか扱わないマスコミも逆手に利用して。

IRC Logger

そんな歴史的イベントで私はオフィシャル日本語ロガーとして参加することになりました。講演者の発表を聞きながらイベント専用のIRCのチャンネルでテキストを入力して実況中継する、といった仕事です。XCAST6 や GStreamer による動画・音声のインターネット中継も行なわれていましたが、契約の関係上同時通訳の音声をストリーミングできない、といったこともあり、日本語の情報源としては貴重なものだったと思います。IRCでの中継の様子は以下のような感じでした。

#5th-gplv3-conf-ja-log@freenode.net

初日はukaiさんとknokさんと私の3人で、二日目はukaiさんとknokさんの発表があるので、fukuchiさんとariさんがさらにロガーに加わっていただきました。他の人の翻訳・要約も見ながらテキスト入力していたので、自分の解釈がたまに間違っていることにすぐ気付くことができ大変勉強になりました。貴重な機会をいただきありがとうございました。

最終日の夜は秋葉原の「万世」でスタッフの打ち上げに参加。 恐縮にもg新部さんと一緒のテーブルで 海外のゲストの方にppencodeのデモをしたり、 田中哲さんとPlaggerの話をしたりしました。

この二日間のカンファレンスに行くかどうか迷いましたが、参加して本当によかったです。 関係者の皆さん、ありがとうございました。

2006年11月20日

大阪Plagger入門セミナー終了

大阪でのPlagger入門セミナー、無事に終了しました。

KOF2006でのPlagger入門の様子

今回は意図的に「Perl」というキーワードをタイトルに盛り込まなかったのですが、セミナー会場は満席で、立ち見が出るほどでした。 後から教えてもらって気付いたのですが、現役女子高校生な方もPlagger入門のセミナーを受けにきていたとかいなかったとか。 同じ時間帯の裏では「Haskell」と「PostgreSQL」のセミナーがあった中で、あえて「Plagger」を選んで来ていただき、ありがとうございました。

最後の5分はAzureStoneさんによるライトニングトーク「Tor + Plagger」もあり、楽しんでいただけたのではないかと思います。

このような貴重な機会を与えてくださった、 関西オープンソース(KOF)2006のスタッフの皆さん、Kansai.pm (Kansai Perl Mongers)の皆さん、本当にありがとうございました。

2006年11月15日

関西オープンソース2006でPlaggerのデモがあります

今週末はひさびさの大阪出張ということで、関西オープンソース2006(KOF)に行ってきます。

kansai.pm

宮川さんのPlagger World Tour in 大阪に引き続き、第2弾のPlagger大阪講演です。

ステージ発表:「Plaggerで夢ひろがリング」
日時:11/17(金) 16:35~ (15 min)
会場:6Fステージ(大阪南港ATC)
講師:竹迫良範(Shibuya.pl/サイボウズ・ラボ株式会社) 
主催:KOF 

LL Ring での感動がふたたび。宮川達彦氏らが開発する
オープンソースの RSS/Atom アグリゲータ Plagger の
夢広がるプラグインを紹介します。

金曜日は LL Ring に参加できなかった方のためのショートプレゼンを行ないます。

ユーザ企画:「Plagger入門」
日時:11/18(土) 13:00~ (50 min)
会場:5F-N4(大阪南港ATC)
講師:竹迫良範(Shibuya.pl/サイボウズ・ラボ株式会社) 
主催:Kansai.pm 

オープンソースのRSS/AtomアグリゲータであるPlaggerの入門講座です。
設定ファイル(config.yaml)の書き方とその応用例について解説します。

11/17(金)でのステージ発表の内容も含めて、11/18(土)はもう少し詳しく Plagger の使い方、プラグインの作成方法についても解説したいと思います。 金曜日参加できない方は土曜日だけ聞いておけばOKです。 あと、同じユーザ企画の枠の中でAzureStoneさんによるライトニングトーク「Tor + Plagger」も予定しています。

こちらのユーザ企画の主催はKansai.pm (Kansai Perl Mongers) で、11/18(土)はブース出展もしています。 ブースでは Plagger のデモも常時やっているみたいですので、関西地方にお住まいの方は、ぜひ足を運んでみて下さい。

今年の会場は大阪南港ATC。去年までのKOFとは会場が違うみたいなので注意しないといけないですね。

2006年11月09日

Binary Hacks と 64bit popCount 問題

各所レポートが挙がっている通り、私の手元にも Binary Hacks の献本が届きました!

表紙
Binary Hacks サポートページ
書名 Binary Hacks
サブタイトルハッカー秘伝のテクニック100選
著者 高林哲, 鵜飼文敏, 佐藤祐介, 浜地慎一郎, 首藤一幸
出版社オライリー・ジャパン
定価3,360円 (税込)
ページ数412ページ
ISBN4-87311-288-5
発売日2006年11月11日
版型A5

高林さん、オライリーさん、ありがとうございます。

ちなみにetoさん情報によると、明日11/10は「いいバイナリの日」らしいです。

  • 11 → いい
  • 10 → バイナリ

Binary Hacks の発売日は 11/11 で、ビットが全部立っている非常に縁起の良い日です。

縁起を担ぐためにも、いいバイナリの日に Binary Hacks を注文して、発売日に書店に行って本を見かけたら 11 冊買いましょう。

x86 パフォーマンスチューニング

さて、最後の HACK #100「文献案内」でマイクロプロセッサアーキテクチャマニュアルが紹介されていましたが、 x86のパフォーマンスチューニングつながりということで、 ちょうど今日ラボの社内掲示板で盛り上がった話題をこちらでも共有したいと思います。

* popCount 問題

64bitの数値の中で1になっているビット数を数える

popCount64bitA

unsigned long long popCount64bitA(unsigned long long x) 
{ 
    int n = 0; 
    n += popTable[x & 0xff]; 
    n += popTable[(x >> 8) & 0xff]; 
    n += popTable[(x >> 16) & 0xff]; 
    n += popTable[(x >> 24) & 0xff]; 
    n += popTable[(x >> 32) & 0xff]; 
    n += popTable[(x >> 40) & 0xff]; 
    n += popTable[(x >> 48) & 0xff]; 
    n += popTable[(x >> 56) & 0xff]; 
    return n; 
} 

popCount64bitB

unsigned long long popCount64bitB(unsigned long long x) 
{ 
    x = ((x & 0xaaaaaaaaaaaaaaaaUL) >> 1) 
      +  (x & 0x5555555555555555UL); 
    x = ((x & 0xccccccccccccccccUL) >> 2) 
      +  (x & 0x3333333333333333UL); 
    x = ((x & 0xf0f0f0f0f0f0f0f0UL) >> 4) 
      +  (x & 0x0f0f0f0f0f0f0f0fUL); 
    x = ((x & 0xff00ff00ff00ff00UL) >> 8) 
      +  (x & 0x00ff00ff00ff00ffUL); 
    x = ((x & 0xffff0000ffff0000UL) >> 16) 
      +  (x & 0x0000ffff0000ffffUL); 
    x = ((x & 0xffffffff00000000UL) >> 32) 
      +  (x & 0x00000000ffffffffUL); 
    return x; 
} 

→ どちらが速いか?

このpopCount問題は、去年岡野原さんに教えてもらいました。

テーブル参照で分岐命令をなくす

ちなみに最近のプロセッサは分岐予測・投機実行が失敗したときのコストが非常に高いので、 popTable[] は 8bit のテーブルで予め計算しておきます。

unsigned char popTable[256]; 

int popCount8bit(int x) 
{ 
    int n = 0; 
    if (x & 0x01) n++; 
    if (x & 0x02) n++; 
    if (x & 0x04) n++; 
    if (x & 0x08) n++; 
    if (x & 0x10) n++; 
    if (x & 0x20) n++; 
    if (x & 0x40) n++; 
    if (x & 0x80) n++; 
    return n; 
} 

void init_popTable() 
{ 
    int i; 
    for (i = 0; i < 256; i++) { 
        popTable[i] = popCount8bit(i); 
    } 
}

ベンチマーク結果

実行結果(AMD Opteron 240EE / CentOS 4.4 x86_64 / gcc 3.4.6)

% gcc -O0 pop.c && ./a.out
loop=1000000

popCount32bitA(fffffffe)=31: 0.027621[sec] 
popCount32bitB(fffffffe)=31: 0.025511[sec] 
popCount64bitA(f0f0f0f0f0f0f0e1)=32: 0.049293[sec] 
popCount64bitB(f0f0f0f0f0f0f0e1)=32: 0.038641[sec] 

手元のx86_64環境では、テーブル参照を行なわない popCount64bitB の方が速い、という結果になりました。面白いですね。

Efficient Implementation of Population Count Function

以上の話をラボの社内掲示板に振ってみたところ、早速奥さんから Athlon Code Optimization Guidelines (pp.136-139) に、もっと速いMMXのアセンブリコードが載っているよ、ということを教えてもらいました。

なるほど、勉強になります。pp.136-139から該当コードを抜粋します。

Example 1 (Integer Version):

unsigned int popcount(unsigned int v) 
{ 
  unsigned int retVal; 
  __asm { 
  MOV EAX, [v]         ;v 
  MOV EDX, EAX         ;v 
  SHR EAX, 1           ;v >> 1 
  AND EAX, 055555555h  ;(v >> 1) & 0x55555555 
  SUB EDX, EAX         ;w = v - ((v >> 1) & 0x55555555) 
  MOV EAX, EDX         ;w 
  SHR EDX, 2           ;w >> 2 
  AND EAX, 033333333h  ;w & 0x33333333 
  AND EDX, 033333333h  ;(w >> 2) & 0x33333333 
  ADD EAX, EDX         ;x = (w & 0x33333333) + ((w >> 2) & 0x33333333) 
  MOV EDX, EAX         ;x 
  SHR EAX, 4           ;x >> 4 
  ADD EAX, EDX         ;x + (x >> 4) 
  AND EAX, 00F0F0F0Fh  ;y = (x + (x >> 4) & 0x0F0F0F0F) 
  IMUL EAX, 001010101h ;y * 0x01010101 
  SHR EAX, 24          ;population count = (y * 0x01010101) >> 24 
  MOV retVal, EAX      ;store result 
  } 
  return (retVal); 
} 

これはMMX命令を使わない32bitバージョン。

Efficient 64-Bit Population Count Using MMX™ Instructions

The following code sample is an MMX version of popcount() that works on 64 bits at a time. This MMX code can do popcounts about twice as fast as the integer version (for an identical number of bits). Notice that the source was loaded using two instructions instead of a simple MOVQ to avoid a bad STLF case (size mismatch from two DWORDs feeding into a QWORD).

Example 1 (MMX version):

#include "amd3d.h" 

__declspec (naked) unsigned int __stdcall popcount64_1 
(unsigned __int64 v) 
{ 
static const __int64 C55 = 0x5555555555555555; 
static const __int64 C33 = 0x3333333333333333; 
static const __int64 C0F = 0x0F0F0F0F0F0F0F0F; 

__asm { 
  MOVD MM0, [ESP+4]      ;v_low 
  PUNPCKLDQ MM0, [ESP+8] ;v 
  MOVQ MM1, MM0          ;v 
  PSRLD MM0, 1           ;v >> 1 
  PAND MM0, [C55]        ;(v >> 1) & 0x55555555 
  PSUBD MM1, MM0         ;w = v - ((v >> 1) & 0x55555555) 
  MOVQ MM0, MM1          ;w 
  PSRLD MM1, 2           ;w >> 2 
  PAND MM0, [C33]        ;w & 0x33333333 
  PAND MM1, [C33]        ;(w >> 2) & 0x33333333 
  PADDD MM0, MM1         ;x = (w & 0x33333333) + ((w >> 2) & 0x33333333) 
  MOVQ MM1, MM0          ;x 
  PSRLD MM0, 4           ;x >> 4 
  PADDD MM0, MM1         ;x + (x >> 4) 
  PAND MM0, [C0F]        ;y = (x + (x >> 4) & 0x0F0F0F0F) 
  PXOR MM1, MM1          ;0 
  PSADBW (MM0, MM1)      ;sum across all 8 bytes 
  MOVD EAX, MM0          ;result in EAX per calling convention 
  EMMS                   ;clear MMX state 
  RET 8                  ;pop 8-byte argument off stack and return 
  } 
} 

このように64bitのpopCountでMMX命令を使えば、32bitの処理を2回実行するよりも速く実行できるというお話。


* それSSEでやればいいんじゃね?

SSE(SIMD拡張命令)の「PSADBW」を使うというアイディア

688 :・∀・)っ-○◎● ◆DanGorION6 :2006/10/07(土) 15:13:39 
てけとーにでっち上げてみた  
DWORD PopCountDW_SSSE3(DWORD src) { 
DWORD dest; 
static const __m128i table = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 }; 
__asm { 
movd xmm1, dword ptr [src] 
movdqa xmm0, xmm1 
psrlq xmm1, 4 
punpckldq xmm0, xmm1 
pshufb xmm0, xmmword ptr [table] 
pxor xmm1, xmm1 
psadbw xmm0, xmm1 
movd dword ptr [dest], xmm0 
} 
return dest; 
} 

このコードはちゃんと動くかどうかまだ試していません。


* それSSE4で1命令でできるよ

次の Intel CPU で拡張される SSE4 でズバリそのものの「POPCNT」命令が追加されるという話を思い出しました。

後藤弘茂のWeekly海外ニュース: SSE4命令とアクセラレータから見えるIntel CPUの方向性
http://pc.watch.impress.co.jp/docs/2006/1004/kaigai307.htm より
また、IntelはSSE4に加えて、CPUに統合するアクセラレータコア向けの命令についても言及している。 これまでの汎用(General Purpose)CPUは、できる限り汎用的に使える命令を中心にしてきた(実際にはそうでもない命令もある)。だが、アクセラレータ命令は、それとは趣が異なる。非常にアプリケーションに特化した特殊な命令になるという。 その中で、Intelが最初に実装しようとしているのは「Cyclic Redundancy Check (CRC:巡回冗長検査)」のアクセラレーション。CRCアクセラレータのために、CRCバリューのチェックを行なう命令「CRC32」を実装するという。CRCは、データの完全性、つまり、データが破損しているかどうかをチェックする仕組み。対象とするデータから生成されるCRCバリューを比較することで、チェックを行なう。 CRCは通信やストレージでよく使われており、Intelもネットワークストレージをターゲットとすると説明している。Intelによると、「iSCSI(Internet Small Computer System Interface)」や「RDMA(Remote Direct Memory Access)」といったストレージのデータトランスファプロトコルのアクセラレートが主目的だという。現在は、こうしたプロトコル処理をCPUオフロードする専用チップも使われているが、Intelの構想はそれをCPUベースで取り込むことにある。CPUの汎用コアをオフロードするか、外付けのアクセラレータカードの必要性をなくすことで、システム全体の消費電力を下げることになる。 さらにIntelは、2つ目のアクセラレータ命令としてラージデータセットのサーチ向け命令「POPCNT」を挙げている。Population Count命令で、オペランド中のビットセットの数を数える。Intelは応用例としてゲノムマイニング、手書き認識、ハミングアルゴリズムなどを挙げている。

この「POPCNT」命令が普通のPCで使えるようになれば、全文検索エンジンのスコア計算(疎なビットベクトルから1の数を数える処理)とかをPCクラスタを使って高速に処理することができるようになるかも。機械学習の分野でも役立ちそう。

私はi386の頃のハンドアセンブルしかやったことがないのですが、どんどんx86のアーキテクチャは進化しているのですね。 まだまだバイナリアンの仕事はなくならない、ということみたい。自分ももっと勉強しなきゃ。

ということで、Binary Hacks には直接的なパフォーマンスチューニングのテクニックは書かれていませんが、以下の参考文献とあわせて読むと参考になるかもしれません。 これからバイナリアンを目指す方にもお勧めです。

参考文献

2006年11月02日

Shibuya.pmリーダ交代式@バソキヤオフ

先日サイボウズ・ラボのオフィスを開放して、バソキヤオフを開催しました。

■バソキヤオフ

現在ではほぼ入手不可能と言われている幻のバソキヤ2006を集めて、
みんなで楽しく食そうという企画です。

バソキヤ

ロングテールの力を結集してみんなで持ち寄った未開封品バソキヤは全部で22個。壮絶です。

この日のためにわざわざ取り寄せたわさびラムネは40本、
大王わさび農場工場直送のわさびアイスもなか、わさび煎餅、
ねりわさび、タバスコ、梅干、ポテトチップス、などなど、みんなが
それぞれバソキヤのオカズになりそうなもの持ち寄って来ました。

詳しくは、サイレントマジョリティを考慮すればアルファブロガーさんが
バソキヤオフのレポートをまとめてくださっています。

- カイ氏伝: バソキヤオフまとめ
- カイ氏伝: バソキヤオフ動画レポート

ジョジョネタ、ツンデレ、YouTube、サイレントマジョリティの複合技をちりばめた
高度なエントリーに仕上がっています。グッジョブです!


■ Shibuya.pmリーダ交代式

バソキヤオフの後半では、11月からUSのサンフランシスコオフィス勤務となるmiyagawaさんの壮行会も敢行し、前人未踏のわさびマヨネーズ×4倍のバソキヤ世界記録にチャレンジ(動画)しました。日本を離れて辛いことがあっても、この動画を見ればきっと大丈夫です。これからも世界の最先端をリードするmiyagawaさんであり続けてください。さらなるご活躍を期待しております。

Shibuya.pm のリーダーから、新リーダーへ、バソキヤの杯が贈呈されました。

miyagawa to takesakomiyagawa to takesako
(写真:nipotanさん、otsuneさん)

手に持っているのはバソキヤ×4倍の杯です。このバソキヤを食えたPerl使いは成長するという伝説があるそうで、私も必死の覚悟で食べました。げふっ!げふっ!

この儀式をShibuya.pmの伝統として受け継いでいこうと思います。

ちなみに、前回のShibuya.pm#7で発表もあった通り、これでShibuya.pmのリーダをmiyagawaさんから正式に引き継ぐことになりました。miyagawaさんのいないShibuya.pmなんて面白くない…とDISられないよう継続的に活動を続けていこうと思います。Skypeでのリモート中継やりたいですね。

今後ともよろしくお願いします。