JPWO2012014313A1 - マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラム - Google Patents

マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラム Download PDF

Info

Publication number
JPWO2012014313A1
JPWO2012014313A1 JP2012526257A JP2012526257A JPWO2012014313A1 JP WO2012014313 A1 JPWO2012014313 A1 JP WO2012014313A1 JP 2012526257 A JP2012526257 A JP 2012526257A JP 2012526257 A JP2012526257 A JP 2012526257A JP WO2012014313 A1 JPWO2012014313 A1 JP WO2012014313A1
Authority
JP
Japan
Prior art keywords
thread
time
assigned
cpu
core
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2012526257A
Other languages
English (en)
Other versions
JP5321748B2 (ja
Inventor
浩一郎 山下
浩一郎 山下
清志 宮▲崎▼
清志 宮▲崎▼
宏真 山内
宏真 山内
鈴木 貴久
貴久 鈴木
康志 栗原
康志 栗原
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Publication of JPWO2012014313A1 publication Critical patent/JPWO2012014313A1/ja
Application granted granted Critical
Publication of JP5321748B2 publication Critical patent/JP5321748B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multi Processors (AREA)

Abstract

CPU(#0)は、検出部(302)によって、CPU(#0)に割り当てられるスレッド(211)と、CPU(#1)に割り当てられるスレッド(212)と、が共用リソース(201)にアクセスする状態を検出する。検出後、CPU(#0)は、算出部(303)によって、スレッド(211)が割り当てられる第1の周期とスレッド(212)が割り当てられる第2の周期とから、共用リソース(201)に対するアクセス競合を発生させる競合周期を算出する。算出後、CPU(#0)は、選択部(304)によってスレッド(211)とスレッド(212)から、スレッド(212)の後方に割り当てられるスレッド(223)を選択する。CPU(#1)は、スレッド(212)が割り当てられる時刻と、スレッド(212)が割り当てられる時刻と、スレッド(223)が割り当てられる時刻を入れ替える。

Description

本発明は、スレッドを制御するマルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムに関する。
従来、組み込み機器をはじめとするマルチコアプロセッサシステムは、各CPU、各スレッドでハードウェア資源であるリソースを共用しながら運用している。たとえば、共用メモリに代表される密結合型マルチプロセッサシステムは、各CPUでメモリを共用しながら運用する。また、メモリ以外の共用リソースとしては、ファイルシステムや入出力装置も共用リソースの一部となる。共用リソースの運用方式として、大別して、キューイング方式、キャッシュ方式、優先度方式、という3つの方式が存在する。
キューイング方式は、各スレッドから通知される共用リソースへのアクセス要求を、リストとして登録し、優先度または到着順に処理を行う方式である。キューイングを行う方式として、マスタコアによるソフトウェア制御で行う方式と、共用リソースに調停回路を実装して行う方式とが存在する。以下、前者のキューイング方式をキューイング方式1、後者のキューイング方式をキューイング方式2と呼称する。
キャッシュ方式は、ストレージなどで適用される方式で、HDD(Hard Disk Drive)やフラッシュメモリといった、揮発性メモリのアクセス速度より低速の共用リソースに対し、共用リソースとCPUの間にキャッシュメモリを挟む方式である。これにより、CPUは揮発性メモリと同等のスループットで共用リソースにアクセスすることができる。共用リソース側は、CPUによるアクセスの後に、共用リソースの実体にアクセスする。優先度方式は、スレッドに優先度を付加し、高優先度のスレッドを共用リソースへ優先的にアクセスさせる方式である。
たとえば、キューイング方式1を適用した技術として、リソース使用中フラグを設定し、他のCPUが共用リソースにアクセス中でなければ、キューよりスレッドを取得して実行する。これにより、共用リソースに対するアクセス競合中を避け、CPUのアイドルを防止する技術が開示されている(たとえば、下記特許文献1を参照。)。
また、共用リソースへのアクセス解析を行い、ディスパッチ時にアクセス状態を監視することで、アクセス競合を回避する技術が開示されている(たとえば、下記特許文献2を参照。)。また、別の技術として、アクセス競合が発生しそうになった場合、スケジュールに併せて、スレッドを停止させるか、スレッドをスピンさせることにより、アクセス競合を回避する技術が開示されている(たとえば、下記特許文献3を参照。)。
特開昭62−290958号公報 特開平10−49389号公報 特開平6−12394号公報
しかしながら、上述した従来技術において、キューイング方式2やキャッシュ方式では、特別なハードウェア機構が要求されるため、高コストになるという問題があった。また、キューイング方式2では、DMAなどの高速アクセスユニットが高優先に大量データのアクセスを行うと、CPUによるアクセスが阻害されるという問題があった。また、キューイング方式1では、特別なハードウェア機構は要求されないが、アクセス要求を発行してから処理が行われるまでの時間が長く、システムのスループットが低下するという問題があった。また、優先度方式では、同じ優先度のスレッドがアクセスした場合に、処理性能が低下するという問題があった。
また、特許文献3にかかる技術では、アクセス競合は回避できるが、そのためにスレッドを停止させたりスピンさせたりするために、スレッドの処理が実行されなくなるため、処理性能が低下するという問題があった。
本発明は、上述した従来技術による問題点を解消するため、アクセス競合を回避しつつ、処理性能を維持できるマルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムを提供することを目的とする。
上述した課題を解決し、目的を達成するため、開示のマルチコアプロセッサシステムは、複数のコアのうち第1のコアに割り当てられる第1のスレッドと、複数のコアのうち第1のコアとは異なる第2のコアに割り当てられる第2のスレッドと、が同一のリソースにアクセスする状態を検出し、第1のスレッドが第1のコアに割り当てられる第1の周期と第2のスレッドが第2のコアに割り当てられる第2の周期とに基づいて、第1および第2のスレッドがリソースに対するアクセス競合を発生させる競合周期を算出し、算出された競合周期にて割り当てられる第1および第2のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける競合周期の前後いずれかの時刻に割り当てられるスレッドを選択し、いずれか一方のスレッドが割り当てられる時刻と、選択されたスレッドが割り当てられる時刻と、を入れ替える。
本マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムによれば、アクセス競合を回避しつつ、処理性能を維持できるという効果を奏する。
実施の形態にかかるマルチコアプロセッサシステムのハードウェアを示すブロック図である。 マルチコアプロセッサシステム100の一部のハードウェアと実行されるソフトウェアを示す説明図である。 マルチコアプロセッサシステム100の機能を示すブロック図である。 スレッド制御処理を行うための開発時および実行時の動作概要を示す説明図である。 マルチコアプロセッサシステム100の開発時の概要を示す説明図である。 スレッドディスパッチの概要を示す説明図である。 ディスパッチの順序を入れ替える方法の概要を示す説明図である。 スレッド制御処理を行ったタイムチャートを示す説明図である。 新たにスレッドを起動した際のタイムチャートを示す説明図である。 スレッド制御処理を示すフローチャートである。 競合周期算出処理を示すフローチャートである。 スレッドの起動タイミングが異なる場合、初回の競合周期までのオフセット時間と競合周期を算出する競合周期算出処理を示すフローチャートである。 マルチコアプロセッサシステム100のディスパッチ時間またはインターバルが変更した場合のスレッド制御処理を示すフローチャートである。
以下に添付図面を参照して、本発明にかかるマルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムの好適な実施の形態を詳細に説明する。
(マルチコアプロセッサシステムのハードウェア)
図1は、実施の形態にかかるマルチコアプロセッサシステムのハードウェアを示すブロック図である。図1において、マルチコアプロセッサシステム100は、CPUを複数搭載するCPUs101と、ROM(Read‐Only Memory)102と、RAM(Random Access Memory)103と、を含む。また、マルチコアプロセッサシステム100は、フラッシュROM104と、フラッシュROMコントローラ105と、フラッシュROM106と、を含む。また、マルチコアプロセッサシステム100は、ユーザやその他の機器との入出力装置として、ディスプレイ107と、I/F(Interface)108と、キーボード109と、を含む。また、各部はバス110によってそれぞれ接続されている。
ここで、CPUs101は、マルチコアプロセッサシステム100の全体の制御を司る。CPUs101は、シングルコアのプロセッサを並列して接続した全てのCPUを指している。CPUs101は、CPU#0〜CPU#3を含む。また、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例にあげて説明する。
ROM102は、ブートプログラムなどのプログラムを記憶している。RAM103は、CPUs101のワークエリアとして使用される。フラッシュROM104は、OS(Operating System)などのシステムソフトウェアやアプリケーションソフトウェアなどを記憶している。たとえば、OSを更新する場合、マルチコアプロセッサシステム100は、I/F108によって新しいOSを受信し、フラッシュROM104に格納されている古いOSを、受信した新しいOSに更新する。
フラッシュROMコントローラ105は、CPUs101の制御に従ってフラッシュROM106に対するデータのリード/ライトを制御する。フラッシュROM106は、フラッシュROMコントローラ105の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム100を使用するユーザがI/F108を通して取得した画像データ、映像データなどである。フラッシュROM106は、たとえば、メモリカード、SDカードなどを採用することができる。
ディスプレイ107は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ107は、たとえば、TFT液晶ディスプレイなどを採用することができる。
I/F108は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク111に接続され、ネットワーク111を介して他の装置に接続される。そして、I/F108は、ネットワーク111と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F108には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード109は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード109は、タッチパネル式の入力パッドやテンキーなどであってもよい。
図2は、マルチコアプロセッサシステム100の一部のハードウェアと実行されるソフトウェアを示す説明図である。図2で示されるハードウェアは、共用リソース201と、共用リソース202と、CPUs101に含まれるCPU#0〜CPU#3とである。共用リソース201と、共用リソース202と、CPU#0〜CPU#3はバス110によって接続されている。
共用リソース201と、共用リソース202は、ソフトウェアによってアクセスされるデバイスである。デバイスとして、たとえば、I/F108に接続されるカメラデバイスやサウンドデバイスなどが存在する。また、リソースとしては、RAM103、フラッシュROM104などにアクセスするファイルシステムなども含まれる。このように、本実施の形態にかかるマルチコアプロセッサシステム100では、特別なバッファやキュー、ハードウェア機構は不要である。
図2で示されるソフトウェアは、カーネル203と、ディスパッチスケジューラ204と、バリア同期機構205と、スレッド211〜スレッド214と、スレッド221〜スレッド229と、である。カーネル203と、ディスパッチスケジューラ204と、バリア同期機構205は、CPU#0〜CPU#3の各々で実行されており、CPU#0〜CPU#3の各々に対応する意味で接尾記号となる“#0”〜“#3”が付与されている。たとえば、カーネル203#0、ディスパッチスケジューラ204#0、バリア同期機構205#0は、CPU#0によって実行されている。
また、スレッド211、スレッド221、スレッド222はCPU#0で実行されている。スレッド212、スレッド223〜スレッド225はCPU#1で実行されている。スレッド213、スレッド226、スレッド227はCPU#2で実行されている。スレッド214、スレッド228、スレッド229はCPU#3で実行されている。
カーネル203は、各CPUを制御するプログラムである。カーネル203は、OSの中核の機能であり、たとえば、マルチコアプロセッサシステム100のリソースを管理し、スレッドなどのソフトウェアがハードウェアにアクセスできるようにする。
ディスパッチスケジューラ204は、CPUに割り当てるスレッドを決定し、スレッドを割り当てるプログラムである。たとえば、ディスパッチスケジューラ204#0は、CPU#0にて実行するスレッドを決定し、現在割り当てているスレッドのプログラムカウンタなどのレジスタ情報を、スレッドのコンテキストに格納する。続けて、ディスパッチスケジューラ204#0は、決定されたスレッドのコンテキストからレジスタ情報を取得し、CPU#0のレジスタに設定する。
バリア同期機構205は、同期を取るポイントを設定し、同期を取るスレッドが同期を取るべきポイントに到達した場合、CPUはスレッドを一時的に停止させ、全てのスレッドがバリアポイントに到達した場合にスレッドを再開する機構である。
たとえば、CPU#0で実行されるスレッド211と、CPU#1で実行されるスレッド212が存在する場合を想定する。先にスレッド211が同期を取るポイントに到達した場合、CPU#0は、スレッド211を一時的に停止させる。続けて、スレッド212が同期を取るポイントに到達した場合、全てのスレッドが同期を取るポイントに到達したため、CPU#1は、スレッド212を続行する。さらに、CPU#1は、CPU#0に対して停止の解除を通知し、CPU#0は、スレッド211を再開させる。バリア同期機構205は、ソフトウェアにて実装されてもよいし、ハードウェアで実装されていてもよい。
スレッド211、スレッド212は、共用リソース201にアクセスするスレッドであり、スレッド213、スレッド214は、共用リソース202にアクセスするスレッドである。また、スレッド221〜スレッド229は、共用リソース201、共用リソース202のどちらにもアクセスしないスレッドである。
たとえば、共用リソース201をファイルシステムとし、共用リソース202をカメラデバイスと想定する。続けて、スレッド211を文字入力スレッド、スレッド212を文章エディタスレッド、スレッド213をビデオチャットスレッド、スレッド214をデジタルカメラと同様の機能を提供するカメラスレッドと想定する。スレッド211は、ファイルシステムをかな漢字変換辞書ファイルのアクセスのために使用し、スレッド212は、ファイルシステムを編集中となる文章ファイルのアクセスのために使用する。スレッド213は、カメラデバイスをチャット用の画像データをカメラから取り込むために使用し、スレッド214は、カメラデバイスをカメラの操作のために使用する。
このとき、スレッド211、スレッド212は周期的にCPU#0、CPU#1に割り当てられているため、同じタイミングでCPUに割り当てられた場合、ファイルシステムに対するアクセス競合が発生する。具体的には、スレッド212となる文章エディタスレッドがファイルシステムにアクセスをしている間にユーザがスレッド211となる文字入力を行うことで、たとえば文字入力がひっかかるような操作感が発生するといった弊害が発生する。
また、図示していないが、ファイルシステムをダウンロードの格納先としてアクセスするダウンローダスレッドが存在した場合、ユーザがスレッド211となる文字入力を行うたびに、ダウンローダスレッドがアクセス競合のため処理速度が低下する。結果、想定された時間以内にダウンロードが終了しないといった弊害が発生する。
(マルチコアプロセッサシステム100の機能)
次に、マルチコアプロセッサシステム100の機能について説明する。図3は、マルチコアプロセッサシステム100の機能を示すブロック図である。マルチコアプロセッサシステム100は、検出部302と、算出部303と、選択部304と、入替部305と、設定部306と、設定部307と、を含む。この制御部となる機能(検出部302〜設定部307)は、記憶装置に記憶されたプログラムをCPUs101が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図1に示したROM102、RAM103、フラッシュROM104、フラッシュROM106などである。または、I/F108を経由して他のCPUが実行することにより、その機能を実現してもよい。
また、マルチコアプロセッサシステム100は、CPUで実行されるスレッドごとに、共用リソースへのアクセス情報を記録した共用リソースアクセス情報データベース301にアクセス可能である。共用リソースアクセス情報データベース301の詳細は、図5にて後述する。
また、図3では、検出部302〜選択部304、設定部306はCPU#0の機能として、入替部305、設定部307はCPU#1の機能として図示されている。入替部305について、選択部304の結果によってはCPU#0の機能となってもよい。
検出部302は、複数のコアのうち第1のコアに割り当てられる第1のスレッドと、複数のコアのうち第1のコアとは異なる第2のコアに割り当てられる第2のスレッドと、が同一のリソースにアクセスする状態を検出する機能を有する。たとえば、検出部302は第1のスレッドとしてCPU#0に割り当てられるスレッド211と、第2のスレッドとしてCPU#1に割り当てられるスレッド212と、が共用リソース201にアクセスする状態を検出する。なお、検出結果は、CPU#0のレジスタ、キャッシュメモリ、RAM103などに記憶される。
算出部303は、検出部302によって複数のスレッドが同一のリソースにアクセスする状態が検出された場合、第1のスレッドが第1のコアに割り当てられる第1の周期と第2のスレッドが第2のコアに割り当てられる第2の周期とを取得する。続けて、算出部303は、第1の周期と第2の周期に基づいて、第1および第2のスレッドがリソースに対するアクセス競合を発生させる競合周期を算出する機能を有する。また、算出部303は、第1および第2の周期の公倍数を求めることにより、競合周期を算出してもよい。
ここで、コアに割り当てられる周期とは、該当のスレッドが1度ディスパッチされ、次にディスパッチされるまでの時間である。具体的には、CPUが周期的にスレッドをディスパッチする状態で、該当のスレッドが6回に1回ディスパッチされ、1回の時間が10[マイクロ秒]である場合、コアに割り当てられる周期は6×10=60[マイクロ秒]となる。以下、コアに割り当てられる周期をディスパッチ周期と称する。
たとえば、算出部303は、スレッド211のディスパッチ周期と、スレッド212のディスパッチ周期とに基づいて、スレッド211とスレッド212が共用リソース201に対するアクセス競合を発生させる競合周期を算出する。競合周期の算出方法としては、たとえば、スレッド211のディスパッチ周期とスレッド212のディスパッチ周期を乗算することで、競合周期を求めてもよい。たとえば、スレッド211のディスパッチ周期が60[マイクロ秒]であり、スレッド212のディスパッチ周期が40[マイクロ秒]である場合に、算出部303は、競合周期を60×40=2400[マイクロ秒]として算出する。2つのスレッドのディスパッチ周期が互いに素であれば、算出部303は、全ての競合周期を算出できる。
また、算出部303は、競合周期の算出方法として、スレッド211のディスパッチ周期とスレッド212のディスパッチ周期の公倍数を求めることで、競合周期を算出してもよい。スレッド211のディスパッチ周期が60[マイクロ秒]であり、スレッド212のディスパッチ周期が40[マイクロ秒]であれば、算出部303は、競合周期を最小公倍数LCM(60、40)=120[マイクロ秒]として算出してもよい。
また、算出部303は、第1のコアに第1のスレッドが割り当てられる時刻より前で第2のスレッドが第2のコアに最後に割り当てられた時刻と第1および第2の周期とを取得する。続けて、算出部303は、競合周期として第1のスレッドが割り当てられる時刻以降で最初のアクセス競合が発生する時刻を算出してもよい。これにより、算出部303は、最初のアクセス競合が発生するまでのオフセット時間を算出することになる。
たとえば、算出部303は、CPU#0にスレッド211が割り当てられる時刻より前でスレッド212がCPU#1に最後に割り当てられた時刻とスレッド211およびスレッド212のディスパッチ周期を取得する。説明を簡略化するため、スレッド211が割り当てられる時刻を基準とし、スレッド212がCPU#1に最後に割り当てられた時刻を−10[マイクロ秒]とする。また、スレッド211およびスレッド212のディスパッチ周期をそれぞれ30[マイクロ秒]、50[マイクロ秒]とする。
この例では、スレッド211は、αを非負整数とし、0、30、60、90、120、・・・、α・30[マイクロ秒]の時にCPU#0に割り当てられる。同様に、スレッド212は、βを非負整数とし、−10、40、90、140、・・・、(β・50−10)[マイクロ秒]の時にCPU#1に割り当てられる。このとき、アクセス競合を起こす時刻=α・30=β・50−10を満たしており、前述の例では、α=3、β=2となる90[マイクロ秒]の時に、最初のアクセス競合が発生する。具体的なα、βの算出方法については、図9にて後述する。なお、算出された競合周期は、CPU#0のレジスタ、キャッシュメモリ、RAM103などに記憶される。
選択部304は、算出部303によって算出された競合周期にて割り当てられる第1および第2のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける競合周期の前後いずれかの時刻に割り当てられるスレッドを選択する機能を有する。また、選択部304は、設定部306、設定部307によって任意のスレッドの割り当てを開始する時刻が同一の時刻に設定された場合、算出部303によって算出された競合周期にてスレッドを選択してもよい。
たとえば、選択部304は、アクセス競合を発生させるスレッド211とスレッド212のうち、スレッド211をいずれか一方のスレッドとし、スレッド211の前後に割り当てられるスレッド222かスレッド221のいずれかのスレッドを選択する。この場合、入替部305は、CPU#0の機能となる。
また、選択部304が、スレッド211とスレッド212のうち、スレッド212をいずれか一方のスレッドとした場合、スレッド212の前後に割り当てられるスレッド225かスレッド223のいずれかのスレッドを選択する。この場合、入替部305は、CPU#1の機能となる。なお、選択されたスレッドの情報は、CPU#0のレジスタ、キャッシュメモリ、RAM103などに記憶される。
入替部305は、選択部304でのいずれか一方のスレッドが割り当てられる時刻と、選択部304によって選択されたスレッドが割り当てられる時刻と、を入れ替える機能を有する。たとえば、入替部305は、選択部304によってスレッド223が選択された場合、スレッド212が割り当てられる時刻と、スレッド223が割り当てられる時刻と、を入れ替える。具体的な入れ替え方法については、図7にて後述する。なお、スレッドが割り当てられる時刻を入れ替えたという情報は、CPU#1のレジスタ、キャッシュメモリ、RAM103などに記憶されてもよい。
設定部306、設定部307は、算出部303によって競合周期が算出された場合、第1および第2のコアに割り当てられる任意のスレッドの割り当てを開始する時刻を同一の時刻に設定する機能を有する。たとえば、設定部306、設定部307は、バリア同期機構205によって、CPU#0とCPU#1で割り当てられるスレッドの割り当てを開始する時刻を同一の時刻に設定する。なお、同一の時刻に設定したという情報は、各CPUのレジスタ、キャッシュメモリ、RAM103などに記憶されてもよい。
図4は、スレッド制御処理を行うための開発時および実行時の動作概要を示す説明図である。符号401で示す処理は、マルチコアプロセッサシステム100の開発時に行われる処理であり、符号402で示す処理は、マルチコアプロセッサシステム100の実行時に行われる処理である。
開発時には、スレッド211用のソースコードから、コンパイラは、実行コードの生成および共用リソースへのアクセス情報を解析し、スレッド211の実行コードと、スレッド211に対応する共用リソースアクセス情報データベース301を出力する。同様に、コンパイラは、スレッド212用のソースコードから、スレッド212の実行コードとスレッド212に対応する共用リソースアクセス情報データベース301を出力する。同様に、コンパイラは、スレッド213用のソースコードから、スレッド213の実行コードとスレッド213に対応する共用リソースアクセス情報データベース301を出力する。
実行時には、マルチコアプロセッサシステム100は、開発時に生成された実行コードによって、マルチスレッドを複数のCPUで同時実行する。また、マルチコアプロセッサシステム100は、共用リソースアクセス情報データベース301を参照し、複数のスレッドが同一時刻に共用リソースにアクセスしないように、スレッドのディスパッチの順序を入れ替える。
図5は、マルチコアプロセッサシステム100の開発時の概要を示す説明図である。また、図5では、開発時に生成される共用リソースアクセス情報データベース301の詳細についても説明を行う。
コンパイラは、入力されたソースコードから、実行コードを生成する際に、共用リソース情報と共用リソースへのアクセス情報を生成する。共用リソース情報は、マルチコアプロセッサシステム100の共用リソースの情報が記載されており、入力されたソースコードや、Makefile上の情報から生成される。共用リソースへのアクセス情報は、共用リソースへのアクセス情報がスレッドごとに記載しており、コンパイラの一部の機能であるリンカによって生成される。コンパイラは、共用リソース情報と共用リソースへのアクセス情報とから、共用リソースアクセス情報データベース301を生成する。
共用リソースアクセス情報データベース301は、共用リソースへのアクセス情報をスレッドごとに記載している。共用リソースアクセス情報データベース301には、大項目としてスレッドフィールドが存在し、スレッドフィールドの内部にCPUフィールドが存在し、CPUフィールドの内部にアクセスフィールドが存在する。
スレッドフィールドは、スレッドの名称が設定されており、たとえば、“スレッド:スレッド211”のように設定される。CPUフィールドは、スレッドが割り当てられたCPU番号が設定されており、たとえば、m番目のCPUであるCPU#mに割り当てられた場合、“CPU:m”のように設定される。なお、CPUフィールドは、実行時に、ディスパッチスケジューラ204により動的に決定される。アクセスフィールドは、割り当てられたスレッドがアクセスする共用リソース名が設定されており、たとえば、“アクセス:共用リソース201”のように設定される。
図6は、スレッドディスパッチの概要を示す説明図である。CPUに割り当てられたスレッドは、ディスパッチスケジューラ204によって周期的に実行される。図6の例では、図2で示したように、CPU#0は実行中のスレッド数M0=3となり、具体的にはスレッド211、スレッド221、スレッド222を実行している。CPU#1は、実行中のスレッド数M1=4となり、スレッド212、スレッド223〜スレッド225を実行している。また、スレッド211とスレッド212は、共用リソース201にアクセスする。スレッド221〜スレッド225は、OS管轄下のシステムスレッドや共用リソースの競合に関係のないスレッドである。
また、ディスパッチスケジューラ204は、各スレッドを時分割でCPUに割り当てる。その際の1単位となる時間をディスパッチ時間τとし、図6の例では、CPU#0のディスパッチ時間τ#0とCPU#1のディスパッチ時間τ#1とは、τ#0=τ#1=τとする。また、各スレッドが何単位目でCPUに割り当てられるかを示すインターバルをTとする。インターバルTは、優先度が高いほどより頻繁にCPUに割り当てられるようになるため、値が小さくなる。このように、インターバルTは、優先度の逆数の関係となる。図6の例では、スレッド211のインターバルT211=3となり、スレッド212のインターバルT212=4となる。
ここで、運用時におけるマルチコアプロセッサシステム100の例では、スレッド数M=50〜100程度のスレッドを実行している。また、ディスパッチスケジューラ204は、OSなどで設定されるディスパッチ時間τ=1〜100[マイクロ秒]でスレッドを割り当てている。ディスパッチ時間が数マイクロ秒である場合、マルチコアプロセッサシステム100はリアルタイムシステムと呼ばれる。
たとえば、マルチコアプロセッサシステム100の各コアのクロック数が全て等しく、優先度が最低であるスレッドのインターバルT=スレッド数M=50であり、ディスパッチ時間τ=50[マイクロ秒]である場合を想定する。この場合、優先度が最低であるスレッドは、2500[マイクロ秒]に一度、50[マイクロ秒]間実行する。また、優先度が最高であるスレッドは、T=2であり、50[マイクロ秒]ごとに50[マイクロ秒]間実行される。
スレッドのインターバルTとディスパッチ時間τを乗算することで、図3で説明したスレッドがディスパッチされるディスパッチ周期を算出することができる。前述の例では、優先度が最低であるスレッドのディスパッチ周期は50×50=2500[マイクロ秒]となり、優先度が最高であるスレッドのディスパッチ周期は2×50=100[マイクロ秒]となる。
図6の例では、スレッド211は、ディスパッチスケジューラ204#0によって、時刻t0、時刻t3、時刻t6、時刻t9、時刻t12にτ#0時間分CPU#0で実行される。また、スレッド212は、ディスパッチスケジューラ204#1によって、時刻t0、時刻t4、時刻t8、時刻t12にτ#1時間分CPU#1で実行される。
ここで、CPU#0は、スレッド211のディスパッチ周期T211・τ#0とディスパッチ周期T212・τ#1の最小公倍数LCM(T211・τ#0、T212・τ#1)=12τを算出する。時刻t0に算出された値である12τを加算した時刻t12にて、スレッド211とスレッド212が実行されることで、共用リソース201に対するアクセス競合が発生することになる。また、時刻t12にさらにLCM(T211τ#0、T212τ#1)を加算した時刻でもアクセス競合が発生する。このように、図6の例では、LCM(T211・τ#0、T212・τ#1)を1周期とする競合周期にて、アクセス競合が発生することになる。
図6の例を一般化すると、マルチコアプロセッサシステム100にて、同一のリソースにアクセスする2つのスレッドのインターバルTx、Tyと、2つのスレッドが割り当てられるCPU#m、CPU#nのディスパッチ時間τm、τnを想定する。このとき、LCM(Txτm、Tyτn)を求めることで、マルチコアプロセッサシステム100は、アクセス競合が発生する競合周期を算出することができる。
図7は、ディスパッチの順序を入れ替える方法の概要を示す説明図である。図7では、図6にて競合周期を算出した際に、アクセス競合を回避する方法として、ディスパッチの順序を入れ替える方法を図示している。符号701に示す説明図は、アクセス競合に関係のないスレッドが実行している場合のディスパッチデータ704の状態を示している。符号702に示す説明図は、符号701の状態から、アクセス競合を発生させるスレッドが実行された場合のディスパッチデータ704の状態を示している。符号703に示す説明図は、符号702の状態から、アクセス競合を発生させるスレッドのディスパッチの順序を変更した場合のディスパッチデータ704の状態を示している。
符号701に示す説明図は、アクセス競合に関係のないスレッドの実行中の状態として、スレッド221とスレッド222が実行している場合のディスパッチデータ704の状態を示している。ディスパッチデータ704は、ディスパッチスケジューラ204によってアクセスされ、実行中のスレッドへのポインタを格納している。
ディスパッチデータ704の構造は、実行中の各スレッドが単方向に連結された単方向リストとなる。具体的には、ディスパッチデータ704の各要素は、データ部とポインタ部で成り立ち、データ部には、スレッドコンテキストへのポインタが格納され、ポインタ部には、次の要素へのポインタが格納されている。また、最後の要素のポインタ部には先頭の要素のポインタが格納されている。
たとえば、符号701に示す説明図におけるディスパッチデータ704は、要素705と要素706で成り立っている。要素705は、データ部にスレッド221のコンテキストへのポインタが格納されており、ポインタ部に要素706へのポインタが格納されている。また、要素706は、データ部にスレッド222のコンテキストへのポインタが格納されており、ポインタ部に要素705へのポインタが格納されている。
たとえば、CPU#0にてスレッド221が実行中で、次のスレッドを割り当てる場合を想定する。ディスパッチスケジューラ204#0は、現在実行中のスレッドの要素へのポインタを保持しており、保持していたポインタから、要素705を取得する。続けて、ディスパッチスケジューラ204#0は、要素705のポインタ部から要素706を取得する。符号701に示す説明図の状態におけるCPU#0は、スレッド221→スレッド222→スレッド221→…という順序でスレッドを実行する。
符号702に示す説明図は、符号701の状態から、アクセス競合を発生させるスレッドが実行された場合として、スレッド211が新たにCPU#0に割り当てられた場合のディスパッチデータ704の状態を示している。スレッド222の次にスレッド211が割り当てられるようにする場合、ディスパッチスケジューラ204#0は、初めに、ディスパッチデータ704の内部に要素707を確保し、要素707のデータ部にスレッド211のコンテキストへのポインタを格納する。
また、ポインタ部の操作として、ディスパッチスケジューラ204#0は、要素706のポインタ部に格納されていた要素705へのポインタを消去し、要素707へのポインタとして付け替える。さらに、ディスパッチスケジューラ204#0は、要素707のポインタ部に要素705へのポインタを設定する。これにより、符号702に示す説明図の状態におけるCPU#0は、スレッド221→スレッド222→スレッド211→スレッド221→スレッド222→…という順序でスレッドを実行する。
符号703に示す説明図は、符号702の状態から、アクセス競合を発生させるスレッドのディスパッチの順序を変更した場合として、スレッド211とスレッド221の割り当ての順序を入れ替えた場合のディスパッチデータ704の状態を示している。また、入れ替えを行うタイミングとしては、符号702の状態にて、CPU#0がスレッド221→スレッド222まで割り当てた状態で、スレッド211を割り当てようとするタイミングとする。
スレッド222の割り当て後、スレッド211の代わりにスレッド221を割り当てるため、ディスパッチスケジューラ204#0は、要素706のポインタ部を、要素707へのポインタから要素705へのポインタへ付け替える。また、スレッド221の割り当て後、スレッド211を割り当てるため、ディスパッチスケジューラ204#0は、要素705のポインタ部を、要素706へのポインタから要素707へのポインタへ付け替える。また、スレッド211の割り当て後、スレッド222を割り当てるため、ディスパッチスケジューラ204#0は、要素707のポインタ部を、要素705へのポインタから要素706へのポインタへ付け替える。
これにより、符号703に示す説明図の状態におけるCPU#0は、スレッド221→スレッド222、ここで入れ替えが発生し、スレッド221→スレッド211→スレッド222→…という順序でスレッドを実行する。なお、図7の例では、ディスパッチスケジューラ204#0は、時系列で隣あった2つのスレッドの割り当ての順序を入れ替えたが、4つ以上スレッドが実行されている場合に、時系列で離れたスレッドの割り当ての順序を入れ替えてもよい。
図8は、スレッド制御処理を行ったタイムチャートを示す説明図である。図8では、図6で示したタイミングでアクセス競合が発生する場合に、図7で示したディスパッチの時順序を入れ替えた場合のタイムチャートを示している。また、図8と後述する図9において、説明の簡略化のため、ディスパッチ時間τは全て等しく、時刻t0、時刻1、・・・、時刻tnの各時間間隔もτとする。
時刻t0にて、CPU#0は、共用リソースアクセス情報データベース301から、スレッド211とスレッド212が共用リソース201にアクセスすることを検出すると、競合周期を算出し、競合周期にマーキングを設定する。図8の例では、CPU#0は、時刻t12にマーキング801を設定する。具体的な設定方法としては、ディスパッチスケジューラ204#0の変数となるカウンタを確保し、カウンタに12を設定する。CPU#0は、設定されたカウンタ分スレッドを割り当てた時に、マーキングを設定した時刻であると判断してもよい。
また、マーキング801を設定するCPUは、アクセス競合を発生させるスレッドを割り当てるCPUのうち、どのCPUであってもよい。たとえば、CPU#0は、CPU番号の小さいCPUとなるCPU#0にマーキング801を設定してもよい。また、同時刻に3つ以上のスレッドがアクセス競合を発生させると検出された場合、検出されたスレッドを割り当てるCPUのうち、任意の1つのCPUを除いた他のCPUにマーキング801を設定してもよい。たとえば、CPU#0〜CPU#2にてアクセス競合を発生させるスレッドが実行される場合、CPU#0は、CPU#0とCPU#1にマーキングを設定してもよい。
マーキング801が設定されたあと、CPU#0は、スレッドの実行タイミングを揃えるために、バリア同期機構205#0とバリア同期機構205#1によって、CPU#0とCPU#1にバリア同期を実行させる。
マーキング801が設定された時刻である時刻t12になった場合、CPU#0は、スレッド211が割り当てられる時刻とスレッド221が割り当てられる時刻を入れ替える。具体的には、CPU#0は、スレッド211が割り当てられる時刻を時刻t12から時刻t13にし、スレッド221が割り当てられる時刻を時刻t13から時刻t12にする。また、CPU#0は、スレッド221の割り当て終了時刻となる時刻t13にて、CPU0とCPU#1にバリア同期を実行する。これにより、次の競合周期でも、実行タイミングを揃えることができる。また、時刻t13にてバリア同期を行うことで、CPU#1によるスレッド212の割り当てが完了するまで、CPU#0がスレッド211を割り当てることはないため、アクセス競合を回避することができる。
また、CPU#2は、共用リソース202にアクセスするスレッド213を時刻t7、時刻t10、時刻t13で実行し、CPU#3は、共用リソース202にアクセスするスレッド214を時刻t8、時刻t11で実行する。インターバルT213=インターバルT214=3となり、スレッドを実行する周期が一致しており、起動するタイミングが異なる場合には、アクセス競合が発生しないため、マーキングを行わない。
図9は、新たにスレッドを起動した際のタイムチャートを示す説明図である。図8では、時刻t0におけるスレッド211とスレッド212のように、起動タイミングが揃っていた場合の競合周期を算出した。図9では、特定の共用リソースにアクセスするスレッドがCPUに既に割り当てられている場合に、他のCPUに同じ共用リソースにアクセスするスレッドが割り当てられた場合における初回のアクセス競合が発生するまでのオフセット時間について説明を行う。
図9におけるマルチコアプロセッサシステム100は、図2で示したソフトウェアの実行状態とは異なる。具体的には、CPU#0は、時刻t3まではスレッド数M0=2であり、さらに時刻t4にて、新たなスレッドとして共用リソース201にアクセスするスレッド901を割り当て、M0=3となっている。また、スレッド901のインターバルT901は3となり、スレッド901は、時刻t4の後、時刻t7、時刻t10、時刻t13にて割り当てられる。
CPU#1は、スレッド数M1=5であり、共用リソース201にアクセスするスレッド902を時刻t3にて割り当てている。また、スレッド902のインターバルT902は5であり、時刻t3の後、時刻t8、時刻t13にて割り当てられる。
CPU#2は、時刻t0ではスレッド数M2=3であり、さらにスレッド904とスレッド905の優先度が高い状態であり、時刻t1にて、新たなスレッドとして共用リソース202にアクセスするスレッド903を割り当て、M2=4となっている。また、スレッド903のインターバルT903は6となり、時刻t1の後、時刻t7、時刻t13にて割り当てられる。
CPU#3は、スレッド数M3=4であり、共用リソース202にアクセスするスレッド906を時刻t0にて割り当てている。また、スレッド906のインターバルT906は4であり、時刻t0の後、時刻t4、時刻t8、時刻t12にて割り当てられる。
以下、図9の示すタイムチャートを利用して、CPU#0による共用リソース201にアクセスするスレッド901とスレッド902による競合周期の算出方法を説明する。続けて、CPU#2による共用リソース202にアクセスするスレッド903とスレッド906による競合周期の算出方法を説明する。
初めに、CPU#0は、スレッド901が割り当て開始した時刻から、アクセス競合を発生させる他のスレッドが最後に割り当てられるまでの時間tを取得する。図9の例では、スレッド902が最後に割り当てられた時刻はt3であるため、CPU#0は、時刻t4からスレッド902が最後に割り当てられるまでの時間t902=−τを取得する。
次に、αとβを非負整数とし、時刻t4を基準とした際のアクセス競合が発生する時刻は、下記(1)式を満たすことになる。
アクセス競合の時刻=T901・τ・α=T902・τ・β+t902…(1)
(1)式の最小のα、βの組合せを求めることで、アクセス競合を発生する時刻を算出することができる。(1)式は、合同方程式で表現でき、下記(2)式となる。
T902・τ・β≡−t902(mod T901・τ)…(2)
式(2)に、CPU#0は、T901=3、T902=5、t902=−τを設定し、τで除算することで、下記(3)式を得る。
5β≡1(mod 3)…(3)
一次合同式となる(3)式はたとえば、以下のように解くことができる。(3)式において、5−3=2であるため、CPU#0は、下記(4)式を得る。
2β≡1(mod 3)…(4)
合同式の性質に従って、(4)式を2倍することで、CPU#0は、下記(5)式を得る。
4β≡2(mod 3)…(5)
(4)式から(5)式を減じることで、CPU#0は、(6)式を得る。
β≡−1(mod 3)…(6)
(6)式より、β=3N−1(N=0、1、2、3、4、…)となるが、βは非負整数であるため、最小のβ=2となり、対応するαを(1)式から算出すると、α=3となる。したがって、アクセス競合の時刻は、時刻t4に、9τを加算した時刻t13となる。また、次のアクセス競合の時刻については、時刻t13から、LCM(T901・τ、T902・τ)を加算した時刻となる。
なお、(3)式の解法は多く知られており、たとえば、CPU#0は、ガウスの計算法によって算出してもよい。また、別の解法として、CPU#0は、逆元を算出してβを算出してもよい。具体的には、3を法とする5の逆元2を求め、(3)式の両辺に逆元2を乗算することで、解を算出する。逆元の算出方法としては、たとえば、拡張ユークリッドの互除法によって、算出することができる。
次に、CPU#2による共用リソース202にアクセスするスレッド903とスレッド906による競合周期の算出方法を説明する。CPU#2は、スレッド903が割り当て開始した時刻から、アクセス競合を発生させる他のスレッドが最後に割り当てられるまでの時間tを取得する。図9の例では、スレッド906が最後に割り当てられた時刻はt0であるため、CPU#0は、時刻t1からスレッド902が最後に割り当てられるまでの時間t906=−τを取得する。
アクセス競合が発生する時刻は、(1)式を適用することで、CPU#2は、下記(7)式を得る。
アクセス競合の時刻=T903・τ・α=T906・τ・β+t906…(7)
(7)式に対して、(2)式、(3)式で行った手順を行うことで、CPU#2は、下記(8)式を得る。
4β≡1(mod 6)…(8)
一次合同式となる(8)式はβについて解を持たない。もしβが解を持つ場合、合同式の定義より、4β−1は6の倍数となり偶数となるが、4βが偶数であるため、4β−1は奇数となり、矛盾するからである。解を持たない場合、アクセス競合が発生しないということになるため、CPU#0は、マーキングを行わない。
また、一次合同式ax≡b(mod m)の解xが存在するか否かは、aとmの最大公約数GCD(a、m)がbを割り切れるという条件と同値である。たとえば、(3)式の例では、a=5、b=1、m=3から、GCD(5、3)=1となり、b=1を割り切れるため、解が存在する。(8)式の例では、a=4、b=1、m=6からGCD(4、6)=2となり、b=1を割り切れないため、解を持たない。このように、CPU#0は、(1)式から、各変数を代入し、(3)式、(8)式のような一次合同式を得た状態で、前述の解を持つか否かを前述の条件で判断することで、アクセス競合が発生するか否かを判断してもよい。
図8、図9にて示すタイムチャートを実現するため、マルチコアプロセッサシステム100は、図10〜図13に示すスレッド制御処理を実行し、アクセス競合を回避する。図10では、スレッドが新たに割り当てられた場合のスレッド制御処理のフローチャートを示し、図11、図12では、スレッド制御処理内部で実行される競合周期算出処理のフローチャートを示している。図13では、マルチコアプロセッサシステム100のディスパッチ時間τまたはインターバルTが変更した場合のスレッド制御処理を示すフローチャートを示している。
図13に示すスレッド制御処理が適用される場合は、たとえば、特定のCPUのディスパッチ時間τが変更され、全てのスレッドに対する競合周期の再計算を要する場合に適用される。ディスパッチ時間τが変更される場合は、たとえば、実行中のスレッドの優先度がOS、またはスレッド自身によって変更された場合である。
図10は、スレッド制御処理を示すフローチャートである。CPU#0は、ユーザからの操作などにより、スレッドの起動要求を受け付ける(ステップS1001)。受け付け後、CPU#0は、ディスパッチスケジューラ204#0によってスレッドを起動するCPUを決定し(ステップS1002)、決定されたCPUにスレッド情報を通知する。図10の例では、m番目のCPUとして、CPU#mにてスレッドを起動すると想定する。
また、スレッドを起動するCPUの決定後、CPU#0は、共用リソースアクセス情報データベース301を更新し(ステップS1003)、CPU#0におけるスレッド制御処理を終了する。共用リソースアクセス情報データベース301の更新例としては、CPU#0は、共用リソースアクセス情報データベース301のCPUフィールドに、スレッドを起動するCPUのCPU番号を設定する。
スレッド情報の通知を受けたCPU#mは、起動するスレッドの実行コードをRAM103にロードする(ステップS1004)。ロード後、CPU#mは、競合周期算出処理を実行する(ステップS1005)。処理を実行後、CPU#mは、起動するスレッドをディスパッチデータ704に登録する(ステップS1006)。登録後、CPU#mは、競合周期算出処理の結果から、起動するスレッドが共用リソースに対するアクセス競合を発生させるか否かを判断する(ステップS1007)。
アクセス競合を発生させる場合(ステップS1007:Yes)、CPU#mは、競合周期のマーキングを、アクセス競合を発生させるスレッドを実行するCPUに通知する(ステップS1008)。なお、アクセス競合を発生させるスレッドを実行するCPUは、少なくとも2つ以上存在するため、CPU#mは、そのうち任意の1つのCPUを除いたCPUにマーキングを通知する。図10の例では、n番目のCPUとして、CPU#nにマーキングを通知すると想定する。
たとえば、起動するスレッドを実行するCPU#mがCPU#0であり、アクセス競合を発生させるスレッドを実行するCPUが、CPU#0とCPU#1であった場合、CPU#0とCPU#1のいずれか一つをCPU#nとし、マーキングを通知する。また、アクセス競合を発生させるスレッドを実行するCPUが、CPU#0〜CPU#2であれば、CPU#0は、たとえば、CPU#0とCPU#1に、マーキングを通知してもよい。
マーキングの通知後、CPU#mは、バリア同期機構205によってバリア同期を実行する(ステップS1009)。なお、バリア同期は、アクセス競合を発生させるスレッドを実行するCPU全てに対して発行される。起動するスレッドがアクセス競合を発生させない場合(ステップS1007:No)、または、ステップS1009の処理を終了後、CPU#mは、起動するスレッドを実行し(ステップS1010)、CPU#mにおけるスレッド制御処理を終了する。
マーキングの通知を受けたCPU#nは、スレッドをディスパッチする際に、マーキングされたタイミングか否かを判断する(ステップS1011)。マーキングされたタイミングである場合(ステップS1011:Yes)、CPU#nは、ディスパッチの順序を後方のスレッドと入れ替える(ステップS1012)。入れ替え後、CPU#nは、後方だったスレッド実行後、バリア同期を実行する(ステップS1013)。ステップS1013の処理を終了後、または、マーキングされたタイミングでない場合(ステップS1011:No)、CPU#nは、CPU#mにおけるスレッド制御処理を終了する。
なお、ステップS1012にて、CPU#nは、ディスパッチの順序を後方のスレッドと入れ替えているが、ディスパッチ時間が1単位以上離れているスレッドと入れ替えてもよい。特に、ディスパッチ時間が1単位以上離れているスレッドとの入れ替えは、ステップS1008にて、アクセス競合を発生させるスレッドを実行するCPUが3つ以上存在し、マーキングを2つ以上のCPUに通知した場合に有効である。このとき、通知を受けたCPUのうち、1番目のCPUは、すぐ後方のスレッドと入れ替え、2番目のCPUは、ディスパッチ時間が1単位離れているスレッドと入れ替える。
アクセス競合を発生させるスレッドを実行するCPUが3つあり、通知された2つのCPUが後方のスレッドで入れ替えを行うと、競合周期にディスパッチ時間を加えた時刻にてアクセス競合が発生する。しかし、ディスパッチ時間が1単位離れているスレッドと入れ替えることで、競合周期の時刻、競合周期にディスパッチ時間を加えた時刻、競合周期にディスパッチ時間を2単位分加えた時刻の全てにおいて、共用リソースへのアクセス競合を回避できる。
また、図10のフローチャートでは、CPU#nは、後方のスレッドと入れ替えを行っていたが、前方のスレッドと入れ替えを行ってもよい。前方のスレッドと入れ替えを行う場合、たとえば、ステップS1011にて、CPU#nは、マーキングされたタイミングよりディスパッチ時間が1単位早い時刻かを判断する。1単位早い時刻である場合に、CPU#nは、これから割り当てを行うスレッドの割り当て時刻と、1単位後に割り当てるアクセス競合を発生させるスレッドの割り当て時刻と、を入れ替えることで、前方のスレッドと入れ替えを行うことができる。
図11は、競合周期算出処理を示すフローチャートである。競合周期算出処理は、起動するスレッドを実行するCPUで実行される。図11の説明では、図10の説明に合わせるため、CPU#mが競合周期算出処理を実行するとして説明を行う。
CPU#mは、起動するスレッドをTHxとして設定し(ステップS1101)、変数iに1を設定する(ステップS1102)。設定後、CPU#mは、マルチコアプロセッサシステム100で実行中のスレッドのうち、i番目のスレッドTHiが存在するかを判断する(ステップS1103)。スレッドTHiが存在する場合(ステップS1103:Yes)、CPU#mは、スレッドTHxとスレッドTHiが同一の共用リソースにアクセスするかを判断する(ステップS1104)。同一の共用リソースにアクセスする場合(ステップS1104:Yes)、CPU#mは、スレッドTHxとスレッドTHiが同一CPUで実行されるかを判断する(ステップS1105)。
スレッドTHxとスレッドTHiが同一CPUで実行される場合(ステップS1105:Yes)、CPU#mは、LCM(Txτx、Tiτi)を算出し、競合周期に設定する(ステップS1106)。なお、Tx、τxは、スレッドTHxのインターバルTxとディスパッチ時間τxを意味し、Ti、τiは、スレッドTHiのインターバルTiとディスパッチ時間τiを意味する。競合周期を設定後、CPU#mは、スレッドTHx、スレッドTHiを、アクセス競合を発生させるスレッドに設定し(ステップS1107)、変数iをインクリメントし(ステップS1108)、ステップS1103の処理に移行する。
同一の共用リソースにアクセスしない場合(ステップS1104:No)、または、同一CPUで実行されない場合(ステップS1105:No)、CPU#mは、ステップS1108の処理に移行する。全てのスレッドについて探索し、スレッドTHiが存在しない場合(ステップS1103:No)、CPU#mは、競合周期算出処理を終了する。
図12は、スレッドの起動タイミングが異なる場合、初回の競合周期までのオフセット時間と競合周期を算出する競合周期算出処理を示すフローチャートである。競合周期算出処理は、起動するスレッドを実行するCPUで実行される。図12の説明でも、図11と同様に、図10の説明に合わせるため、CPU#mが競合周期算出処理を実行するとして説明を行う。また、図12内のステップS1201〜ステップS1205とステップS1211とステップS1212は、それぞれステップS1101〜ステップS1105とステップS1107とステップS1108と等しい処理を行うため、説明を省略する。
CPU#mは、スレッドTHxが起動する時刻から、THiが最後に割り当てられるまでの時間tiを取得する(ステップS1206)。取得後、CPU#mは、βTiτi≡−ti(mod Txτx)となる一次合同式にて、非負整数となるβについて解が存在するかを判断する(ステップS1207)。なお、一次合同式の解が存在するか否かの判断方法は、図9に記載した方法で判断してもよい。
解が存在する場合(ステップS1207:Yes)、CPU#mは、βTiτi≡−ti(mod Txτx)から、Txτxを法とするTiτiの逆元aを算出する(ステップS1208)。算出後、β≡−a・ti(mod Txτx)、かつβが非負整数となる最小のβを算出する(ステップS1209)。なお、ステップS1208、ステップS1209による一次合同式の解法について、CPU#mは、図9で記載したガウスの計算法によって算出してもよい。
βを算出後、CPU#mは、βTiτi+tiを初回の競合タイミングまでのオフセット時間として設定し、LCM(Txτx、Tiτi)を競合周期として設定し(ステップS1210)、ステップS1211の処理に移行する。また、一次合同式の解が存在しない場合(ステップS1207:No)、CPU#mは、ステップS1212の処理に移行する。
図13は、マルチコアプロセッサシステム100のディスパッチ時間またはインターバルが変更した場合のスレッド制御処理を示すフローチャートである。図13で示すスレッド制御処理は、どのCPUでも実行可能であるが、説明の簡略化のため、CPU#0で実行される場合を想定する。
CPU#0は、変数jに1を設定し(ステップS1301)、CPU#0は、マルチコアプロセッサシステム100で実行中のスレッドのうち、スレッドTHjが存在するかを判断する(ステップS1302)。スレッドTHjが存在する場合(ステップS1302:Yes)、CPU#0は、スレッドTHjを対象のスレッドとなるTHxとして設定する(ステップS1303)。設定後、CPU#0は、競合周期算出処理の内部で使用される変数iにj+1を設定して、競合周期算出処理を実行する(ステップS1304)。
具体的には、CPU#0は、たとえば図11にて、ステップS1101の処理で設定したTHxについて、ステップS1303の処理で設定したj番目のスレッドを設定する。また、CPU#0は、ステップS1102の処理で設定した変数iについて、j+1を設定し、競合周期算出処理を実行する。図12で示した競合周期算出処理も同様である。
競合周期算出処理の実行後、CPU#0は、スレッドTHxが共用リソースに対するアクセス競合を発生させるかを判断する(ステップS1305)。アクセス競合を発生させる場合(ステップS1305:Yes)、CPU#0は、競合周期のマーキングを、アクセス競合を発生させるスレッドを実行するCPUに通知する(ステップS1306)。マーキングの通知後、CPU#0は、バリア同期機構205によってバリア同期を実行する(ステップS1307)。なお、バリア同期は、アクセス競合を発生させるスレッドを実行するCPU全てに対して発行される。
バリア同期を実行後、または、アクセス競合が発生しない場合(ステップS1305:No)、CPU#0は、変数jをインクリメントし(ステップS1308)、ステップS1302の処理に移行する。全てのスレッドについて探索し、スレッドTHjが存在しない場合(ステップS1302:No)、CPU#0は、スレッド制御処理を終了する。
なお、図13に示すスレッド制御処理では、複数回の最小公倍数の計算を行うことになる。具体的には、マルチコアプロセッサシステム100にて、共用リソースにアクセスするスレッドがN個あり、スレッドTHn(n=1、2、・・・、N)のインターバルTn、ディスパッチ時間τn、ディスパッチ周期Tnτnと想定する。スレッドTH1のアクセス競合の算出対象となるスレッド数はN−1個となる。具体的には、CPU#0は、スレッドTH1に対するアクセス競合としてLCM(TH1・τ1、TH2・τ2)、LCM(TH1・τ1、TH3・τ3)、・・・、LCM(TH1・τ1、THN・τN)を算出する。ただし、TH1と同一のCPUで実行されるスレッドは算出対象に含まれない。
同様に、スレッドTH1のアクセス競合の算出対象となるスレッド数はN−2個となる。具体的には、CPU#0は、スレッドTH2に対するアクセス競合としてLCM(TH2・τ2、TH3・τ3)、LCM(TH2・τ2、TH4・τ4)、・・・、LCM(TH2・τ2、THN・τN)を算出する。CPU#0は、前述のように算出を続ける。このように、算出対象となるスレッド数は減少していき、スレッドTHNのアクセス競合の算出対象となるスレッド数は0個となる。
以上より、アクセス競合の算出回数は、Σn(n=1..N−1)=(1/2)・N・(N−1)回となる。たとえば、マルチコアプロセッサシステム100のスレッド数N=4である場合、算出回数は6回となる。図13に示すスレッド制御処理が発生する機会は、数秒に1回のため、図13に示すスレッド制御処理に伴うオーバーヘッドの増加は微小である。
以上説明したように、マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムによれば、2つのコアで周期的に実行され、共用リソースに対してアクセス競合する2つのスレッドの周期から競合周期を算出する。競合周期にて、マルチコアプロセッサシステムは、片方のスレッドの割り当て時刻を、片方のスレッドの前後のスレッドの割り当て時刻と入れ替える。これにより、マルチコアプロセッサシステムは、共用リソースへのアクセス時刻をずらすためアクセス競合を回避でき、アクセス競合させる2つのスレッドを実行できるため、処理性能を維持することができる。
また、競合周期の算出方法としては、たとえば、2つのスレッドのディスパッチ周期を乗算して算出してもよい。これにより、マルチコアプロセッサシステムは、大きな負荷をかけることなく競合周期を算出することができる。また、2つのスレッドのディスパッチ周期が互いに素であれば、競合するタイミングを全て算出することができる。
また、マルチコアプロセッサシステムは、競合周期を2つのスレッドのディスパッチ周期の公倍数によって算出してもよい。これにより、マルチコアプロセッサシステムは、2つのスレッドの競合するタイミングを全て算出でき、全てのアクセス競合を回避しつつ、処理性能を維持することができる。
また、マルチコアプロセッサシステムは、2つのスレッドのうち第1のスレッドが割り当てられる時刻からみて、第2のスレッドが最後に割り当てられた時刻と、第1および第2のスレッドのディスパッチ周期から、競合周期までのオフセット時間を算出してもよい。これにより、マルチコアプロセッサシステムは、2つのスレッドの割り当てを開始する時刻が異なる場合でも、初回のアクセス競合が発生するタイミングを算出でき、アクセス競合を回避しつつ、処理性能を維持することができる。
また、マルチコアプロセッサシステムは、アクセス競合が発生する2つのコアにて、任意のスレッドの割り当てを開始する時刻を同一の時刻に設定してもよい。通常、2つのコアでスレッドが割り当てられる場合、割り当てられる時刻はコア間で同一でない。したがって、マルチコアプロセッサシステムが競合周期を算出しても、スレッドを割り当てられる時刻がコアによって異なり、アクセス競合を発生させてしまう場合も存在する。
具体的には、第1および第2のコアのディスパッチ時間を50[マイクロ秒]とし、第2のコアのスレッド割り当て時刻が第1のコアのスレッド割り当て時刻より2[マイクロ秒]遅い場合を想定する。競合周期が250[マイクロ秒]と算出された場合、第1のスレッドは250〜300[マイクロ秒]、第2のスレッドは252〜302[マイクロ秒]で割り当てられることになる。もし、第1のスレッドが後方のスレッドと入れ替わり、300〜350[マイクロ秒]で割り当てられた場合、252〜300[マイクロ秒]のアクセス競合は回避できたが、300〜302[マイクロ秒]のアクセス競合は回避できていない状態になる。
前述の状態を避けるため、バリア同期等により、スレッドの割り当てを開始する時刻を同一の時刻に設定することで、マルチコアプロセッサシステムは、アクセス競合を回避しつつ、処理性能を維持することができる。
また、本実施の形態におけるマルチコアプロセッサシステムは、キューイングやスレッドの実行抑止といった実行制限を行わないため、制限を受けるスレッド側は、性能劣化せず、処理性能を維持することができる。
また、本実施の形態におけるマルチコアプロセッサシステムは、特別なハードウェア機構は不要だが、共用リソースのための特別なハードウェア機構が搭載されたマルチコアプロセッサシステムに対して、本実施の形態を適用しても効果をあげることができる。
たとえば、共用リソースの運用方式として、キューイング方式2が適用されたマルチコアプロセッサシステムに本実施の形態を適用する場合を想定する。キューイング方式2に本実施の形態が適用されたマルチコアプロセッサシステムの場合、調停回路にアクセス要求が蓄積することがないため、調停回路への電力を切断しても、マルチコアプロセッサシステムは正常に動作することができる。このように、本実施の形態を適用することにより不要となるハードウェア機構の電源を切断でき、消費電力を低下させることができる。
なお、本実施の形態で説明したスレッド制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本スレッド制御プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本スレッド制御プログラムは、インターネット等のネットワークを介して配布してもよい。
#0、#1 CPU
103 RAM
110 バス
201 共用リソース
211、212、221、222、223、225 スレッド
301 共用リソースアクセス情報データベース
302 検出部
303 算出部
304 選択部
305 入替部
306、307 設定部

Claims (6)

  1. 複数のコアのうち第1のコアに割り当てられる第1のスレッドと、前記複数のコアのうち前記第1のコアとは異なる第2のコアに割り当てられる第2のスレッドと、が同一のリソースにアクセスする状態を検出する検出手段と、
    前記検出手段によって前記状態が検出された場合、前記第1のスレッドが前記第1のコアに割り当てられる第1の周期と前記第2のスレッドが前記第2のコアに割り当てられる第2の周期とに基づいて、前記第1および第2のスレッドが前記リソースに対するアクセス競合を発生させる競合周期を算出する算出手段と、
    前記算出手段によって算出された前記競合周期にて割り当てられる前記第1および第2のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける前記競合周期の前後いずれかの時刻に割り当てられるスレッドを選択する選択手段と、
    前記いずれか一方のスレッドが割り当てられる時刻と、前記選択手段によって選択されたスレッドが割り当てられる時刻と、を入れ替える入替手段と、
    を備えることを特徴とするマルチコアプロセッサシステム。
  2. 前記算出手段は、
    前記検出手段によって前記状態が検出された場合、前記第1および第2の周期の公倍数を求めることにより、前記競合周期を算出することを特徴とする請求項1に記載のマルチコアプロセッサシステム。
  3. 前記算出手段は、
    前記検出手段によって前記状態が検出された場合、前記第1のコアに前記第1のスレッドが割り当てられる時刻より前で前記第2のスレッドが前記第2のコアに最後に割り当てられた時刻と前記第1および第2の周期とから、前記競合周期として前記第1のスレッドが割り当てられる時刻以降で最初の前記アクセス競合が発生する時刻を算出することを特徴とする請求項1に記載のマルチコアプロセッサシステム。
  4. 前記算出手段によって前記競合周期が算出された場合、前記第1および第2のコアに割り当てられる任意のスレッドの割り当てを開始する時刻を同一の時刻に設定する設定手段をさらに備え、
    前記選択手段は、
    前記設定手段によって前記任意のスレッドの割り当てを開始する時刻が前記同一の時刻に設定された場合、前記競合周期にて割り当てられる前記第1および第2のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける前記競合周期の前後いずれかの時刻に割り当てられるスレッドを選択することを特徴とする請求項1に記載のマルチコアプロセッサシステム。
  5. 複数のコアのうち第1のコアに割り当てられる第1のスレッドと、前記複数のコアのうち前記第1のコアとは異なる第2のコアに割り当てられる第2のスレッドと、が同一のリソースにアクセスする状態を検出する検出工程と、
    前記検出工程によって前記状態が検出された場合、前記第1のスレッドが前記第1のコアに割り当てられる第1の周期と前記第2のスレッドが前記第2のコアに割り当てられる第2の周期とに基づいて、前記第1および第2のスレッドが前記リソースに対するアクセス競合を発生させる競合周期を算出する算出工程と、
    前記算出工程によって算出された前記競合周期にて割り当てられる前記第1および第2のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける前記競合周期の前後いずれかの時刻に割り当てられるスレッドを選択する選択工程と、
    前記いずれか一方のスレッドが割り当てられる時刻と、前記選択工程によって選択されたスレッドが割り当てられる時刻と、を入れ替える指示を前記いずれか一方のスレッドが割り当てられるコアに通知する入替指示工程と、
    を前記第1のコアが実行することを特徴とするスレッド制御方法。
  6. 複数のコアのうち第1のコアに割り当てられる第1のスレッドと、前記複数のコアのうち前記第1のコアとは異なる第2のコアに割り当てられる第2のスレッドと、が同一のリソースにアクセスする状態を検出する検出工程と、
    前記検出工程によって前記状態が検出された場合、前記第1のスレッドが前記第1のコアに割り当てられる第1の周期と前記第2のスレッドが前記第2のコアに割り当てられる第2の周期とに基づいて、前記第1および第2のスレッドが前記リソースに対するアクセス競合を発生させる競合周期を算出する算出工程と、
    前記算出工程によって算出された前記競合周期にて割り当てられる前記第1および第2のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける前記競合周期の前後いずれかの時刻に割り当てられるスレッドを選択する選択工程と、
    前記いずれか一方のスレッドが割り当てられる時刻と、前記選択工程によって選択されたスレッドが割り当てられる時刻と、を入れ替える指示を前記いずれか一方のスレッドが割り当てられるコアに通知する入替指示工程と、
    を前記第1のコアに実行させることを特徴とするスレッド制御プログラム。
JP2012526257A 2010-07-30 2010-07-30 マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラム Expired - Fee Related JP5321748B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2010/062909 WO2012014313A1 (ja) 2010-07-30 2010-07-30 マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラム

Publications (2)

Publication Number Publication Date
JPWO2012014313A1 true JPWO2012014313A1 (ja) 2013-09-09
JP5321748B2 JP5321748B2 (ja) 2013-10-23

Family

ID=45529557

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012526257A Expired - Fee Related JP5321748B2 (ja) 2010-07-30 2010-07-30 マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラム

Country Status (3)

Country Link
US (1) US20130125131A1 (ja)
JP (1) JP5321748B2 (ja)
WO (1) WO2012014313A1 (ja)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPWO2015072494A1 (ja) * 2013-11-12 2017-03-16 扶桑薬品工業株式会社 新規二酢酸ナトリウム結晶及び該結晶を含有する固形透析用製剤
US10069674B2 (en) 2013-12-12 2018-09-04 International Business Machines Corporation Monitoring file system operations between a client computer and a file server
KR102177871B1 (ko) * 2013-12-20 2020-11-12 삼성전자주식회사 멀티 쓰레딩을 지원하기 위한 연산 유닛, 이를 포함하는 프로세서 및 프로세서의 동작 방법
JP6272556B2 (ja) 2015-04-02 2018-01-31 株式会社日立製作所 共有リソース更新装置及び共有リソース更新方法
CN109471588B (zh) * 2018-09-13 2021-08-10 北京米文动力科技有限公司 一种同步方法及设备
CN111949292B (zh) * 2020-07-30 2023-03-21 锐捷网络股份有限公司 一种热补丁装载方法、装置、电子设备及存储介质

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000148577A (ja) * 1998-11-09 2000-05-30 Fujitsu Ltd アクセス制御方法及びアクセス制御装置
JP2001312413A (ja) * 2000-05-01 2001-11-09 Fujitsu Ten Ltd アクセス競合時のリトライ制御方法および記録媒体
US20070074222A1 (en) * 2005-09-27 2007-03-29 Intel Corporation Thread scheduling apparatus, systems, and methods
JP4431126B2 (ja) * 2006-06-23 2010-03-10 キャッツ株式会社 タイミングチャート作成支援システム、タイミングチャート作成支援方法及びタイミングチャート作成支援プログラム
JP2009146379A (ja) * 2007-11-21 2009-07-02 Yokogawa Electric Corp Cpu資源管理システム
US20110055838A1 (en) * 2009-08-28 2011-03-03 Moyes William A Optimized thread scheduling via hardware performance monitoring
US8533719B2 (en) * 2010-04-05 2013-09-10 Oracle International Corporation Cache-aware thread scheduling in multi-threaded systems

Also Published As

Publication number Publication date
JP5321748B2 (ja) 2013-10-23
WO2012014313A1 (ja) 2012-02-02
US20130125131A1 (en) 2013-05-16

Similar Documents

Publication Publication Date Title
Harlap et al. Pipedream: Fast and efficient pipeline parallel dnn training
JP5321748B2 (ja) マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラム
JP5780243B2 (ja) スケジューリング方法、およびマルチコアプロセッサシステム
JP5725162B2 (ja) 排他制御方法、および排他制御プログラム
JP5040136B2 (ja) チューニング支援装置、チューニング支援プログラム、チューニング支援プログラムを記録したコンピュータ読み取り可能な記録媒体およびチューニング支援方法
EP1916601A2 (en) Multiprocessor system
JP5874811B2 (ja) 情報処理方法、プログラム、および情報処理装置
JPWO2012020478A1 (ja) スケジューラ、マルチコアプロセッサシステムおよびスケジューリング方法
JP5765423B2 (ja) マルチコアプロセッサシステム、およびスケジューリング方法
JP2008090546A (ja) マルチプロセッサシステム
US10579419B2 (en) Data analysis in storage system
JPWO2012001787A1 (ja) 情報処理装置、情報処理方法、および情報処理プログラム
JP6051721B2 (ja) 実行制御方法、およびマルチプロセッサシステム
JP5708450B2 (ja) マルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラム
JP5725040B2 (ja) マルチコアプロセッサシステム、およびスケジューリング方法
JP5737298B2 (ja) スケジューリング方法およびスケジューリングシステム
US9323642B2 (en) Calculation apparatus, calculation method, and recording medium for calculation program
Chen et al. Data prefetching and eviction mechanisms of in-memory storage systems based on scheduling for big data processing
JP5278538B2 (ja) コンパイルシステム、コンパイル方法およびコンパイルプログラム
JP5780296B2 (ja) スレッド処理方法、およびスレッド処理システム
JP5516737B2 (ja) プロセッサシステム、制御プログラム、および制御方法
Andersson et al. Satisfying real-time requirements of multicore software on ARINC 653: the issue of undocumented hardware
JP5376042B2 (ja) マルチコアプロセッサシステム、スレッド切り替え制御方法、およびスレッド切り替え制御プログラム
JP6524733B2 (ja) 並列演算装置、並列演算システム、およびジョブ制御プログラム
CN111782482B (zh) 接口压力测试方法及相关设备

Legal Events

Date Code Title Description
TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20130618

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130701

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees