タグ

C#とparallelに関するni66lingのブックマーク (4)

  • C# Parallel.For + Native C による高速化~その3:並列画像処理

    C# Parallel.For + Native C による高速化~その3:並列画像処理 準備ができたところで、C# と C# + Native Cでの画像処理でどのぐらい差が出るのか試してみます。 対象は、1つの画像に対して、ラプラシアンフィルターを適用するという、簡単な画像処理です。ラプラシアンフィルタとは空間2次微分を計算し、輪郭を検出するフィルタです。 ここでは、次のような 3x3 の8近傍フィルターを使います。 画像の取得と表示部分 画像の取得と表示部分は、C# の得意とする部分なので、特に困ることはないと思います。 WPFで、次のような画面をデザインします。 <Window x:Class="WritableBitmap.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x

  • C# + Native C による高速化~その2: タスク並列ライブラリ

    タスク並列ライブラリ(Task Parallel Library)の略。.NET Framework Version 4 の System.Threading 名前空間および System.Threading.Tasks 名前空間のAPI のセット。 タスク並列ライブラリ~データの並列処理: Parallel.ForEach 複数のデータに対して、次のようにforeach で処理を行うことができます。これは、シーケンシャル(順次処理)となります。 foreach (var item in sourceCollection) { Process(item); } この時 Process(item) が item に対して完全に独立している場合、Parallel.Foreach により、並列処理が可能になります。 Parallel.ForEach(sourceCollection, item

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

    並列化による高速化は、アムダールの法則に従い、問題に内在する並列度に依存する。このような並列度の高い画像処理などでは並列化による高速化に向いており、C# で素直に実装(デフォルトのコンパイラスイッチ)したときが4.8秒に比べて、C# Parallel.For + Native Cで約50倍の高速化ができた。 実際のNative C のアセンブラ出力を確認してみると、次のようにSSE命令までは展開されていなかった。これは、フィルターの3重forループを展開し、さらに整数加減算+シフト演算へ変換しているため、SSE命令を使うより、単純なアセンブラの実行のほうが十分高速であるからと思われる。実際、手書きで SSE Intrinsics で積和演算を書いて実行してみたが、コンパイラーの最適化よりも、若干遅い結果となってしまった。もう少し複雑な演算や、浮動小数点の積和が必要な処理であれば、SSEコー

    C# Parallel.For + Native C での画像処理で、C#の約50倍の高速化
  • Parallel.ForEach を使用して単純な並列プログラムを記述する - .NET

    例 この例は、CPU を集中的に使用する操作に対する Parallel.ForEach を示します。 この例を実行すると、200 万の数字がランダムに生成され、素数へのフィルター処理が試行されます。 最初のケースでは、for ループを使用してコレクションを反復処理します。 2 番目のケースでは、Parallel.ForEach を使用してコレクションを反復処理します。 アプリケーションが終了すると、各反復にかかった時間が表示されます。 using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; namespace ParallelEx

    Parallel.ForEach を使用して単純な並列プログラムを記述する - .NET
  • 1