Insert your Title here

Similar documents
POSIXスレッド

NetworkVantage 9

POSIXプログラミング Pthreads編

スレッド

スレッド

この方法では, 複数のアドレスが同じインデックスに対応づけられる可能性があるため, キャッシュラインのコピーと書き戻しが交互に起きる性のミスが発生する可能性がある. これを回避するために考案されたのが, 連想メモリアクセスができる形キャッシュである. この方式は, キャッシュに余裕がある限り主記憶の

PowerPoint プレゼンテーション

Microsoft PowerPoint - OpenMP入門.pptx

PowerPoint プレゼンテーション

IntelR Compilers Professional Editions

スライド 1

この手の問題を診断する際に Simics は完璧なツールなのですが 実行するためには 問題が発生するプログラムを Simics に取り込まなければなりません すなわち Simics 上で Simics を実行するのです まず Simics 内部に開発ホストの複製を作成します これは何も難しいことでは

Microsoft PowerPoint ppt [互換モード]

本文ALL.indd

TopSE並行システム はじめに

Presentation title (on one or two lines)

JavaプログラミングⅠ

Pervasive PSQL v11 のベンチマーク パフォーマンスの結果

01-introduction.ppt

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

PowerPoint プレゼンテーション

NEC 製PC サーバ『Express5800 R120f-1E』とSanDisk『ioMemory SX /SX 』検証報告書

PHP 開発ツール Zend Studio PHP アフ リケーションサーハ ー Zend Server OSC Tokyo/Spring /02/28 株式会社イグアスソリューション事業部

計算機アーキテクチャ

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

スライド 1

Microsoft Visual Studio 2010 Professional Data Sheet

スキル領域 職種 : ソフトウェアデベロップメント スキル領域と SWD 経済産業省, 独立行政法人情報処理推進機構

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

PowerPoint プレゼンテーション

04-process_thread_2.ppt

インテル(R) Visual Fortran コンパイラ 10.0

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

PowerPoint プレゼンテーション

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

PowerPoint Presentation

BOM for Windows Ver

2015 TRON Symposium セッション 組込み機器のための機能安全対応 TRON Safe Kernel TRON Safe Kernel の紹介 2015/12/10 株式会社日立超 LSIシステムズ製品ソリューション設計部トロンフォーラム TRON Safe Kernel WG 幹事

02: 変数と標準入出力

プログラミングI第10回

21 章のお話

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

PowerPoint プレゼンテーション

NUMAの構成

マルチコア時代の並列プログラミング

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

02: 変数と標準入出力

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

デバッグの工夫

slide5.pptx

02: 変数と標準入出力

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

LAMP スタック:品質およびセキュリティ

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

Microsoft PowerPoint - PressPresen-AbsInt.pptx

講習No.1

問題1 以下に示すプログラムは、次の処理をするプログラムである

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

Slide 1

メソッドのまとめ

Source Insight

3次多項式パラメタ推定計算の CUDAを用いた実装 (CUDAプログラミングの練習として) Implementation of the Estimation of the parameters of 3rd-order-Polynomial with CUDA

Microsoft PowerPoint - 09.pptx

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

memcached 方式 (No Replication) 認証情報は ログインした tomcat と設定された各 memcached サーバーに認証情報を分割し振り分けて保管する memcached の方系がダウンした場合は ログインしたことのあるサーバーへのアクセスでは tomcat に認証情報

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

2015_collabo_04

040402.ユニットテスト

Microsoft PowerPoint - 1_コンパイラ入門セミナー.ppt

JS2-14 マルチコアCPU時代の Javaプログラミング

PowerPoint プレゼンテーション

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

ファイナライザを理解する ~ ファイナライザに起因するトラブルを避けるために ~ 2013 年 11 月 25 日 橋口雅史 Java アプリケーションでファイナライザ (finalize() メソッド ) を使用したことがあるプログラマーは多いと思います しかし ファイナライザの仕組みや注意点につ

相続支払い対策ポイント

150423HC相続資産圧縮対策のポイント

5-3- 基統合開発環境に関する知識 1 独立行政法人情報処理推進機構

