Archive for 2012年1月

Parallel C# + Native C の画像処理デモ

2012年1月30日

Parallel C# + Native C で、かなりの高速化ができることが分かったので、視覚的にわかるように、1分34秒のデモ動画を作りました。

画像サイズは 580×580 です。

デモ画面の左側がオリジナル画像、右側が画像処理後の画像です。

Parallel C# + Native C
  1. C# Serial 実行 1.5 FPS
  2. Parallel C# 実行で、2.5 FPS
  3. Parallel C# + Native 実行で、60 FPS Over

Parallel C# では、4 Core なので 6FPS ぐらい出てもいいはずですが、意外と速度が出ませんでした。どこがボトルネックになっているのか、プロファイラーで調査してみたいと思います。

なお、表示するために、やむを得ず DoEvent など入れているので、画像処理自体はもっと高速に処理できると思います。また、画像処理自体も、もう少し簡単なロジックで組めば、もっと高速化できると思います。しかし、これは、とある目的のための通過点でしかないので、とりあえず今の段階でアップしておきます。

広告

XBox 360 Ace Combat Assult Horizon

2012年1月24日

Ace Combat Assult Horizon

 

ひさびさに遊んでみたが、HD画質でプレイすると、爆発などの効果を思いっきり高めてあるので映像やばい。あと、ヘリの映像もブラックフォークダウンの映画そのものって感じで、すごい。

この圧倒的な3DCGの表現力とデータの作りこみ、半端じゃないね~。

あっ、そうそう、コントローラがデフォルトで初心者設定なっているので、それを従来のAce Combatと同じモードにしないと、バレルロールとか思ったように飛べないので注意。

Sony Walkman X-アプリ 改善要望

2012年1月24日

Sony Walkman AシリーズのNW-A857  とX-アプリで、同期しようとすると、次のダイアログが何回も表示されてますが、次の点を改善してもらいたい。

X-アプリ で変更した楽曲の情報を、機器内の楽曲に上書きしてもよろしいですか?

ご注意;

機器によっては、機器側で楽曲に設定したブックマークが解除されるなどの場合があります。

image

  1. 何回も表示され、非常にうっとうしい。”すべてはい”。”すべていいえ”を表示するなど、対応すべき。
  2. どの楽曲情報を上書きしようとしているのかわからないので、判断しようがない。
  3. いいえを押すと、1つだけ中止され、継続されるのか、すべて中止されるのかわからない。
  4. ”機器によっては、機器側で楽曲に設定したブックマークが解除されるなどの場合があります。”というメッセージは、あいまいで、不安をあおるだけで、何の解決にもならない。正確にメッセージを出すか、出さないか、はっきりさせるべき。

Sony Walkman X-シリーズを使ってますが、iPhone に戻れないぐらい音質はいけているので、X-アプリ頑張ってほしい。>> Sony

以下、システム情報

■ パソコン環境
 ウィンドウズ : Microsoft Windows 7 Ultimate
 サービスパック : 1
 システムの種類 : 64 ビット
 プロセッサー : Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz
 周波数 : 2.80 GHz
 メモリー : 4.00 GB

■ パソコンメーカー
 メーカー : System manufacturer
 機種名 : System Product Name

■ アプリケーション情報
 x-アプリ : 3.0.02.11230
 Sony Media Library Earth : 7.1.00.11181

■ その他
 ハードディスクドライブ 空き容量
  C:ドライブ : 15.9 GB (合計 : 119.1 GB)
  D:ドライブ : 818.6 GB (合計 : 976.6 GB)
  E:ドライブ : 417.1 GB (合計 : 886.5 GB)

 CD/DVD ドライブ
  F:ドライブ : HL-DT-ST DVDRAM GSA-4167B SCSI CdRom Device

 言語設定
  システム言語 : 日本語 (日本)
  ユーザー設定言語 : 日本語 (日本)

 インターネット環境
  Internet Explorer : 9
  ネットワーク接続 : 可能

以下、バージョン情報

