(57)【要約】      （修正有）【課題】複数の演算装置を備えた情報処理装置で，特定の処理を指定された演算装置で確実に実行する。【解決手段】複数の演算装置を備えた情報処理装置で実行されるプログラムは，前記演算装置を所定の動作状態に移行する第1の処理を前記演算装置の各々に実行させ，指定された演算装置が前記所定の動作状態に移行した場合に，前記指定された演算装置に，前記第1の処理とは異なる第2の処理を実行させる。【選択図】図６
2014191771.tif 000002
【特許請求の範囲】
【請求項１】
複数の演算装置を備えた情報処理装置で実行されるプログラムであって，
前記演算装置を所定の動作状態に移行する第1の処理を前記演算装置の各々に実行させ，
指定された演算装置が前記所定の動作状態に移行した場合に，前記指定された演算装置に，前記第1の処理とは異なる第2の処理を実行させる
ことを特徴とするプログラム。
【請求項２】
請求項1において，
前記指定された演算装置が前記所定の動作状態に移行した場合に，さらに，前記複数の演算装置の中で前記指定された演算装置以外の演算装置に，前記第1の処理を終了させる処理を実行させる
ことを特徴とするプログラム。
【請求項３】
複数の演算装置を備え，
前記演算装置の各々は，前記演算装置を所定の動作状態に移行する第1の処理を実行し，
指定された演算装置は，前記所定の動作状態に移行した場合に，前記第1の処理とは異なる第2の処理を実行する
ことを特徴とする情報処理装置。
【請求項４】
請求項3において，
前記指定された演算装置が前記所定の動作状態に移行した場合に，前記複数の演算装置の中で，前記指定された演算装置以外の演算装置は，当該演算装置が実行する前記第1の処理を終了する
ことを特徴とする情報処理装置。
【請求項５】
複数の演算装置を備えた情報処理装置で実行される情報処理方法であって，
前記情報処理装置は，
前記演算装置を所定の動作状態に移行する第1の処理を前記演算装置の各々に実行させ，
指定された演算装置が前記所定の動作状態に移行した場合に，前記指定された演算装置に，前記第1の処理とは異なる第2の処理を実行させる
ことを特徴とする情報処理方法。
【請求項６】
請求項5において，
前記情報処理装置は，
前記指定された演算装置が前記所定の動作状態に移行した場合に，さらに，前記複数の演算装置の中で，前記指定された演算装置以外の演算装置に前記第1の処理を終了させる
ことを特徴とする情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，プログラム，情報処理装置，情報処理方法に関する。
【背景技術】
【０００２】
複数の演算装置を備えた情報処理装置が提案されている。かかる情報処理装置は，各種処理を複数の演算装置により同時に実行することで，処理の高速化を図る。かかる複数の演算装置を備えた情報処理装置として，例えば，複数のCPU(Central Processing Unit)を備えた情報処理装置や，複数のプロセッサコア(Processor Core)を1個のパッケージに集積したCPU(マルチコアCPUとも呼ぶ)を備えた情報処理装置が提案されている。以下，マルチコアCPUを備えた情報処理装置を例示して説明する。
【０００３】
さらに，処理の実行単位(タスクや，スレッドや，ジョブとも呼ばれる)を，プロッセッサコア(コアとも呼ぶ)に割り当て実行するシステムが提案されている(例えば，特許文献1参照)。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開第２０１０／０１０７２３号パンフレット
【発明の概要】
【発明が解決しようとする課題】
【０００５】
かかる情報処理装置は，基本ソフトウエアとも呼ばれるオペレーティングシステム（OS：Operating System）や，アプリケーションを実行する。OSは，システム開発者に提供するアプリケーションプログラミングインタフェース (API：Application Programming Interface)を有する。このようなAPIの一例として，複数のコアの中から指定されたコアのみで処理の実行単位(以下，スレッドと適宜記す)を実行させる(CPUバインドや，CPUアフィニティ制御とも呼ぶ)APIがある。かかるAPIをバインド用APIと適宜記す。
【０００６】
さて，OSのプログラムサイズを小さくすることがある。その理由としては，情報処理装置を小型化する場合，情報処理装置のCPUやメモリを物理的に小さくするからである。詳しくは，この小型化により，CPUの処理能力やメモリ容量が小さくなり，かかるCPUが実行するOSの動作が重くなる。そこで，かかる情報処理装置が実行するOSをコンパクト化し軽快に動作させるため，OSのプログラムサイズを小さくする。
【０００７】
OSのプログラムサイズを小さくするためには，例えば，APIの種類を少なくする手法がある。APIの種類を少なくする場合，バインド用APIをなくすことがある。バインド用APIがないと，OSは，アプリケーションから特定の処理の実行依頼を受け付けると，複数のコアから何れかのコアを選択し，選択したコアでこの特定の処理を実行させる。従って，バインド用APIがない場合，かかる情報処理装置で動作するアプリケーションは，指定したコアで特定の処理を確実に実行させることができない。その結果，例えば，開発者は，特定のコアを試験したい場合，試験処理を特定のコアで確実に実行させることができない。
【０００８】
一側面では，本発明は，複数の演算装置を備えた情報処理装置で，特定の処理を指定された演算装置で確実に実行することを目的とする。
【課題を解決するための手段】
【０００９】
一態様のプログラムは，複数の演算装置を備えた情報処理装置で実行されるプログラムであって，前記演算装置を所定の動作状態に移行する第1の処理を前記演算装置の各々に実行させ，指定された演算装置が前記所定の動作状態に移行した場合に，前記指定された演算装置に，前記第1の処理とは異なる第2の処理を実行させる。
【発明の効果】
【００１０】
一態様によれば，複数の演算装置で，特定の処理を指定された演算装置で確実に実行できる。
【図面の簡単な説明】
【００１１】
【図１】図1は，本実施の形態で説明する情報処理装置のハードウェアブロック図の一例である。
【図２】図2は，図1の100のソフトウェアモジュールブロック図の一例である。
【図３】図3は，図2で説明したコアがサブスレッドを実行している状態を模式的に示す図である。
【図４】図4は，全体制御部123が実行するメインスレッドの処理の流れを説明するフロー図の一例である。
【図５】図5は，図2のサブスレッドの処理の流れを説明するフロー図の一例である。
【図６】図6は，メインスレッド，サブスレッドの動作を模式的に説明する図である。
【図７】図7は，図4で説明したメインスレッドの処理の流れと，図5で説明したサブスレッドの処理の流れとの連携を説明するフロー図の一例である。
【図８】図8は，コアを指定する手法の一例を説明する図である。
【図９】図9は，第2の具体例を模式的に説明する図である。
【図１０】図10は，マルチコアCPUを，シングルコアCPUのように動作させる処理を説明する図である。
【図１１】同一のコアが，複数のサブスレッドを同時に実行しないようにする処理を説明するフロー図の一例である。
【図１２】図12は，同一のコアが，複数のサブスレッドを同時に実行しないようにする処理を模式的に説明する図である。
【発明を実施するための形態】
【００１２】
以下，図面を参照して実施の形態例を説明する。なお，図において，同一又は類似のものには同一の符号を付して説明する。
【００１３】
(ハードウェアブロック図)
図1は，本実施の形態で説明する情報処理装置のハードウェアブロック図の一例である。情報処理装置100は，バスBを介して相互に接続された，CPU11と，メモリ12と，記憶装置13と，通信装置14と，タッチパネル15と，表示装置16と，記録媒体読み取り装置17とを備える。情報処理装置100は，例えば，持ち運び可能(携帯可能とも呼ぶ)な装置であり，タブレット型のコンピュータや，スマートフォン(Smart Phone)であってもよい。
【００１４】
CPU11は，情報処理装置100の全体を制御するコンピュータであり，例えば第1のコア111〜第4のコア114を備える。CPU11は，このように4つのコアを備えるCPUであり，クアッドコアとも呼ばれる。なお，図1で説明したコアの数は，例示であり，コア数としては，例えば2つ以上であれば，例えば6つ，8つでもよい。このように，情報処理装置100は，複数の演算装置(例えば，コア)を備えている。なお，複数の演算装置として，複数のコアではなく，複数のCPUを備えていてもよい。
【００１５】
メモリ12は，各種制御情報や，CPU11が実行する各種情報処理において演算されたデータなどを記憶する。
【００１６】
記憶装置13は，各種記憶装置，例えば，不揮発性メモリや，ハードディスクドライブ(HDD:Hard Disk Drive)などの磁気記憶装置である。記憶装置13は，図2で説明するプログラムや，各種設定データを記憶する。通信装置14は，例えば無線通信機能を有し，アンテナ(図示しない)を介して信号を送受信する。
【００１７】
タッチパネル15は，透明なガラス板または合成樹脂製の透明板を有し，さらに，この透明板に対する利用者の操作を検出する。表示装置16は，各種画像を表示する装置であり，各種画像を表示する表示パネルや，表示パネルの表示素子を駆動する駆動素子を備える。この表示パネルは，例えば，液晶パネルや，有機EL(Electro Luminescence)パネルなどである。
【００１８】
記録媒体読み取り装置17は，記録媒体M1に記録されたデータを読み取る装置である。記録媒体M1は，例えば，CD-ROM(Compact Disc Read Only Memory)，DVD(Digital Versatile Disc)，USB(Universal Serial Bus)メモリなどの可搬型記録媒体である。
【００１９】
(ソフトウェアモジュール)
図2は，図1の情報処理装置100のソフトウェアモジュールブロック図の一例である。図2の点線枠で示した，OS121，アプリ122，全体制御部123は，いわゆるプログラムである。これらのプログラムは，例えば，記憶装置13に記憶されている。
【００２０】
図1のCPU11が備える第1のコア111〜第4のコア114の何れかのコアは，起動時に，これらのプログラムを記憶装置13から読み出して，メモリ12に展開することにより，これらのプログラムをソフトウェアモジュールとして機能させる。なお，これらのプログラムを記憶媒体M1に記憶してもよい。この場合，図1のCPU11が備える第1のコア111〜第4のコア114の何れかのコアは，起動時に，これらのプログラムを記録媒体読み取り装置17を介して記録媒体M1から読み出して，メモリ12に展開する。
【００２１】
全体制御部123は，サブスレッド発行部1231と，占有率調査部(負荷調査部とも呼ぶ)1232と，成否判定部1233と，通信部1234とを有する。なお，第1のサブスレッド1241〜第nのサブスレッド124nは，OS121，全体制御部123の実行によりメモリ12に展開されたスレッドである。
【００２２】
OS121は，基本ソフトウエアとも呼ばれるオペレーティングシステムである。アプリ122は，各種処理を実行するアプリケーション(以下，アプリと適宜記す)である。
【００２３】
さて，OS121は，様々なAPIを実装している。しかし，OS121は，バインド用APIを実装していない。そこで，OS121は，アプリ122から処理の実行依頼を受け付けた場合，複数のコアの占有率を調査し，占有率が低いコアを特定する。そして，OS121は，この特定したコアにこの処理に対応するスレッドを実行させる。
【００２４】
ここで，コアの占有率は，使用率とも呼ばれる。コアの占有率とは，単位時間(例えば，1msec)において，OSやアプリが処理を実行するために，このコアを占有する時間の割合を示す。コアの占有率が0%とは，この単位時間においてこのコアは常に待機状態であったことを示す。図1の例では，第1のコア111〜第4のコア114の占有率が，それぞれP1〜P4(P1>P2>P3>P4)の場合，OS121は，占有率が低いコアである第4のコア114を特定し，特定した第4のコア114にスレッドを実行させる。他にも，例えば，OS121は，第1のコア111〜第4のコア114の何れかに，ランダムにスレッドを実行させることがある。
【００２５】
このように，情報処理装置100は，コアを指定可能なバインド用APIを有しない場合，指定されたコア(目的コアとも呼ぶ)にスレッドを実行させることができない。換言すれば，情報処理装置100の操作者は，複数のコアの中から所望のコアを指定して，指定したコアにスレッドを確実に実行させることができない。そのため，様々な不都合が生じる。なお，この操作者とは，例えば，情報処理装置100の開発者も含む。
【００２６】
例えば，情報処理装置100の工場出荷時などに，開発者が，複数のコアの中から所望のコアを指定して，指定したコアに，特定の処理として試験用の処理を実行させることを想定する。ここでは，開発者が，第1のコア111，第2のコア112を試験するとする。そして，第2のコア112〜第4のコア114が負荷の高い処理を継続して実行し，その占有率が高いとする。この場合，OS121は，第1のコア111に試験用の処理を実行させることができるが，その試験処理が終了した後，未だ，第2のコア112が負荷の高い処理を継続して実行し，その占有率が高い場合には，OS121は，試験用の処理を第2のコア112に実行させることができない。
【００２７】
以上，説明したように，バインド用APIがない場合，複数のコアの中から所望のコアを指定して，指定したコアにスレッドを確実に実行させることができない。
【００２８】
そこで，情報処理装置100は，複数のコアの中から，指定されたコアに特定の処理を確実に実行させる全体制御部123を実行する。
【００２９】
全体制御部123は，スレッドを作成するなど，本実施におけるメインスレッド，サブスレッドの連携処理を制御する。ここで，メインスレッドとは，全体制御部123における処理の単位であり，サブスレッドとは，メインスレッドの実行により新たに実行される処理の単位である。
【００３０】
サブスレッド発行部1231は，OS121に対して，処理を実行するコアを決定し，決定したコアに対して処理を実行させる。換言すれば，サブスレッド発行部1231は，OS121にサブスレッドの発行依頼を行う。
【００３１】
占有率調査部1232は，各コアの占有率を調査する。占有率調査部1232がコアの占有率を調査する手法しては様々な手法がある。例えば，OS121が指定されたコアの占有率を出力するAPIを実装している場合，占有率調査部1232は，このAPIに占有率調査対象のコアの識別番号を入力する。このAPIは，識別番号の入力に応答して，この識別番号により識別されるコアの占有率を占有率調査部1232に出力する。また，例えば，OS121が，各コアのアイドル時間(idle time )及び非アイドル時間をログとして出力する機能を有する場合，占有率調査部1232は，各コアのアイドル時間及び非アイドル時間に基づき，各コアの占有率を調査する。
【００３２】
成否判定部1233は，指定されたコアの占有率が所定の占有率(例えば100%)以上か判定する。通信部1234は，第1のサブスレッド1241〜第nのサブスレッド124nとの通信処理を実行する。
【００３３】
第1のサブスレッド1241〜第nのサブスレッド124nは，OS121が発行した第1のサブスレッド〜第nのサブスレッドを模式的に示す。第1のサブスレッド1241〜第nのサブスレッド124nの各々は，第1のコア111〜第4のコア114の何れかで実行されている。
【００３４】
アプリ122は，各種処理を実行するアプリである。このアプリとしては，例えば，CPU試験プログラムがある。なお，CPU試験プログラムについては，図8で詳細に説明する。
【００３５】
(サブスレッド)
図3は，図2で説明したコアがサブスレッドを実行している状態を模式的に示す図である。OS121は，サブスレッド発行部1231からのサブスレッドの発行依頼を受け付けると，複数のコアの何れかのコアでサブスレッドを実行させる。コアは，サブスレッドの実行により，第1の処理を実行する。さらに，コアは，通信部1234からの指示により，第1の処理に続けて第2の処理を実行する。なお，コアが第1，第2の処理，後記する通信処理を実行することは，このコアが実行するサブスレッドが第1，第2の処理，後記する通信処理を実行することと同義である。
【００３６】
第1の処理と，第2の処理との間の"通信処理"は，OS121が実行するメインスレッドの通信部1234と，サブスレッドとのスレッド間通信を模式的に示している。
【００３７】
ここで通信処理について説明する。OS121は，サブスレッドをコアに発行すると，このコアの識別番号と，発行したサブスレッドの識別番号を全体制御部123に出力する。全体制御部123の通信部123は，このコアの識別番号とサブスレッドの識別番号とに基づき，このコアが実行しているサブスレッドを特定し，特定したサブスレッドとスレッド間通信を行う。通信部123は，このスレッド間通信において，サブスレッドに様々な指示を行う。この指示については，後記する。
【００３８】
第1の処理は，サブスレッドを実行するコアの処理負荷を高めてこのコアの占有率を上昇させる処理である。コアは，第1の処理として，例えば演算処理や画像処理がある。演算処理の一例としては，等差数列の和や，等比数列の和を演算する処理がある。また，画像処理の一例としては，記憶装置13が予め記憶している画像データを圧縮する処理がある。
【００３９】
図3のサブスレッドは，第2の処理の実行指示を通信部1234から受信するまで，第1の処理を同一コアで継続して実行する。
【００４０】
占有率調査部1232は，第1のコア111〜第4のコア114の占有率を定期的に調査する。そして，成否判定部1233は，指定されたコアの占有率が所定の占有率以上か判定する。通信部1234は，成否判定部1233が指定されたコアの占有率が所定の占有率以上と判定した場合，このコアが実行するサブスレッドに第2の処理を実行するように指示する。
【００４１】
第2の処理は，特定の処理であり，例えば操作者がコアに実行させたい処理である。この処理の一例として，コアの試験処理がある。
【００４２】
通信部1234は，サブスレッドに第2の処理の実行指示を行う。このサブスレッドは，この実行指示を受信すると(図3の"通信処理"を参照)，以後，第2の処理を実行する。
【００４３】
以下，図4を参照して全体制御部123が実行するメインスレッドの流れを説明し，図5を参照してサブスレッドの処理の流れを説明し，図6を用いて，メインスレッド，サブスレッドの動作を模式的に説明する。
【００４４】
(全体制御部123の処理の流れ)
図4は，全体制御部123が実行するメインスレッドの処理の流れを説明するフロー図の一例である。図4の処理の前に以下の処理が実行される。まず，アプリ122が，第2の処理を実行するコアを指定する。そして，アプリ122は，第1の処理と第2の処理との実行，すなわちサブスレッドの実行を全体制御部123に指示する。全体制御部123の占有率調査部1232は，前記指示に応答して，第1のコア111〜第4のコア114の占有率を調査する。ここで，ステップS1を実行する前は，第1のコア111〜第4のコア114は，所定の占有率以上のコアでないとする。
【００４５】
ステップS1：OS121は，複数のコアの何れかのコアにサブスレッドを発行する。具体的には，全体制御部123のサブスレッド発行部1231は，第1のコア111〜第4のコア114の何れかのコアでサブスレッドを実行するようにOS121に指示する。OS121は，前記指示を受け付け，例えば占有率が最小のコアにサブスレッドを実行させる。なお，占有率が最小のコアが複数ある場合には，この複数のコアの何れかにサブスレッドを実行させる。
【００４６】
ステップS2：全体制御部123は，所定の時間(例えば，1msec)スリープ状態になり，ステップS3の実行開始を待つ。換言すれば，全体制御部123は，メインスレッドの実行を所定の時間停止する。全体制御部123がメインスレッドの実行を所定の時間停止することにより，サブスレッドを実行しているコアの占有率を所定の占有率以上に上昇させる。
【００４７】
ステップS3：占有率調査部1232は，各コア(第1のコア111〜第4のコア114)の占有率を監視し，指定されたコアの占有率を調査する。
【００４８】
ステップS4：成否判定部1233は，指定されたコアの占有率が所定の占有率以上か判定する。指定されたコアの占有率が所定の占有率以上でない場合(ステップS4/NO)，ステップS1に戻る。指定されたコアの占有率が所定の占有率以上の場合(ステップS4/YES)，ステップS5に移る。
【００４９】
ステップS5：通信部1234は，指定されたコアが実行するサブスレッドに，第2の処理の実行開始指示を行う。
【００５０】
ステップS6：通信部1234は，指定されたコア以外のコアが実行するサブスレッドに，サブスレッドの終了指示を行う。
【００５１】
(サブスレッドの処理の流れ)
図5は，図2のサブスレッドの処理の流れを説明するフロー図の一例である。
【００５２】
ステップS11：サブスレッドの実行指示を受けたコアは，サブスレッドの実行を開始する。ここでは，このコアは，第1の処理を実行し，このコアの占有率を所定の占有率まで上昇させる。
【００５３】
ステップS12：実行中のサブスレッド(例えば，図2の第1のサブスレッド1241)は，メインスレッドからの指示を受信する状態に移行し，前記指示を受信したか判定する。実行中のサブスレッドが，前記指示を受信しない場合(ステップS12/NO)，ステップS12の処理を継続する。実行中のサブスレッドが，前記指示を受信した場合(ステップS12/YES)，ステップS13に移行する。
【００５４】
ステップS13：前記指示を受信したサブスレッドは，前記指示が第2の処理の開始指示か判定する。前記指示が第2の処理の開始指示の場合(ステップS13/YES)，ステップS14に移る。
【００５５】
ステップS14：前記指示を受信したサブスレッドは，第1の処理を終了し，第2の処理を開始する。
【００５６】
ステップS13において，前記指示が第2の処理の開始指示でない場合(ステップS13/NO)，ステップS15に移る。
【００５７】
ステップS15：前記指示を受信したサブスレッドは，前記指示がサブスレッドの終了指示か判定する。前記指示がサブスレッドの終了指示でない場合(ステップS15/NO)，ステップS12に戻る。前記指示がサブスレッドの終了指示の場合(ステップS15/YES)，ステップS16に移る。
【００５８】
ステップS16：前記指示を受信したサブスレッドは，自身の処理を終了する。換言すれば，前記指示を受信したサブスレッドが消滅する。
【００５９】
(動作説明)
図6は，メインスレッド，サブスレッドの動作を模式的に説明する図である。図6において，各コア(図1の例では，第1のコア111〜第4のコア114)を示す四角形の左下隅に記載されている文字列"100%"，"0%"，"??%"は，この文字列が記載されているコアの占有率を示す。文字列"??%"は，文字列"??%"が記載されているコアの占有率が任意の占有率であることを示す。符号124M(Mは1以上の整数)で示す円筒形は，第Mのサブスレッドを模式的に示している。円筒形内部の数値は，前記した"M"である。なお，第1のコア111〜第4のコア114の何れか，例えば，第4のコア114がメインスレッドを実行している。この場合，以下の説明を簡略化するため，第4のコア114の占有率を0%としている。
【００６０】
全体制御部123は，図4で説明した処理を実行する。全体制御部123のサブスレッド発行部1231は，第1のコア111〜第4のコア114の何れかのコアでサブスレッドを実行するようにOS121に指示する。OS121は，前記指示を受け付け，例えば第1のコア111に第1のサブスレッド1241の実行を指示する。換言すれば，OS121は，第1のコア111に第1のサブスレッド1241を発行する(ステップS1参照)。ここで，初回時にサブスレッドが発行された場合，第1のコア111〜第4のコア114の何れかに発行されることになり，指定された第2のコア112にサブスレッドが発行される確率は1/4である。
【００６１】
第1のコア111は，第1のサブスレッド1241を実行し，第1のコア111の占有率を所定の占有率(例えば100%)に上昇させる。図6(A)は，第1のコア111の占有率を100%に上昇させた状態を模式的に示す。次いで，ステップS2，ステップS3の処理が実行されるが，指定された第2のコア112の占有率は，100%以上ではないので(ステップS4/NO)，全体制御部123のサブスレッド発行部1231は，第1のコア111〜第4のコア114の何れかのコアでサブスレッドを実行するようにOS121に指示する。OS121は，前記指示を受け付け，OS121は，第4のコア114に第2のサブスレッド1242を発行する(ステップS1)。
【００６２】
このとき，第1のサブスレッド1241は，指定された第2のコア112に発行されない。しかし，第1のサブスレッド1241は，メインスレッドからの終了指示があるまで，第1のコア111において実行を継続する。そのため，第1のコア111の占有率は，常時，所定の占有率を維持することになる。そのため，OS121が第1のコア111に第2のサブスレッド1241を発行した後に(図6(A)参照)，サブスレッドが発行された場合，第2のコア112〜第4のコア114の何れかに発行されることになり，指定された第2のコア112にサブスレッドが発行される確率が高くなる。具体的には，OS121が第1のコア111に第2のサブスレッド1241を発行した後に，サブスレッドが発行された場合，指定された第2のコア112にサブスレッドが発行される確率が1/3となる。
【００６３】
第4のコア114は，第2のサブスレッド1242を実行し，第4のコア114の占有率を100%に上昇させる。図6(B)は，第4のコア114の占有率を100%に上昇させた状態を模式的に示す。次いで，ステップS2，ステップS3の処理が実行されるが，指定された第2のコア112の占有率は，100%以上ではないので(ステップS4/NO)，全体制御部123のサブスレッド発行部1231は，第1のコア111〜第4のコア114の何れかのコアでサブスレッドを実行するようにOS121に指示する。前記指示の時点では，第1のコア111の占有率，第4のコア114の占有率は，100%である。従って，サブスレッドが発行された場合，第2のコア112，第3のコア113の何れかに発行されることになり，指定された第2のコア112にサブスレッドが発行される確率が高くなる。具体的には，OS121が第4のコア114に第2のサブスレッド1242を発行した後に，サブスレッドが発行された場合，指定された第4のコア114にサブスレッドが発行される確率が1/2となる。
【００６４】
このようにサブスレッドが発行される度に，指定されたコアにサブスレッドが発行される確率が高くなる。
【００６５】
OS121は，前記指示を受け付け，OS121は，第2のコア112に第3のサブスレッド1243を発行する(ステップS1)。
【００６６】
第2のコア112は，第3のサブスレッド1243を実行し，第2のコア112の占有率を100%に上昇させる。図6(C)は，第2のコア112の占有率を100%に上昇させた状態を模式的に示す。次いで，ステップS2，ステップS3の処理が実行されるが，指定された第2のコア112の占有率は，100%以上なので(ステップS4/YES)，第3のコア113は，ステップS5，S6の処理を実行する。
【００６７】
具体的には，通信部1234は，指定された第2のコア112が実行する第3のサブスレッド1243に，第2の処理の実行開始指示を行う(ステップS5)。第3のサブスレッド1243は，前記指示を受け付けると，図5のステップS12でYES，ステップS13でYESと判定し，第1の処理を終了し，第2の処理を実行する(ステップS14)。ここでは，第3のサブスレッド1243は，第2の処理として，例えばコアの試験処理を実行する。一方，通信部1234は，指定された第2のコア112以外のコアである，第1のコア111が実行する第1のサブスレッド1241，第4のコア114が実行する第2のサブスレッド1242にサブスレッドの終了指示を行う(ステップS6)。第1のサブスレッド1241，第2のサブスレッド1242は，自身の処理を終了する（ステップS16）。
【００６８】
図6(D)は，第3のサブスレッド1243が第2の処理を実行し，第1のサブスレッド1241，第2のサブスレッド1242が，自身の処理を終了する状態を模式的に示す。
【００６９】
(メインスレッドとサブスレッド)
図7は，図4で説明したメインスレッドの処理の流れと，図5で説明したサブスレッドの処理の流れとの連携を説明するフロー図の一例である。以下の説明では，例えば，アプリ122が，第2の処理を実行するコアとして，第1のコア111を指定したとする。
【００７０】
(メインスレッド)
ステップS21：OS121は，第1のコア111〜第4のコア114の何れかのコアに，例えば第1のサブスレッド1241を発行する。具体的には，全体制御部123のサブスレッド発行部1231は，第1のコア111〜第4のコア114の何れかのコアでサブスレッドを実行するように指示する。OS121は，前記指示を受け付け，占有率が最小のコアにサブスレッドを実行させる。ステップS21は，図4のステップS1に相当する。
【００７１】
ステップS22：占有率調査部1232は，第1のコア111の占有率を調査し，第1のコア111の占有率が所定の占有率以上か判定する。なお，ステップS22の処理の前に，全体制御部123は，図4のステップS2で説明したスリープ処理を実行する。ステップS22は，図4のステップS4に相当する。ステップS22において，第1のコア111の占有率が所定の占有率以上の場合(ステップS22/YES)，ステップS23に移る。
【００７２】
ステップS23：通信部1234は，第1のコア111が実行する第1のサブスレッド1241に，第2の処理の実行開始指示を行う。ステップS23は，図4のステップS5に相当する。
【００７３】
(第1のサブスレッド)
ステップS31：ステップS21で説明したように，サブスレッドの実行指示を受けたコアは，第1のサブスレッド1241の実行を開始する。ここでは，このコアは，第1の処理を実行し，このコアの占有率を所定の占有率まで上昇させる。ステップS31は，図5のステップS11に相当する。
【００７４】
ステップS32：第1のサブスレッド1241は，メインスレッドからの指示を受信する状態に移行し，前記指示が第2の処理の開始指示か判定する。ステップS32は，図5のステップS13に相当する。
【００７５】
通信部1234がステップS23で第2の処理開始指示を実行した場合，ステップS32においてYESと判定され，ステップS33に移る。
【００７６】
ステップS33：前記指示を受信した第1のサブスレッド1241は，第1の処理を停止し，第2の処理を開始する。以後，図6のフロー図の処理は終了する。ステップS33は，図5のステップS14に相当する。
【００７７】
ステップS32において，メインスレッドの指示が第2の処理の実行開始でないと判定された場合(ステップS32/NO)，ステップS34に移る。
【００７８】
ステップS34：前記指示を受信した第1のサブスレッド1241は，前記指示がサブスレッドの終了指示か判定する。ステップS34は，図5のステップS15に相当する。前記指示がサブスレッドの終了指示でない場合(ステップS34/NO)，ステップS32に戻る。前記指示がサブスレッドの終了指示の場合(ステップS34/YES)，ステップS35に移る。
【００７９】
ステップS35：前記指示を受信した第1のサブスレッド1241は，自身の処理を終了する。以後，図6のフロー図の処理は終了する。ステップS35は，図5のステップS16に相当する。
【００８０】
(メインスレッド)
ステップS22において，第1のコア111の占有率が所定の占有率以上ではないと判定された場合(ステップS22/NO)，ステップS24に移る。第1のコア111の占有率が所定の占有率以上ではないと判定されたことは，換言すれば，第1のコア111が第1のサブスレッド1241を実行しておらず，第1のコア111以外のコア(例えば，第2のコア112)が，第1のサブスレッド1241を実行していることを意味する。
【００８１】
ステップS24：OS121は，第1のコア111〜第4のコア114の何れかのコアに，例えば第2のサブスレッド1242を発行する。具体的には，全体制御部123のサブスレッド発行部1231は，第1のコア111〜第4のコア114の何れかのコアでサブスレッドを実行するように指示する。OS121は，前記指示を受け付け，占有率が最小のコアにサブスレッドを実行させる。ステップS21は，図4のステップS1に相当する。
【００８２】
ステップS25：占有率調査部1232は，第1のコア111の占有率を調査し，第1のコア111の占有率が所定の占有率以上か判定する。なお，ステップS25の処理の前に，全体制御部123は，図4のステップS2で説明したスリープ処理を実行する。ステップS25は，図4のステップS4に相当する。
【００８３】
ステップS25において，第1のコア111の占有率が所定の占有率以上の場合(ステップS25/YES)，ステップS26に移る。
【００８４】
ステップS26：通信部1234は，第1のコア111が実行する第1のサブスレッド1241に，第2の処理の実行開始指示を行う。ステップS26は，図4のステップS5に相当する。
【００８５】
(第2のサブスレッド)
ステップS41：ステップS24で説明したように，サブスレッドの実行指示を受けたコアは，第2のサブスレッド1242の実行を開始する。ここでは，このコアは，第1の処理を実行し，このコアの占有率を所定の占有率まで上昇させる。ステップS41は，図5のステップS11に相当する。
【００８６】
ステップS42：第2のサブスレッド1242は，メインスレッドからの指示を受信する状態に移行し，前記指示が第2の処理の開始指示か判定する。ステップS42は，図5のステップS13に相当する。
【００８７】
通信部1234がステップS26で第2の処理開始指示を実行した場合，ステップS42においてYESと判定され，ステップS43に移る。
【００８８】
ステップS43：前記指示を受信した第2のサブスレッド1242は，第1の処理を停止し，第2の処理を開始する。以後，図6のフロー図の処理は終了する。ステップS43は，図5のステップS14に相当する。
【００８９】
ステップS42において，メインスレッドの指示が第2の処理の実行開始でないと判定された場合(ステップS42/NO)，ステップS44に移る。
【００９０】
ステップS44：前記指示を受信した第2のサブスレッド1242は，前記指示がサブスレッドの終了指示か判定する。ステップS44は，図5のステップS15に相当する。前記指示がサブスレッドの終了指示でない場合(ステップS44/NO)，ステップS42に戻る。前記指示がサブスレッドの終了指示の場合(ステップS44/YES)，ステップS45に移る。
【００９１】
ステップS45：前記指示を受信した第2のサブスレッド1242は，自身の処理を終了する。以後，図6のフロー図の処理は終了する。ステップS45は，図5のステップS16に相当する。
【００９２】
ステップS25において，第1のコア111の占有率が所定の占有率以上ではないと判定された場合(ステップS25/NO)，ステップS27に移る。
【００９３】
ステップS27：OS121は，第1のコア111〜第4のコア114の何れかのコアに，例えば第3のサブスレッド1243を発行する。ステップS24は，図4のステップS1に相当する。
【００９４】
以下，図7で説明したように，情報処理装置100は，指定された第1のコア111でサブスレッドが実行されるまで，換言すれば，指定された第1のコア111の占有率が所定の占有率以上になるまで，各コアに対してサブスレッドを発行する。そして，情報処理装置100は，指定された第1のコア111の占有率が所定の占有率以上になると，第1のコア111が実行しているサブスレッドに第2の処理の開始指示を行う(図4のステップS5参照)。さらに，情報処理装置100は，指定されたコア以外のコアが実行しているサブスレッドに第1の処理の終了指示を行う(図4のステップS6参照)。
【００９５】
本実施の形態の情報処理装置によれば，コアの動作状態を所定の動作状態に移行する第1の処理をコアの各々に実行させる。その結果，図6で説明したように，コアの各々が第1の処理を実行する度に，指定されたコアが第1の処理を実行する確率が高くなる。
【００９６】
そして，この情報処理装置は，指定されたコアが所定の動作状態に移行した場合に，指定されたコアに，指定されたコアが実行する第1の処理を終了させると共に，第1の処理とは異なる第2の処理を実行させる。その結果，指定されたコアは，第2の処理を実行することができる。換言すれば，操作者が所望する第2の処理を目的コアに確実に実行させることができる。なお，コアの動作状態は，このコアの使用率である。 
【００９７】
この情報処理装置は，指定されたコアが所定の動作状態に移行した場合に，さらに，複数のコアの中で，指定されたコア以外のコアに第1の処理を終了させる。その結果，指定されたコア以外のコアの使用率を低下させ，指定されたコア以外のコアに他の処理を実行させることができる。
【００９８】
この情報処理装置は，指定されたコアの使用率が所定の使用率以上になると，指定されたコアが所定の動作状態に移行したと判定する。そして，第1の処理は，コアの使用率を上昇させる処理である。このように，この情報処理装置は，コアの使用率を監視することで，指定されたコアが第1の処理を実行しているか判定することができる。具体的には，指定されたコアに，第1の処理と第2の処理とを有するサブスレッドが発行されたか判定することができる。その結果，指定されたコアが第1の処理を実行している場合，このコアが実行しているサブスレッドに第2の処理の実行を指示すれば，指定されたコアに第2の処理を確実に実行させることができる。
【００９９】
次に，図8〜図12を参照し，第2の処理について，様々な具体例を示して説明する。
【０１００】
[第1の具体例]
まず，図8を参照し，第2の処理として，コアの試験処理を実行する具体例について説明する。情報処理装置100は，試験対象のコアにCPU試験処理を実行させる。
【０１０１】
このCPU試験処理は，コアがCPU試験プログラムを実行することにより行われる。CPU試験プログラムとは，コアにて命令列を実行し，その実行結果を確認することにより，コアの設計検証もしくは故障検出を行う目的で作られた命令列のことを指す。主な確認項目は，例えば，演算結果，分岐確認，モード切替確認である。演算結果確認とは，コアによる演算の実際の結果と，この演算の結果の期待値とが合致しているか確認するものである。分岐確認とは，分岐命令があった場合に，正しい分岐先に分岐が行われたかを確認し，さらに，分岐命令が条件分岐であるとき，その条件は正しいかを確認する。モード切替確認とは，メモリアクセスの方法(例えば，仮想アドレスと実アドレスとの対応変更など)，CPU特権モードの遷移など，モードが切り替わるような命令が正しく動作するかを確認する。その他，上記カテゴリに該当しない命令であっても，CPUの仕様書通りの動作を行えるかどうか確認する。
【０１０２】
(コアの指定)
コアを試験する場合，操作者は，試験対象のコアを指定する。図8は，コアを指定する手法の一例を説明する図である。
【０１０３】
アプリ122は，操作者からのコアの試験モード移行指示に応答して，表示装置16に図8のコア実行画面200を表示する。アプリ122は，コア実行画面200内に，第1のチェックボックス201〜第4のチェックボックス204と，実行ボタン205と，停止ボタン206とを表示する。全体制御部123は，第1のチェックボックス201の右横に文字列"第1のコア1"，第2のチェックボックス202の右横に文字列"第2のコア2"，第3のチェックボックス203の右横に文字列"第3のコア3"，第4のチェックボックス204の右横に文字列"第4のコア4"を表示する。
【０１０４】
操作者は，コア実行画面200に表示された第1のチェックボックス201〜第4のチェックボックス204の中のチェックボックスを触れる。そして，操作者は，コア実行画面200に表示された実行ボタン205を触れる。すると，タッチパネル15は，触れたチェックボックスの座標位置をアプリ122に出力する。アプリ122は，この座標位置に基づき，第1のチェックボックス201〜第4のチェックボックス204の中のどのチェックボックスが触れられたかを決定し，触れられたチェックボックスに対応するコアの識別記号を全体制御部123に出力する。
【０１０５】
例えば，アプリ122は，第1のチェックボックス201が触れられた場合，識別記号として"ID1"を全体制御部123に出力し，第2のチェックボックス202が触れられた場合，識別記号として"ID2"を全体制御部123に出力する。
【０１０６】
図8の例では，操作者は，第2のチェックボックス202を触れる。すると，タッチパネル15は，触れたチェックボックスの座標位置をアプリ122に出力する。アプリ122は，この座標位置に基づき，第2のチェックボックス202が触れられたと決定し，触れられたチェックボックス202に対応するコアの識別記号である"ID2"を全体制御部123に出力する。同時に，アプリ122は，第2のチェックボックス202にチェック記号CHKを表示する。
【０１０７】
全体制御部123は，入力された識別記号"ID2"に基づき，指定されたコアを特定する。全体制御部123は，指定されたコアとして第2のコア112を特定する。以後，全体制御部123は，図6で説明したメインスレッドの処理を実行し，指定された第2のコア112にてコアの試験処理を実行させる。
【０１０８】
[第2の具体例]
図9は，第2の具体例を模式的に説明する図である。図9(A)は，第1の関数f1〜第3の関数f3を模式的に示す図である。第1の関数f1の仕様は，例えばメモリ12の空き領域にNxバイト(Nxは2以上の整数)の文字列を書き込むものである。
【０１０９】
第2の関数f2の仕様は，第1の関数f1がメモリ12の空き領域にNxバイトの文字列を書き込んだか判定し，第1の関数f1がメモリ12の空き領域にNxバイトの文字列を書き込んだ場合に書き込み成功を出力し，それ以外の場合に書き込み失敗を出力するものである。しかし，第2の関数f2の開発者は，第2の関数f2の開発時にミスをして，第1の関数f1がNxバイトの文字列のうち先頭の1バイトのみメモリ12の空き領域に書き込んだだけで，第1の関数f1がNxバイトの文字列を書き込んだと判定し，書き込み成功を出力してしまう関数を開発した。すなわち，第2の関数f2は，第1の関数f1が，メモリ12の空き領域に1バイトの文字列を書き込んだだけで，書き込み成功を出力する関数であり，前記した仕様を満足しない関数である。
【０１１０】
第3の関数f3の仕様は，第2の関数f2が書き込み成功を出力すると，以下の処理を実行するものである。すなわち，第3の関数f3の仕様は，メモリ12において，第1の関数f1がNxバイトの文字列の1バイト目を書き込んだ第1のメモリアドレスから第2のメモリアドレスで特定される領域(メモリ空間とも呼ぶ)に記憶されたデータを読み出し，何らかのデータ処理を行う。第2のメモリアドレスは，第1のメモリアドレスからNxバイト分のアドレスをオフセットしたアドレスである。第3の関数f3の仕様は，第2の関数f2が書き込み成功を出力しない場合，前記読み出しを実行しない。
【０１１１】
第1の関数f1〜第3の関数f3は，アプリ122が呼び出す(実行するとも呼ぶ)関数であり，アプリ122は，第1の関数f1〜第3の関数f3を順次実行することにより所定の処理を実行する。
【０１１２】
図9(B)は，第1の関数f1〜第3の関数f3をシングルコアのCPUが実行する場合を模式的に説明する図である。図9(B)に示したように，シングルコアのCPUが，第1の関数f1〜第3の関数f3を順次実行する場合を想定する。
【０１１３】
この場合，シングルコアのCPUは，第1の関数f1の実行が完全に終了した時点，すなわち，第1の関数f1が，メモリ12の空き領域にNxバイトの文字列を全て書き込んだ後に，第2の関数f2を実行する。そして，シングルコアのCPUは，第2の関数f2の実行が完全に終了した後に，第3の関数を実行する。
【０１１４】
図9(C)は，第1の関数f1〜第3の関数f3をマルチコアのCPUが実行する場合を模式的に説明する図である。図9(C)では，図1で説明した4つのコアを有するマルチコアCPUを想定する。このマルチコアのCPUが，第1の関数f1〜第3の関数f3を実行する場合を想定する。
【０１１５】
マルチコアのCPU上で動作するOS121は，第1の関数f1，第2の関数f2，第3の関数f3の実行を時分割して，各コアに割り当てることがある。このOS121は，第1のコア111が第1の関数f1を実行し，第2のコア112が第2の関数f2を実行し，第3のコア113が第3の関数f3を実行するように，各関数をコアに割り当てる。
【０１１６】
このように，第1の関数f1〜第3の関数f3の実行を時分割して各コアに割り当てられると，第2のコア112が実行する第2の関数f2は，第1の関数f1の実行が完全に終了する前に，図9(A)で説明した判定処理を実行する。例えば，第1の関数f1が，メモリ12の空き領域に先頭の1バイトの文字しか書き込んでいないのにも拘わらず，第2の関数f2は，書き込み成功を出力してしまう。
【０１１７】
すると，第3の関数f3は，第1の関数f1がメモリ12の空き領域に先頭の1バイトの文字を書き込んだだけで，図9(A)で説明した，第1のメモリアドレスから第2のメモリアドレスで特定される領域に記憶されたデータを読み出すことがある。このデータは，前記した先頭1バイトの文字と，その他のデータとを有し，その他のデータは，いわゆるゴミデータである。そのため，第3の関数f3は，先頭1バイトの文字とゴミデータに対して，データ処理を行うので，開発者の意図に反した処理結果を出力する。以下，かかる開発者の意図に反した処理結果を出力することをバグの顕在化と適宜記す。
【０１１８】
しかし，図9(B)に示したように，シングルコアのCPUが，第1の関数f1〜第3の関数f3を順次実行する場合には，第2の関数が仕様通りに開発者により作成されていなくても，図9(C)で説明したバグの顕在化が生じる可能性が低くなる。何故なら，第1の関数f1が，メモリ12の空き領域にNxバイトの文字列を全て書き込んだ後に，第2の関数f2を実行するからである。
【０１１９】
そのため，書き込み成功を出力した時点では，第1の関数f1が，メモリ12の空き領域にNxバイトの文字列を全て書き込んだ可能性が高い。従って，第3の関数f3は，メモリ12の空き領域に書き込まれたNxバイトの文字列を読み出し，読み出した文字列に対してデータ処理を行うことができる可能性が高くなる。その結果，バグの顕在化が生じる可能性が低くなる。
【０１２０】
しかし，マルチコアCPUの場合，前記したように，バグの顕在化が生じる可能性が高くなる。そこで，本実施の形態で説明した，メインスレッドとサブスレッドとの連携処理により，マルチコアCPUを，シングルコアCPUのように動作させる。
【０１２１】
図10は，マルチコアCPUを，シングルコアCPUのように動作させる処理を説明する図である。まず，アプリ122は，第1のコア111〜第4のコア114の中から第1の関数f1〜第3の関数f3を実行する1つのコアを指定する。例えば，第1のコア111を指定する。
【０１２２】
以後，図4で説明したように，全体制御部123は，指定された第1のコア111が第1_aのサブスレッド1241aの第1の処理を実行するまで，ステップS1〜ステップS4の処理を繰り返し行う。第1_aのサブスレッド1241aは，図10(A)に示すように，演算処理などの第1の処理と，第1の関数f1が実行する処理の第2の処理とを有するサブスレッドである。
【０１２３】
全体制御部123は，指定された第1のコア111が第1_aのサブスレッド1241aの第1の処理を実行することにより，第1のコア111の占有率が所定の占有率以上になると(ステップS4/YES)，指定された第1のコア111に第1の関数f1(換言すれば，第2の処理)を実行させる(ステップS5)。次いで，全体制御部123は，指定された第1のコア111以外のコアが実行する第1_aのサブスレッド1241aに，サブスレッドの終了指示を行い，第1の処理を終了させる。
【０１２４】
そして，図4で説明したように，全体制御部123は，指定された第1のコア111が第2_aのサブスレッド1242aの第1の処理を実行するまで，ステップS1〜ステップS4の処理を繰り返し行う。第2_aのサブスレッド1242aは，図10(B)に示すように，演算処理などの第1の処理と，第2の関数f2が実行する処理の第2の処理とを有するサブスレッドである。
【０１２５】
全体制御部123は，指定された第1のコア111が第2_aのサブスレッド1242aの第1の処理を実行することにより，第1のコア111の占有率が所定の占有率以上になると(ステップS4/YES)，指定された第1のコア111に第2の関数f2(換言すれば，第2の処理)を実行させる(ステップS5)。次いで，全体制御部123は，指定された第1のコア111以外のコアが実行する第2_aのサブスレッド1242aに，サブスレッドの終了指示を行い，第1の処理を終了させる。
【０１２６】
そして，図4で説明したように，全体制御部123は，指定された第1のコア111が第3_aのサブスレッド1243aの第1の処理を実行するまで，ステップS1〜ステップS4の処理を繰り返し行う。第3_aのサブスレッド1243aは，図10(C)に示すように，演算処理などの第1の処理と，第3の関数f3が実行する処理の第2の処理とを有するサブスレッドである。
【０１２７】
全体制御部123は，指定された第1のコア111が第3_aのサブスレッド1243aの第1の処理を実行することにより，第1のコア111の占有率が所定の占有率以上になると(ステップS4/YES)，指定された第1のコア111に第3の関数f3(換言すれば，第2の処理)を実行させる(ステップS5)。次いで，全体制御部123は，指定された第1のコア111以外のコアが実行する第3_aのサブスレッド1243aに，サブスレッドの終了指示を行い，第1の処理を終了させる。
【０１２８】
以上説明した処理により，指定されたコアのみに，第1の関数f1〜第3の関数f3を連続して実行させることができる。換言すれば，本実施の形態で説明した，メインスレッドとサブスレッドとの連携処理により，マルチコアCPUを，シングルコアCPUのように動作させることができる。そのため，図9で説明したようにマルチコアが処理を実行する場合において，バグの顕在化が生じる可能性が低くなる。
【０１２９】
[第3の具体例]
図2で説明したOS121は，サブスレッドを既に実行しているコアには，サブスレッドを発行していなかった。しかし，OS121の仕様によっては，サブスレッドを既に実行しているコアに，サブスレッドを発行することがある。このような場合，本実施の形態で説明したメインスレッドとサブスレッドとの連携処理を実行しない場合，問題が生じる。
【０１３０】
例えば，第1のコア111が情報処理装置100の操作者に対する各種情報表示を実行するGUI(Graphical User Interface)用のサブスレッドを実行しているとする。そして，OS121が，さらに，画像処理用のサブスレッドなどコアに負荷がかかるサブスレッドを第1のコア111に発行する。以下，画像処理用のサブスレッドなどコアに負荷がかかるサブスレッドをヘビーサブスレッドと適宜記す。
【０１３１】
すると，OS121は，例えばラウンドロビン・スケジューリング方式を利用して，GUI用のサブスレッドと，ヘビーサブスレッドとを同時に第1のコア111にて実行させる。そのため，GUI用のサブスレッドの処理速度が低下し，情報処理装置100の利用者に対する各種情報表示の速度が低下する。その結果，操作者の操作性が大幅に低下するという問題が生じる。
【０１３２】
そこで，同一のコアが，複数のサブスレッド(換言すれば異なる種類の第2の処理)を同時に実行しないようにする。前記の例では，第1のコア111が，同時に，GUI用のサブスレッド(換言すれば，GUI処理)と，ヘビーサブスレッド(換言すれば，ヘビー処理)を行わないようにする。
【０１３３】
図11は，同一のコアが，複数のサブスレッドを同時に実行しないようにする処理を説明するフロー図の一例である。
【０１３４】
図11のフロー図は，図4のステップS4とステップS5との間にステップS4aを設けたフロー図である。具体的には，ステップS4でYESと判定されると，ステップS4aの処理が実行される。
【０１３５】
ステップS4ａ：全体制御部123は，異なる種類のサブスレッドが，サブスレッド毎に指定されたコアに全て発行されたか判定する。ここで，異なる種類のサブスレッドとは，例えば，GUI用のサブスレッドと，ヘビーサブスレッドとである。
【０１３６】
異なる種類のサブスレッドが，サブスレッド毎に指定されたコアに全て発行された場合(ステップS4a/YES)，ステップS5に移る。異なる種類のサブスレッドが，サブスレッド毎に指定されたコアに全て発行されていない場合(ステップS4a/NO)，ステップS1に戻る。
【０１３７】
図12は，同一のコアが，複数のサブスレッドを同時に実行しないようにする処理を模式的に説明する図である。
【０１３８】
図11，図12を参照して，同一のコアが，複数のサブスレッドを同時に実行しないようにする処理を説明する。まず，アプリ122は，第1のコア111〜第4のコア114の中からGUI用のサブスレッドを実行する1つのコアを指定する。例えば，第1のコア111を指定する。次いで，アプリ122は，第1のコア111〜第4のコア114の中から画像処理用のサブスレッドを実行する1つのコアを指定する。例えば，第2のコア112を指定する。
【０１３９】
以後，図4で説明したように，全体制御部123は，指定された第1のコア111が第1_bのサブスレッド1241bの第1の処理を実行するまで，ステップS1〜ステップS3の処理を繰り返し行う。第1_bのサブスレッド1241bは，演算処理などの第1の処理と，GUI処理に相当する第2の処理とを有するサブスレッドである。
【０１４０】
ここでは，例えば，1回目で，OS121は，指定された第1のコア111に第1_bのサブスレッド1241bを発行し，第1のコア111に第1_bのサブスレッド1241bの第1の処理を実行させている。
【０１４１】
図12(A)は，第1のコア111に第1_bのサブスレッド1241bの第1の処理を実行させている状態を模式的に示す。第1のコア111が第1_bのサブスレッド1241bの第1の処理を実行することにより，指定された第1のコア111の占有率が100%になる。すると，成否判定部1233は，指定された第1のコア111の占有率が100%以上と判定し(ステップS4/YES)，ステップS4aに移る。
【０１４２】
全体制御部123は，異なる種類のサブスレッドが，サブスレッド毎に指定されたコアに全て発行されたか判定する(ステップS4a)。具体的には，第1_bのサブスレッド1241bが第1のコア111に発行され，第2_bのサブスレッド1242bが第2のコア112に発行されたか判定する。第2_bのサブスレッド1242bは，演算処理などの第1の処理と，画像処理に相当する第2の処理とを有するサブスレッドである。
【０１４３】
ここでは，第1_bのサブスレッド1241bが第1のコア111に発行されたが(図12(A)参照)，まだ，第2_bのサブスレッド1242bが第2のコア112に発行されていない。この場合，ステップS4aでNOと判定され，ステップS1に戻る。
【０１４４】
ステップS4aを経由して，ステップS1に戻った場合，全体制御部123のサブスレッド発行部1231は，第1のコア111〜第4のコア114の何れかのコアに，前回コアに発行された第1_bのサブスレッド1241bとは異なるサブスレッドである第2_bのサブスレッド1242bを発行するようにOS121に指示する。OS121は，前記指示を受け付け，第2_bのサブスレッド1242bを第1のコア111に実行させる。図12(B)は，第1のコア111に第2_bのサブスレッド1242bの第1の処理を実行させている状態を模式的に示す。
【０１４５】
次いで，ステップS2〜ステップS4の処理が実行されるが，指定された第2のコア112に第2_bのサブスレッド1242bが発行されていない。すなわち，画像処理用のサブスレッドを実行するコアとして指定された第2のコア112の占有率が所定の占有率以上ではないので(ステップS4/NO)，ステップS1に戻る。
【０１４６】
このステップS4を経由して，ステップS1に戻った場合，全体制御部123のサブスレッド発行部1231は，第1のコア111〜第4のコア114の何れかのコアで，前回コアに発行されたサブスレッドと同じ第2_bのサブスレッド1242b'を実行するようにOS121に指示する。OS121は，前記指示を受け付け，第2_bのサブスレッド1242b'を第2のコア112に実行させる。図12(C)は，第2のコア112に第2_bのサブスレッド1242b'の第1の処理を実行させている状態を模式的に示す。
【０１４７】
次いで，ステップS2〜ステップS4の処理が実行されるが，指定された第2のコア112に第2_bのサブスレッド1242b'が発行されている。その結果，ステップS1で発行された第2_bのサブスレッド1242b'を実行するコアとして指定された第2のコア112の占有率が所定の占有率以上になる。すると，成否判定部1233は，指定された第2のコア112の占有率が100%以上と判定し(ステップS4/YES)，ステップS4aに移る。
【０１４８】
全体制御部123は，第1_bのサブスレッド1241bが第1のコア111に発行され，第2_bのサブスレッド1242b'が第2のコア112に発行されたか判定する(ステップS4a)。ここでは，第1_bのサブスレッド1241bが第1のコア111に発行され(図12(A)参照)，さらに，第2_bのサブスレッド1242b'が第2のコア112に発行されている(図12(C)参照)。この場合，ステップS4aでYESと判定され，ステップS5に移る。
【０１４９】
次いで，通信部1234は，指定された第1のコア111が実行する第1_bのサブスレッド1241bに，第2の処理の実行開始指示を行う(ステップS5)。第1_bのサブスレッド1241bは，前記指示を受け付けると，図5のステップS12でYES，ステップS13でYESと判定し，第1の処理を終了し，第2の処理を実行する(ステップS14)。ここでは，第1_bのサブスレッド1241bは，GUI処理を実行する。
【０１５０】
次いで，通信部1234は，指定された第2のコア112が実行する第2_bのサブスレッド1242b'に，第2の処理の実行開始指示を行う(ステップS5)。第2_bのサブスレッド1242b'は，前記指示を受け付けると，図5のステップS12でYES，ステップS13でYESと判定し，第1の処理を終了し，第2の処理を実行する(ステップS14)。ここでは，第2_bのサブスレッド1242b'は，画像処理を実行する。
【０１５１】
次いで，通信部1234は，指定された第2のコア112以外のコアである，第1のコア111が実行する第2_bのサブスレッド1242bにサブスレッドの終了指示を行う(ステップS6)。第1のコア111が実行する第2_bのサブスレッド1242bは，自身の処理を終了する（ステップS16）。
【０１５２】
図12(D)は，上記ステップS14，ステップS16の処理の状態を模式的に示す。
【０１５３】
以上説明した処理により，同一のコアが，複数のスレッドの第2の処理を同時に実行することがない。そのため，例えばGUI処理など処理が遅延すると操作者に不快感を与えるような処理を第1のコアで実行させ，処理が遅延しても利用者に不快感を与えないような処理を第1のコアとは異なる第2のコアに実行させることができる。
【０１５４】
図8〜図12で説明した第2の処理の具体例は，あくまでも例示であり，説明した具体例に限定されるものではない。
【０１５５】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１５６】
（付記１）
複数の演算装置を備えた情報処理装置で実行されるプログラムであって，
前記演算装置を所定の動作状態に移行する第1の処理を前記演算装置の各々に実行させ，
指定された演算装置が前記所定の動作状態に移行した場合に，前記指定された演算装置に，前記第1の処理とは異なる第2の処理を実行させる
ことを特徴とするプログラム。
【０１５７】
（付記２）
付記1において，
前記指定された演算装置が前記所定の動作状態に移行した場合に，さらに，前記複数の演算装置の中で前記指定された演算装置以外の演算装置に，前記第1の処理を終了させる処理を実行させる
ことを特徴とするプログラム。
【０１５８】
（付記３）
付記2において，
前記演算装置の動作状態は，当該演算装置の使用率であって，
前記指定された演算装置に，前記指定された演算装置の使用率が所定の使用率以上になると，前記指定された演算装置が前記所定の動作状態に移行したと判定する処理を実行させる
ことを特徴とするプログラム。
【０１５９】
（付記４）
付記3において，
前記第1の処理は，前記演算装置の使用率を上昇させる処理であって，
前記第2の処理は，前記情報処理装置の操作者が所望する処理である
ことを特徴とするプログラム。
【０１６０】
（付記５）
複数の演算装置を備え，
前記演算装置の各々は，前記演算装置を所定の動作状態に移行する第1の処理を実行し，
指定された演算装置は，前記所定の動作状態に移行した場合に，前記第1の処理とは異なる第2の処理を実行する
ことを特徴とする情報処理装置。
【０１６１】
（付記６）
付記5において，
前記指定された演算装置が前記所定の動作状態に移行した場合に，前記複数の演算装置の中で，前記指定された演算装置以外の演算装置は，当該演算装置が実行する前記第1の処理を終了する
ことを特徴とする情報処理装置。
【０１６２】
（付記７）
複数の演算装置を備えた情報処理装置で実行される情報処理方法であって，
前記情報処理装置は，
前記演算装置を所定の動作状態に移行する第1の処理を前記演算装置の各々に実行させ，
指定された演算装置が前記所定の動作状態に移行した場合に，前記指定された演算装置に，前記第1の処理とは異なる第2の処理を実行させる，
ことを特徴とする情報処理方法。
【０１６３】
（付記８）
付記7において，
前記情報処理装置は，
前記指定された演算装置が前記所定の動作状態に移行した場合に，さらに，前記複数の演算装置の中で，前記指定された演算装置以外の演算装置に前記第1の処理を終了させる
ことを特徴とする情報処理方法。
【符号の説明】
【０１６４】
100…情報処理装置，11…CPU，111〜114…第1のコア〜第4のコア，12…メモリ，13…記憶装置，14…通信装置，15…タッチパネル，16…表示装置，17…記憶媒体読み取り装置，121…OS，122…アプリ，123…全体制御部，1231…サブスレッド発行部，1232…占有率調査部，1233…成否判定部，1234…通信部，1241〜124n…第1のサブスレッド〜第nのサブスレッド。
【図１】
2014191771.tif 000003
【図２】
2014191771.tif 000004
【図３】
2014191771.tif 000005
【図４】
2014191771.tif 000006
【図５】
2014191771.tif 000007
【図６】
2014191771.tif 000008
【図７】
2014191771.tif 000009
【図８】
2014191771.tif 000010
【図９】
2014191771.tif 000011
【図１０】
2014191771.tif 000012
【図１１】
2014191771.tif 000013
【図１２】
2014191771.tif 000014