同期を開始する ( 初期設定 ) 2 1 Remote Link PC Sync を起動する 2 1 接続機器の [PIN コード ] [ ユーザー名 ] [ パスワード ] を入力する [PIN コード ] などの情報は 接続機器の設定画面でご確認ください 例 )HLS-C シリーズの場合 :[R

ハピタス のコピー.pages

Copyright 2008 All Rights Reserved 2

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft PowerPoint - C++_第1回.pptx

PowerPoint プレゼンテーション

目次 ペトリネットの概要 適用事例

はじめに Web アプリケーションの発展と普及の勢いは弱まる兆しがありません 弱まるどころか 加速し続けています これは これまでの ERP CRM Web 2.0 などの Web ベースアプリケーションが提供してきたメリットを考えると 不思議なことではありません Web アプリケーションの爆発的拡

Notes and Points for TMPR454 Flash memory

ユーティリティ 管理番号 内容 対象バージョン 157 管理情報バッチ登録コマンド (utliupdt) のメッセージ出力に対し リダイレクトまたはパイプを使用すると メッセージが途中までしか出 力されないことがある 267 転送集計コマンド (utllogcnt) でファイル ID とホスト名の組

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Microsoft PowerPoint - OS04.pptx

Copyright 2006 KDDI Corporation. All Rights Reserved page1

平成20年度成果報告書

プログラミング基礎

統合開発環境CubeSuite+ V へのバージョンアップのお知らせ

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

スライド 1

Transcription:

マルチコア マルチスレッド環境での静的解析ツールの応用 米 GrammaTech 社 CodeSonar によるスレッド間のデータ競合の検出 2013 GrammaTech, Inc. All rights reserved

Agenda 並列実行に起因する不具合の摘出 なぜ 並列実行されるプログラミングは難しいのか データの競合 デッドロック どのようにして静的解析ツールで並列実行の問題を見つけるのか? コーディングの例 遅延初期化 (Lazy Initialization) まとめ Page 2

トレンド : シングルからマルチコアへ 伝統的な 性能向上のアプローチはそろそろおしまい クロック周波数の上昇 メモリアクセスの高速化 そして賢い命令のスケジュールによる最適化は もはや時代遅れ 開発チームはマルチコアプロセッサを使用したがっている よりよいパフォーマンスへの近道 消費電力でもメリット しかし 実際の適用には大きな障害があります アプリケーションソフトウェアは マルチコアを利用するために変更が必要 マルチコアプロセッサを導入しただけでは もっている性能はフルに発揮できません そして マルチコアプログラミングは難しい Page 3

マルチコアはソフトウェア開発を複雑にする + = + = 2 つの命令を持つ 2 つのスレッドでは 組み合わせは 6 つ 3 つの命令では 20 の組み合わせとなります Page 4

現実世界でのスケジューリング 現実世界のソフトウェアは 前のスライドの例よりも 非常に多くの命令で構成されています インターリーブは スケジューラーにより決定されます 全てのパターンのインターリーブをテストすることは不可能です 決められたパターンのインターリーブでさえも テストすることは難しいです システムのスケジューリングは非常に複雑です 決定することは難しい 指定されたテストケースでも 多くの異なる振る舞いをします 引数が同じ場合でも 同じ動作をするとは限らない 実行の正しさは スケジューリングに依存します 競合条件は 並列ソフトウェアの悩みの種 Page 5

データの競合 データの競合は以下の時に発生します : 1. 複数の実行中のスレッドが共有しているデータをアクセスする場合 2. 少なくともひとつのスレッドがデータの値を変更する場合 3. アクセスが明確な同期を使用していない場合 データの競合は システムを矛盾した状態にします また データの競合は 検出されることが難しく 極めて不可解な 稀な ( 困った ) 状況を引き起こします Page 6

データの競合の例 Thread 1 Thread 2 count: 10 9 count := count + 1; count := count - 1; count := count + 1; メモリからレジスタに転送してレジスタに 1 を加算してレジスタからメモリに書き戻す Page 7

データの競合 Instruction Register Memory load 9-9 increment 10 9 9 store 10 10 9 wait. load 10-10 decrement 10 9 10 store 9 10 9 インターリーブされていない命令では正しい結果が得られます wait. load 9-9 increment 10 9 9 load 9-9 decrement 9 9 8 store 10 10 9 store 8 10 8 インターリーブされた命令では 誤った結果となる Page 8

なぜデータの競合はデバッグが難しいのか 稀にしか発生しないということは テスト中に発見するチャンスが少ないということ 診断は難しい 症状と原因が大きく離れていることがしばしばある 再現させることが最大の問題 結果が間違った実行のスケジュール再生が難しい スケジューリングは環境に敏感 デバッガの使用 コンパイラの最適化 I/O 回数の違い 外部環境の違いで スケジューリングは変化します 開発者はコードを読むときには ひとつのスレッドしか一度に読むことができない スレッドの相互作用の影響は簡単に見落とされる Page 9

GrammaTech CodeSonar 重大な一般的な不具合とセキュリティの脆弱性をみつけます プログラム全体でのパス構造解析での シンボリック実行を使用 どのように使用するか : コードやビルドスクリプトの変更は必要なし プログラムは通常通りビルドされ CodeSonar がコンパイルコマンドラインを監視 ビルドの一方で CodeSonar はコードを解析し 不具合を見つけます 見つけた不具合はお客様のマシン上のデータベースに集められます ユーザーのログもデータベースに収集されます 解析のプロセスは全体で自動化可能です ( 例 : 毎日 夜に実行 ) Page 10

CodeSonar のコード解析原理 ソースコードモデル摘出中間表現解析結果出力 Page 11

CodeSonar はどのようにしてデータの競合を見つけるのか CodeSonar は症状ではなく 原因にフォーカスする コードを検証してどのスレッドでどのロックを使用しているかの情報を持つアブストラクトモデルを生成します 自動的に 可能性のあるインターリーブを調査し 共有メモリへのアクセスパターンを検証します コードのどこに 問題を含むインターリーブがあるかを見つけます データの競合が認められた場合 CodeSonar は 関係する情報とともに Data Race ウォーニングを通知します また CodeSonar は同期構造により発生する問題も検出します 例 : デッドロック ロックの誤り Page 12

デッドロックする銀行処理の例 アカウント X からアカウント Y へ送金する手順 アカウントXをロック アカウントYをロック 指定金額をアカウントXから引き Yに加算 アカウントYをアンロック アカウントXをアンロック 2 つのトランザクションを検討してみます $100をアリスからボブへ送金 $50をボブからアリスへ送金 Page 13

デッドロック Thread 1 acquire lock for Alice acquire lock for Bob waiting on Thread 2 Alice Bob Thread 2 acquire lock for Bob acquire lock for Alice waiting on Thread 1 Page 14

CodeSonar はどのようにしてデッドロックを見つけるのか リソースの順序を確認 Dijkstra が 1965 年に発表した 食事する哲学者たち の問題 Conflicting Lock Order ウォーニングは 異なるスレッドで 同じロックが異なる順序で発行されると 検出する CodeSonar は さらにネストされたロックのチェックも行います 複数のロックを使用している場合にチェックが行われます 同期問題の難しさを強調します Page 15

コードの例 遅延初期化 (Lazy Initialization) Page 16

遅延初期化 (Lazy Initialization) コード例 float *singleton( void ) { static int is_initialized = 0; } static float *actual_data = NULL; if(!is_initialized ) { pthread_mutex_lock( &m ); if(!is_initialized ) { actual_data = (float *)malloc( sizeof( float ) ); *actual_data = 4.2; is_initialized = 1; } pthread_mutex_unlock( &m ); } return actual_data; void *f1( void *a ) { printf( "%f", *singleton() ); } return a; void *f2( void *a ) { printf( "%f", *singleton() ); } return a; Page 17

遅延初期化 (Lazy Initialization) 単一の関数 Page 18

遅延初期化 (Lazy Initialization) 単一の関数 Page 19

遅延初期化 (Lazy Initialization) 並べて比較 Page 20

まとめ マルチコアの開発は避けられない 同時実行に伴うエラーは潜んでいる 再現 診断 除去は難しい 見たところ問題がないと思われるデータの競合でさえ 場合によっては突然悪い結果をもたらすことがある 静的解析ツールで 不具合の検出を助けます Page 21

CodeSonar の先進的な静的解析 プログラム全体の解析 ( モジュール間も含む ) 非常に大規模なコードでの使用が可能なスケーラビリティー 重要な不具合の検出 バッファオーバラン Null ポインタの参照 0 での割り算 初期化されていない変数 ヒープ以外の変数の解放 解放後メモリの使用 競合条件 メモリ / リソースのリーク ユーザー定義のチェック その他多くの不具合 Page 22

問い合わせ窓口 GrammaTech 日本総代理店 エーアイコーポレーション http://www.aicp.co.jp お問い合わせ 資料請求 評価版申し込みは Web の お問い合わせ 資料申込 のフォームをご利用ください Page 23