x-アプリ : 3.0.02.11230
Sony Media Library Earth : 7.1.00.11181
MagicGate Memory Stick Device : 7.1.00.11181
Mass Storage Class : 7.1.00.11181
M.S. PRO : 7.1.00.11181
EMPR : 7.1.00.11181
ATRAC Audio Device with Intelligent function : 7.1.00.11181
Hi-MD : 7.1.00.11181
ATRAC Audio Device : 7.1.00.11181
Net MD : 7.1.00.11181
EMD Plug-in : 8.0.02.11230
Px Engine : 4.18.19.0

Sony Walkman X-アプリ バグレポート

2012年1月24日

Sony Walkman AシリーズのNW-A857 をX-アプリで同期しようと接続しても、プレイリストを更新してくれない。仕方ないので、AUTO→ ボタンを押すと、同期が始まる。大量の楽曲を追加したわけではないのに、コピーが始まり、元のデータが 10GB だと、さらに同じぐらいの楽曲のコピーが始まってしまう。

コピー中の画面はこんな感じで、もともとは青のバー程度の楽曲を入れてあった状態で、転送を開始すると、ほとんど追加していないにもかかわらず、オレンジの量をコピーしようとする。このため、すごく転送に時間がかかる。

image

原因としては、iTunes とデータを共有しているので、iTunes を起動してしまうと、何らかの情報が更新され、別の曲と判断されてしまうのかもしれない。だとしても、家族で iPod派、Walkman 派で分かれていて、ネットでシェアしているので、少なくともそのような使い方をしても、同期するたびに倍になってしまうようなことのないようにしてほしい。

Sony Walkman A-シリーズを使ってますが、iPhone に戻れないぐらい音質はいけているので、X-アプリ頑張ってほしい。>> Sony

以下、システム情報

■ パソコン環境
 ウィンドウズ : Microsoft Windows 7 Ultimate
 サービスパック : 1
 システムの種類 : 64 ビット
 プロセッサー : Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz
 周波数 : 2.80 GHz
 メモリー : 4.00 GB

■ パソコンメーカー
 メーカー : System manufacturer
 機種名 : System Product Name

■ アプリケーション情報
 x-アプリ : 3.0.02.11230
 Sony Media Library Earth : 7.1.00.11181

■ その他
 ハードディスクドライブ 空き容量
  C:ドライブ : 15.9 GB (合計 : 119.1 GB)
  D:ドライブ : 818.6 GB (合計 : 976.6 GB)
  E:ドライブ : 417.1 GB (合計 : 886.5 GB)

 CD/DVD ドライブ
  F:ドライブ : HL-DT-ST DVDRAM GSA-4167B SCSI CdRom Device

 言語設定
  システム言語 : 日本語 (日本)
  ユーザー設定言語 : 日本語 (日本)

 インターネット環境
  Internet Explorer : 9
  ネットワーク接続 : 可能

以下、バージョン情報

x-アプリ : 3.0.02.11230
Sony Media Library Earth : 7.1.00.11181
MagicGate Memory Stick Device : 7.1.00.11181
Mass Storage Class : 7.1.00.11181
M.S. PRO : 7.1.00.11181
EMPR : 7.1.00.11181
ATRAC Audio Device with Intelligent function : 7.1.00.11181
Hi-MD : 7.1.00.11181
ATRAC Audio Device : 7.1.00.11181
Net MD : 7.1.00.11181
EMD Plug-in : 8.0.02.11230
Px Engine : 4.18.19.0

Windows アプリケーションのハング状態の防止

2012年1月22日

http://msdn.microsoft.com/ja-jp/library/dd744765(v=vs.85).aspx

同期・非同期処理、スレッドの扱いなどでいいことや、やってはいけないことなどがいろいろ書かれている。

他のリソースへのリンク

C# Parallel.For + Native C での画像処理で、C#の約50倍の高速化

2012年1月21日

この投稿を2012年1月20日になくなられた マイクロソフトの偉大なエバンジェリスト 川西 裕幸さんに 捧げる。

約30年前に、東北大学の大型計算機センターに NEC ACOS 1000 という当時最高速の大型計算機が導入され、修論でだいぶお世話になりました。一つのビルがこの1つのコンピュータにささげられており、さながらバベルの塔のコンピューターのような畏敬の念をいだきながら、使ったものでした。
http://museum.ipsj.or.jp/computer/main/0053.html

時は流れ、今使っているPCは、メモリも、クロックも、ストレージも、通信も、おまけにSIMD プロセッサーに、MIMD マルチコアプロセッサ、高解像度ディスプレイまであり、当時の世界最高速の大型計算機の性能を軽く数ケタ凌駕している。恐ろしい性能を目の前に、ようやくi7 860 4コアのCPUを全力で 0.1秒だけ振り切らせることができた。それでも、SSEは全く使い余している。

30年後のテクノロジーに思いをはせながら、明日を夢見る。


image_thumb_thumb_thumb_thumb

前回、C# + Native で画像のラプラシアンフィルター実行してみたが、次に C# Parallel + Native C での実行と比較してみた。

ちょっと大きめの画像での実行結果は次の表のとおり。

番号 説明 C# (秒) C++/(秒) C# + Native C(秒) C# Parallel.For + Native C(秒)
  処理ロジック=> 素直にフィルターを実装 素直にフィルターを実装 素直にフィルターを実装 フィルターの3重for ループを展開
整数演算に変更
1 Debug 8.1 4.3 2.9 0.2
2 Release 4.8(コードの最適化 Off) 3.7: 最適化無効 (/0d) 2.1: 最適化無効 (/0d)
3 Release 4.5 (コードの最適化 On) 2.7 : 最大限の最適化 (/Ox) 0.5: 最大限の最適化 (/Ox) + SSE2 0.1秒
最大限の最適化 (/Ox) + SSE2

並列化による高速化は、アムダールの法則に従い、問題に内在する並列度に依存する。このような並列度の高い画像処理などでは並列化による高速化に向いており、C# で素直に実装(デフォルトのコンパイラスイッチ)したときが4.8秒に比べて、C# Parallel.For + Native Cで約50倍の高速化ができた。

実際のNative C のアセンブラ出力を確認してみると、次のようにSSE命令までは展開されていなかった。これは、フィルターの3重forループを展開し、さらに整数加減算+シフト演算へ変換しているため、SSE命令を使うより、単純なアセンブラの実行のほうが十分高速であるからと思われる。実際、手書きで SSE Intrinsics で積和演算を書いて実行してみたが、コンパイラーの最適化よりも、若干遅い結果となってしまった。もう少し複雑な演算や、浮動小数点の積和が必要な処理であれば、SSEコードが生成され、50倍以上の高速化も十分可能ではないかと期待している。

アセンブラのコードの一部
    mov    DWORD PTR tv423[ebp], eax
    mov    eax, ebx
    push    edi
    lea    edi, DWORD PTR [ebx+ecx]
    add    ebx, esi
    mov    DWORD PTR tv463[ebp], ebx
    mov    ebx, esi
    imul    ebx, DWORD PTR _y$[ebp]
    sub    eax, esi
    mov    DWORD PTR tv441[ebp], edi
    add    edi, esi
    mov    DWORD PTR tv428[ebp], eax
    add    eax, ecx
    mov    DWORD PTR tv422[ebp], edx
    add    edx, esi
    lea    esi, DWORD PTR [edx+ebx]
    mov    DWORD PTR tv442[ebp], edi
    add    edi, ebx
    add    ebx, eax
    add    edi, ecx

アセンブラのコード出力は、プロジェクトプロパティから、[構成プロパティ]→[C/C++]→[出力ファイル]→[アセンブリの出力] を設定する。

image

今回は4Core 8Thread の i7 860 での Parallel.For を利用したが、さらなるメニーコア化の時代が到来しており、これらのリソースを有効に活用できるソフトウェアの重要性がより高まってくるだろう。そんな時に、生産性の良い C# と.NET Parallel に、 Native C、SIMD Intrinsics の組み合わせは、最強の武器になるだろう。

マイクロソフトの 川西 裕幸さんが、2012年1月20日(金)にお亡くなりになられたそうです。

2012年1月21日

昨年の12月に交通事故に遭われ入院中だった、デベロッパー&プラットフォーム統括本部 川西 裕幸さんが、2012年1月20日(金)にお亡くなりになられたそうです。

大変洞察の深い、貴重な情報を展開していただいており、ますますのご活躍を期待していたところ、この悲報に接し、誠に残念でなりません。

心よりご冥福申し上げます。

ご葬儀の日程は下記の通りです。
お通夜:1月22日(日) 18:00-18:45
告別式:1月23日(月) 11:30-12:30
会場 :(通夜・告別式共に)セレモニーホール はまつ斎苑 

http://www.kitakanto-g.jp/index.html
住所 :〒320-0012 栃木県宇都宮市山本1丁目2-8
電話番号 :028-625-7002
故人 :川西 裕幸さん
喪主 :川西 千世子様(奥様)

このような手段でお知らせする非礼をお許しください。

Intel Intrinsic Guide

2012年1月20日

http://software.intel.com/en-us/avx/

ここから、Intel Intrinsic Guide(Windows) をダウンロード。

MMXからAVXまでカバーされている。

image

こんなツールがないと厳しい。

Intrinsics _mm_add_epi32の例

2012年1月20日

#include <stdio.h>
#include <tmmintrin.h>

int main ()
{
    __m128i a, b;

    a.m128i_i16[0] = 1;
    a.m128i_i16[1] = 1;
    a.m128i_i16[2] = 100;
    a.m128i_i16[3] = -100;
    a.m128i_i16[4] = -1000;
    a.m128i_i16[5] = 1000;
    a.m128i_i16[6] = 100;
    a.m128i_i16[7] = 52;
    b.m128i_i16[0] = -128;
    b.m128i_i16[1] = -64;
    b.m128i_i16[2] = 32;
    b.m128i_i16[3] = 4096;
    b.m128i_i16[4] = 2;
    b.m128i_i16[5] = -2;
    b.m128i_i16[6] = 32000;
    b.m128i_i16[7] = 0;

    __m128i res = _mm_add_epi32(a, b);

    printf_s(“Original a:\t%6d\t%6d\t%6d\t%6d\n\t\t%6d\t%6d\t%6d\t%6d\n”,
                a.m128i_i16[0], a.m128i_i16[1], a.m128i_i16[2], a.m128i_i16[3],
                a.m128i_i16[4], a.m128i_i16[5], a.m128i_i16[6], a.m128i_i16[7]);
    printf_s(“Original b:\t%6d\t%6d\t%6d\t%6d\n\t\t%6d\t%6d\t%6d\t%6d\n”,
                b.m128i_i16[0], b.m128i_i16[1], b.m128i_i16[2], b.m128i_i16[3],
                b.m128i_i16[4], b.m128i_i16[5], b.m128i_i16[6], b.m128i_i16[7]);
    printf_s(“Result res:\t%6d\t%6d\t%6d\t%6d\n\t\t%6d\t%6d\t%6d\t%6d\n”,
                res.m128i_i16[0], res.m128i_i16[1], res.m128i_i16[2], res.m128i_i16[3],
                res.m128i_i16[4], res.m128i_i16[5], res.m128i_i16[6], res.m128i_i16[7]);

    return 0;
}

image

Intrinsic Conventions

2012年1月19日

http://msdn.microsoft.com/ja-jp/library/y08s279d.aspx

_mm_<intrin_op>_<suffix>

<intrin_op> は、add, mul などの基本オペレーション

<suffix> は、データ・オペランドの種類。最初の1-2文字は、次の通り。

<suffix>の最初の1-2文字 意味

p

packed

ep

extended packed

s

scalar

<suffix> の残りの文字 意味

s

Single-precision floating point

d

Double-precision floating point

i128

Signed 128-bit integer

i64

Signed 64-bit integer

u64

Unsigned 64-bit integer

i32

Signed 32-bit integer

u32

Unsigned 32-bit integer

i16

Signed 16-bit integer

u16

Unsigned 16-bit integer

i8

Signed 8-bit integer

u8

Unsigned 8-bit integer

http://itpro.nikkeibp.co.jp/article/COLUMN/20051118/224885/?SS=imgview&FD=283461017&ST=develop

より、レジスタ