(57)【要約】      （修正有）【課題】ローカル・チェックポイントのためにオフロード・プログラミング・モデルを利用する方法、装置およびシステムを提供する。【解決手段】一つまたは複数のソースおよび多数のシンクが実装されたコンピューティング環境において、ソースは、ソースによって実行管理されたジョブ・コード内のオフロード用として指定されたコード・セクションについて、オフロード・コンテキスト情報を生成し、シンクにオフロードする。シンクはオフロードされたコード・セクションを実行し結果データをソースに返す。シンクの健全性はモニタリングされ、障害の際にはソースは障害を起こしたシンクにオフロードされたコード・セクションに対応するオフロード・オブジェクトを取り出し、そのコード・セクションについてのオフロード・コンテキスト情報を再生成し、これを別のシンクに実行のために送る。【選択図】図２
2016115340.tif 000002
【特許請求の範囲】
【請求項１】
シンクをなす複数の計算エンティティに通信上結合されたソースをなす計算エンティティを含むコンピューティング環境において実装される方法であって：
前記ソースを使って実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を記憶する段階と；
オフロードされたコードの諸セクションについて、該コードの諸セクションがオフロードされたシンクによって生成された結果を受領する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを含む、
方法。
【請求項２】
前記ジョブを実行するために前記ソースを用いる段階と；
前記ジョブの実行の間に、シンクにオフロードされるべき一つまたは複数の第一の関数を含む第一のコード・セクションを検出する段階と；
第一のシンクのアドレス、前記第一のコード・セクションか前記一つまたは複数の第一の関数を同定する印かの一つおよび前記一つまたは複数の第一の関数についての一つまたは複数の関数パラメータを含む第一のオフロード・コンテキストを構築する段階と；
前記第一のオフロード・コンテキストを前記第一のシンクに送る段階と；
前記第一のオフロード・コンテキストに対応する第一のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第一のシンクによる前記一つまたは複数の第一の関数の実行に際して前記第一のシンクによって生成された第一の関数実行結果データを受領する段階と；
前記ソースが前記一つまたは複数の第一の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する段階とをさらに含む、
請求項１記載の方法。
【請求項３】
前記ジョブの実行の間に、シンクにオフロードされるべき一つまたは複数の第二の関数を含む第二のコード・セクションを検出する段階と；
第二のシンクのアドレス、前記第二のコード・セクションか前記一つまたは複数のセクション関数を同定する印かの一つおよび前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータを含む第二のオフロード・コンテキストを構築する段階と；
前記第二のオフロード・コンテキストを前記第二のシンクに送る段階と；
前記第二のオフロード・コンテキストに対応する第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第二のシンクが故障したことを同定する情報を受領するか、前記第二のシンクが故障したことを検出するか、前記第二のシンクが前記第二のコード・セクションの実行を完了し損なったことを検出し、それに応答して、
前記第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶から取り出し；
前記第二のオフロード・コンテキスト・オブジェクトを用いて、第三のシンクのアドレス、前記第二のコード・セクションもしくは前記第二のコード・セクションを同定する印および前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータを含む第三のオフロード・コンテキストを構築し；
前記第三のオフロード・コンテキストを前記第三のシンクに送り；
前記第三のオフロード・コンテキストに対応する第三のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶し；
前記第三のシンクによる前記一つまたは複数の第二の関数の実行に際して前記第三のシンクによって生成された第二の関数実行結果データを受領し；
前記ソースが前記一つまたは複数の第二の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する、
段階とをさらに含む、
請求項２記載の方法。
【請求項４】
前記第一のオフロード・コンテキストが、前記第一の関数結果が書き込まれるメモリ・バッファを同定する情報を含み、前記シンクが前記第一の関数結果を前記メモリ・バッファに書き込む、請求項２または３記載の方法。
【請求項５】
前記ソースと前記第一のシンクとの間にリモート直接メモリ・アクセス（RDMA）機構をセットアップする段階と；
RDMA書き込みを用いて前記第一の関数結果を前記メモリ・バッファに直接書き込む段階とをさらに含む、
請求項４記載の方法。
【請求項６】
前記ジョブの実行に先立って、前記一つまたは複数の第一の関数を含むライブラリを前記第一のシンクまたは前記第一のシンクが実装されているホスト装置に配布する段階と；
どのライブラリ関数を実行すべきかを同定する印を前記第一のオフロード・コンテキスト中に含める段階とをさらに含む、
請求項２ないし５のうちいずれか一項記載の方法。
【請求項７】
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階が、シンクが故障したことを判別するハートビート・モニタリング方式を使うことによって検出される、請求項１ないし６のうちいずれか一項記載の方法。
【請求項８】
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階が、タイムアウト・タイマーを使うことによって検出される、請求項１ないし７のうちいずれか一項記載の方法。
【請求項９】
前記ソースがサーバー・プラットフォーム内のホスト・プロセッサを含み、前記シンクの少なくとも一部が、前記サーバー・プラットフォーム内に設置された多集積コア（MIC）装置内のプロセッサ・コアを含む、請求項１ないし８のうちいずれか一項記載の方法。
【請求項１０】
前記ソースが、複数の多集積コア（MIC）装置が設定されているサーバー・プラットフォームを含み、前記シンクが、前記複数のMIC装置内のプロセッサ・コアを含む、請求項１ないし９のうちいずれか一項記載の方法。
【請求項１１】
前記ソースおよび前記シンクのそれぞれに対応する前記計算エンティティが、ラック内の一つまたは複数のスレッド（sled）またはシャーシ内のサーバー・ブレードおよびサーバー・モジュールの少なくとも一つを含む、請求項１ないし１０のうちいずれか一項記載の方法。
【請求項１２】
サーバー・プラットフォームであって、当該サーバー・プラットフォームは：
ホスト・メモリに結合されたホスト・プロセッサと；
前記ホスト・プロセッサに通信上結合された複数の拡張スロットと；
それぞれの拡張スロット内に設置された一つまたは複数の多集積コア（MIC）装置であって、各MIC装置は複数のプロセッサ・コアおよびオンボード・メモリを含む、MIC装置と；
拡張スロット内に設置されたまたは前記ホスト・プロセッサに通信上結合されているコンポーネントとして実装されたネットワーク・アダプターとを有しており、
前記サーバー・プラットフォームはさらに、前記ホスト・プロセッサおよび前記MIC装置内の前記プロセッサ・コアのうちの複数で実行されるよう構成されたソフトウェア命令を含み前記ソフトウェア命令は当該サーバー・プラットフォームが：
前記ホスト・プロセッサをソースとして、前記MIC装置内の前記複数のプロセッサ・コアの少なくとも一部をシンクとして構成する段階と；
前記のオンボードのMICメモリと前記ホスト・メモリとの間でメモリ・マッピングを構成する段階と；
前記ホスト・プロセッサ上で実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を、前記ネットワーク・アダプターに結合されたネットワークを介してアクセス可能な不揮発性記憶装置に記憶するために送信する段階と；
オフロードされたコード・セクションを前記シンク上で実行して結果データを生成する段階と；
前記結果データを前記ホスト・プロセッサにとってアクセス可能なメモリ・バッファに記憶する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを実行することを可能にするものである、
サーバー・プラットフォーム。
【請求項１３】
前記命令の実行が当該サーバー・プラットフォームがさらに：
前記ソースを介して前記ジョブの第一の部分を実行する段階と；
前記ジョブの実行の間に、一つまたは複数の第一の関数を含む、オフロードされるべき第一のコード・セクションを検出する段階と；
前記第一のコード・セクションをオフロードすべき先の第一のシンクを同定する段階と；
前記第一のシンクのアドレス、前記第一のコード・セクションか前記一つまたは複数の第一の関数を同定する印かの一つ、前記一つまたは複数の第一の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第一の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第一のオフロード・コンテキストを構築する段階と；
前記第一のオフロード・コンテキストを前記第一のシンクに転送する段階と；
前記第一のオフロード・コンテキストに対応する第一のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第一のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数の第一の関数を実行して結果データを生成する段階と；
前記結果データを前記メモリ・バッファに書き込む段階と；
前記ソースが前記第一の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する段階とを実行することを可能にするものである、
請求項１２記載のプラットフォーム・サーバー。
【請求項１４】
前記命令の実行が当該サーバー・プラットフォームがさらに：
前記ジョブの実行の間に、一つまたは複数の第二の関数を含む、オフロードされるべき第二のコード・セクションを検出する段階と；
前記第二のコード・セクションをオフロードすべき先の第二のシンクを同定する段階と；
前記第二のシンクのアドレス、前記第二のコード・セクションか前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第二のオフロード・コンテキストを構築する段階と；
前記第二のオフロード・コンテキストを前記第二のシンクに送る段階と；
前記第二のオフロード・コンテキストに対応する第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第二のシンクが故障したことを検出するか、前記第二のシンクが前記第二のコード・セクションの実行を完了し損なったことを検出し、それに応答して、
前記第二のシンクが故障したことを同定する情報を受領するか、前記第二のシンクが故障したことを検出するか、前記第二のシンクでの前記第二のコード・セクションの実行がエラーを起こしたことを検出し、それに応答して、
前記第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶から取り出し；
前記第二のオフロード・コンテキスト・オブジェクトを用いて、第三のシンクのアドレス、前記第二のコード・セクションもしくは前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第三のオフロード・コンテキストを構築し；
前記第三のオフロード・コンテキストを前記第三のシンクに送り；
前記第三のオフロード・コンテキストに対応する第三のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶し；
前記第一の第三のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数のセクション関数を実行して結果データを生成し；
前記結果データを前記メモリ・バッファに書き込み；
前記ソースが前記一つまたは複数の第二の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する、
段階とを実行することを可能にするものである、
請求項１３記載のサーバー・プラットフォーム。
【請求項１５】
シンクの障害を検出するハートビート・モニタ方式を実装するようさらに構成されている、請求項１４記載のシステム。
【請求項１６】
前記第二のシンクでの前記第二のコード・セクションの実行がエラーを起こしたことを検出するためにタイムアウト・タイマーを実装するようさらに構成されている、請求項１４または１５記載のシステム。
【請求項１７】
当該サーバー・プラットフォームが第一および第二のソケットを含むデュアル・ソケット・サーバーを含み、各ソケットは、それぞれのホスト・メモリに結合されたそれぞれのホスト・プロセッサと、該ホスト・プロセッサに通信上結合された少なくとも一つの拡張スロットとを含み、請求項１２記載のホスト・プロセッサおよびホスト・メモリが前記第一のソケット内の第一のホスト・プロセッサおよび第一のホスト・メモリをなす、請求項１２ないし１６のうちいずれか一項記載のサーバー・プラットフォーム。
【請求項１８】
前記第一および第二のソケットのそれぞれが、それぞれのMIC装置が設置されている一つまたは複数の拡張スロットを含み、前記第一および第二のソケット内の前記拡張スロットに設置されている前記MIC装置の前記プロセッサ・コアにおける前記シンクが単一ドメインとして実装される、請求項１７記載のサーバー・プラットフォーム。
【請求項１９】
前記第一および第二のソケットのそれぞれが、それぞれのMIC装置が設置されている一つまたは複数の拡張スロットを含み、各ソケットはさらに、そのソケットのホスト・プロセッサおよびそのソケットについての一つまたは複数のそれぞれの拡張スロットに設置されている一つまたは複数のMIC装置内の前記プロセッサ・コアのうちの複数で実行されるよう構成されたソフトウェア命令を含み、該ソフトウェア命令は各ソケットが：
そのソケット内の前記ホスト・プロセッサをソースとして、前記MIC装置内の前記複数のプロセッサ・コアの少なくとも一部をシンクとして構成する段階と；
そのソケットについての拡張スロットに設置された各MIC装置について、前記のオンボードのMICメモリと前記ホスト・メモリとの間でメモリ・マッピングを構成する段階と；
前記ホスト・プロセッサ上で実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を、前記ネットワーク・アダプターに結合されたネットワークを介してアクセス可能な不揮発性記憶装置に記憶するために送信する段階と；
オフロードされたコード・セクションを前記シンク上で実行して結果データを生成する段階と；
前記結果データを前記ホスト・プロセッサにとってアクセス可能なメモリ・バッファに記憶する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを実行することを可能にするものである、
請求項１８記載のサーバー・プラットフォーム。
【請求項２０】
前記第一のソケットの前記拡張スロットに設置された前記一つまたは複数のMIC装置の前記プロセッサ・コアに対応する前記シンクは、前記第一のソースによって管理される第一のドメイン内に実装され、前記第二のソケットの前記拡張スロットに設置された前記一つまたは複数のMIC装置の前記プロセッサ・コアに対応する前記シンクは、前記第二のソースによって管理される第二のドメイン内に実装される、請求項１９記載のサーバー・プラットフォーム。
【請求項２１】
前記第一および第二のホスト・プロセッサの少なくとも一つでの前記ソフトウェア命令の実行は、当該サーバー・プラットフォームがチェックポイント動作を実行することを可能にし、該チェックポイント動作のもとでは前記第一および第二のソケットで並列に実行されるそれぞれのジョブに対応する状態情報が、前記ネットワーク・アダプターを介してアクセスされる不揮発性記憶に書き込まれる、請求項２０記載のサーバー・プラットフォーム。
【請求項２２】
サーバー・プラットフォーム内の計算エンティティによって実行されるコンピュータ・プログラムであって、前記サーバー・プラットフォームは：
第一の計算エンティティを含むホスト・プロセッサと；
前記ホスト・プロセッサに結合されたホスト・メモリと；
前記ホスト・プロセッサに通信上結合された複数の拡張スロットと；
それぞれの拡張スロット内に設置された一つまたは複数の多集積コア（MIC）装置であって、各MIC装置は計算エンティティを含む複数のプロセッサ・コアおよびオンボード・メモリを含む、MIC装置と；
拡張スロット内に設置されたまたは前記ホスト・プロセッサに通信上結合されているコンポーネントとして実装されたネットワーク・アダプターとを含んでおり、
前記ホスト・プロセッサおよび前記一つまたは複数のMIC装置内のプロセッサ・コアによる前記コンピュータ・プログラムの実行は、前記サーバー・プラットフォームが：
前記ホスト・プロセッサをソースとして、前記一つまたは複数のMIC装置内の前記複数のプロセッサ・コアの少なくとも一部をシンクとして構成する段階と；
各MIC装置について、そのMIC装置の前記のオンボードのMICメモリと前記ホスト・メモリとの間でメモリ・マッピングを構成する段階と；
前記ホスト・プロセッサ上で実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を、前記ネットワーク・アダプターに結合されたネットワークを介してアクセス可能な不揮発性記憶装置に記憶するために送信する段階と；
オフロードされたコード・セクションを前記シンク上で実行して結果データを生成する段階と；
前記結果データを前記ホスト・プロセッサにとってアクセス可能なメモリ・バッファに記憶する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを実行することを可能にする、
コンピュータ・プログラム。
【請求項２３】
前記ホスト・プロセッサおよび前記一つまたは複数のMIC装置内のプロセッサ・コアによる前記コンピュータ・プログラムの実行は、前記サーバー・プラットフォームが：
前記ソースを介して前記ジョブの第一の部分を実行する段階と；
前記ジョブの実行の間に、一つまたは複数の第一の関数を含む、オフロードされるべき第一のコード・セクションを検出する段階と；
前記第一のコード・セクションをオフロードすべき先の第一のシンクを同定する段階と；
前記第一のシンクのアドレス、前記第一のコード・セクションか前記一つまたは複数の第一の関数を同定する印かの一つ、前記一つまたは複数の第一の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第一の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第一のオフロード・コンテキストを構築する段階と；
前記第一のオフロード・コンテキストを前記第一のシンクに転送する段階と；
前記第一のオフロード・コンテキストに対応する第一のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第一のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数の第一の関数を実行して結果データを生成する段階と；
前記結果データを前記メモリ・バッファに書き込む段階と；
前記ソースが前記第一の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する段階とを実行することを可能にする、
請求項２２記載のコンピュータ・プログラム。
【請求項２４】
前記ホスト・プロセッサおよび前記一つまたは複数のMIC装置内のプロセッサ・コアによる前記コンピュータ・プログラムの実行は、前記サーバー・プラットフォームが：
前記ジョブの実行の間に、第二の関数を含む、オフロードされるべき第二のコード・セクションを検出する段階と；
前記第二のコード・セクションをオフロードすべき先の第二のシンクを同定する段階と；
前記第二のシンクのアドレス、前記第二のコード・セクションか前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第二のオフロード・コンテキストを構築する段階と；
前記第二のオフロード・コンテキストを前記第二のシンクに送る段階と；
前記第二のオフロード・コンテキストに対応する第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第二のシンクが故障したことを同定する情報を受領するか、前記第二のシンクが故障したことを検出するか、前記第二のシンクでの前記第二のコード・セクションの実行がエラーを起こしたことを検出し、それに応答して、
前記第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶から取り出し；
前記第二のオフロード・コンテキスト・オブジェクトを用いて、第三のシンクのアドレス、前記第二のコード・セクションもしくは前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第三のオフロード・コンテキストを構築し；
前記第三のオフロード・コンテキストを前記第三のシンクに送り；
前記第三のオフロード・コンテキストに対応する第三のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶し；
前記第一の第三のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数のセクション関数を実行して結果データを生成し；
前記結果データを前記メモリ・バッファに書き込み；
前記ソースが前記一つまたは複数の第二の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する、
段階とを実行することを可能にする、
請求項２３記載のコンピュータ・プログラム。
【請求項２５】
前記ホスト・プロセッサによる前記コンピュータ・プログラムの実行は、前記ホスト・プロセッサが、シンクが故障したことを判別するハートビート・モニタリング方式を使うことによって、あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出することを可能にする、請求項２２ないし２４のうちいずれか一項記載のコンピュータ・プログラム。
【請求項２６】
請求項２２ないし２５のうちいずれか一項記載のコンピュータ・プログラムを記憶しているコンピュータ可読記憶媒体。
【発明の詳細な説明】
【背景技術】
【０００１】
高性能コンピューティング（HPC:  high-performance  computing）は近年、その利用および関心が実質的に高まっている。歴史的に、HPCは一般にいわゆる「スーパーコンピュータ」に関連付けられていた。スーパーコンピュータは1960に導入され、当初および数十年にわたって主としてコントロール・データ・コーポレイション（CDC）のシーモア・クレイ、クレイ・リサーチおよびクレイの名前またはモノグラムを帯びるその後の会社によって作られた。1970年代のスーパーコンピュータは数個のプロセッサを使うだけであったが、1990年代には数千のプロセッサをもつマシンが登場するようになり、より近年には数十万の「市販」プロセッサをもつ大規模並列スーパーコンピュータが実装されている。
【０００２】
実装されたものおよび研究用のもの両方を含め多くの型のHPCアーキテクチャならびにさまざまなレベルのスケールおよび性能がある。しかしながら、共通点は、プロセッサおよび／またはプロセッサ・コアのような計算ユニット（本稿では計算エンティティまたはコンピュート・エンティティとも称される）多数を相互接続して協働的に並列してタスクを実行させるというものである。近年のシステムオンチップ（SoC:  System  on  a  Chip）設計および提案のもとで、二次元（2D）アレイ、トーラス、リングまたは他の配位を使って、数十のプロセッサ・コアなどが単一のSoC上に実装されている。さらに、研究者は、数百またさらには数千ものプロセッサ・コアが3Dアレイにおいて相互接続される3D  SoCを提案している。別個のマルチコア・プロセッサおよびSoCが諸サーバー基板上で密接して配置されてもよく、それらのサーバー基板がバックプレーンなどを介して通信において相互接続される。もう一つの一般的なアプローチは、サーバーのラックにおいて計算ユニットを相互接続するというものである（たとえばブレード・サーバーおよびモジュール）。かつて世界最速のスーパーコンピュータであったとされるIBMのセコイアはサーバー・ブレード／モジュールの96個のラックを有し総計1,572,864個のコアをもち、ピーク性能で動作するときには7.9メガワットも消費する。
【０００３】
HPCは、複雑なジョブまたはタスクを解くためのワークロードが、並列処理アプローチを使って複数の計算エンティティにわたって分散されることを可能にする。これは、数千またさらには数十万のエンティティの使用に関わることがある。エンティティ障害の統計的な分布に鑑み、HPCジョブのために用いられるエンティティの数が増すにつれて、HPCジョブ中にエンティティ障害が発生するレートは指数関数的に高まる。この指数関数的な障害レートは、HPC業界ならびに商業的なクラウド・サービス・プロバイダーの間ではホットな問題となっている。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
エンティティ障害の可能性に対処するため、HPCジョブは、ジョブ（またはジョブのかなりの部分）をやり直す必要なくそのような障害からの復元を可能にする仕方で実行される。これは、チェックポイント・リスタート方式を通じて普通に行なわれている。ある通常のアプローチでは、チェックポイントが頻繁なレートで定期的に（チェックポイントどうしの間の時間期間はエポックとして知られる）、かつ同期した仕方で取られ、各エポックについて、チェックポイント群内のすべてのエンティティ上での処理が停止され、チェックポイント動作が各エンティティに対して実行され、それらのエンティティがリスタートされる。チェックポイント群の粒度はかなり粗く、数百または数千のエンティティを含むことがある。
【０００５】
各チェックポイントの間、データは何らかの形の不揮発性記憶（たとえば大容量記憶装置またはネットワークを通じてアセスされるそのような装置のアレイ）に書き込まれる。データはジョブ処理状態情報および各エンティティ上のソフトウェアの実行を介して生成されたデータの両方を含む。これは、かなりの量の記憶消費につながり、全体的な処理帯域幅の著しい割合が事実上無駄にされる。いくつかの場合には、この通常のチェックポイント・リスタート戦略の関連する記憶消費および実行制約が、実際の結果を、それほど持続可能ではなくし、それほど実際的でなくすことさえある。
【図面の簡単な説明】
【０００６】
本発明の以上の側面および付随する利点の多くは、付属の図面との関連で以下の詳細な説明を参照することにより一層よく理解されるので、より容易に認識されるであろう。図面において、特に断わりのない限り、同様の参照符号はさまざまな図を通じて同様の部分を指す。
【図１】HPC環境において使われる通常の並列処理方式の簡略化されたビューを示す概略図である。
【図２】実行可能ジョブに対応するコードのセクションを処理するためのオフロード・プログラミング・モデルの簡単な実装を示す概略図である。
【図３】ソースおよびシンクおよびフェイルオーバー・ハートビート・モニタによって実行される動作および論理を示す、組み合わせたフローチャートおよびメッセージ・フロー図である。
【図４】単一のドメイン内に実装される複数のシンクに接続されたソースを含むオフロード・ドメイン・トポロジーの第一の例を示す概略図である。
【図５】単一のドメイン内に実装される複数のシンクに接続されたソースの対に接続されたジョブ・ディスパッチャーを含むオフロード・ドメイン・トポロジーの第二の例を示す概略図である。
【図６】第一および第二のドメイン内に実装される複数のシンクに接続されたソースの対に接続されたジョブ・ディスパッチャーを含むオフロード・ドメイン・トポロジーの第三の例を示す概略図である。
【図７】オフロード・ファブリックを介して第一および第二のドメイン内のシンクに接続された複数のソースにジョブ・ディスパッチ・ファブリックを介して接続されたジョブ・ディスパッチャーを含むオフロード・ドメイン・トポロジーの第四の例を示す概略図である。
【図８】ポッド、ラック、トレイおよびスレッド（sled）を含むデータ・センターの物理的階層を示すブロック概略図である。
【図９】第一のソースとして実装される第一のホスト・プロセッサおよび第二のソースとして動作するよう構成される第二のホスト・プロセッサを含み、その中で複数のMICが実装されるデュアル・ソケット・サーバー・プラットフォームの概略図である。
【図１０】インテル（登録商標）Xeon  Phi（商標）MICコプロセッサを用いるある実施形態に基づく、MICコプロセッサ・ソフトウェアおよびホスト・ソフトウェアを含むMICコプロセッサPCIeカード上に実装されるソフトウェア・コンポーネントを含むソフトウェア・アーキテクチャを示すブロック概略図である。
【図１１】MIC内のエンジンの数を取得し、第一のエンジンへのハンドルを取得するために使われる命令の擬似コード・リスティングである。
【図１２ａ】COIプロセスを使う関数をオフロードするための、例示的なソース側擬似コード・リスティングである。
【図１２ｂ】COIプロセスを使う関数をオフロードするための、例示的なシンク側擬似コード・リスティングである。
【図１３ａ】バッファをセットアップし、使うための、例示的なソース側擬似コード・リスティングである。
【図１３ｂ】バッファをセットアップし、使うための、例示的なシンク側擬似コード・リスティングである。
【発明を実施するための形態】
【０００７】
ローカル・チェックポイントのためのオフロード・プログラミング・モデルをレバレッジするための方法、装置およびシステムの実施形態が本稿に記載される。以下の記述では、本発明の実施形態の十全な理解を提供するために数多くの個別的詳細が記載される。しかしながら、当業者は、本発明がそうした個別的詳細の一つまたは複数なしでも、あるいは他の方法、構成要素、素材等を用いてでも実施できることを認識するであろう。一方、よく知られた構造、素材または動作は、本発明の諸側面を埋没させるのを避けるため、詳細には示したり記載したりしていない。
【０００８】
本明細書を通じた「一つの実施形態」または「ある実施形態」への言及は、その実施形態との関連で記述される特定の特徴、構造または特性が本発明の少なくとも一つの実施形態に含まれることを意味する。よって、本明細書を通じた随所で「一つの実施形態では」または「ある実施形態では」といった句が出現することは、必ずしもみなが同じ実施形態を指しているわけではない。さらに、特定の特徴、構造または特性は一つまたは複数の実施形態において任意の好適な仕方で組み合わされてもよい。
【０００９】
明確のため、本願の図面における個々の構成要素は、特定の参照符号によってではなく図面におけるそのラベルによって参照されることもある。さらに、（特定の構成要素ではなく）特定の型の構成要素を指す参照符号が、参照符号に「典型的（typical）」を意味する「(typ)」を続けたものをもって示されることがある。これらの構成要素の構成は、存在しうるが簡明のため図面に示されていない類似の構成要素またはそれ以外に別個の参照符号でラベル付けされていない同様の構成要素についての典型であることが理解される。逆に、「(typ)」はその構成要素、要素等がその開示される機能、実装、目的等のために典型的に使われることを意味するものとは解釈されない。
【００１０】
本稿に開示される実施形態のもとで、オフロード・プログラミング・モデルがローカル・チェックポイント方式との関連で使われる。これは、性能を改善し、通常のチェックポイントに関連する記憶および／またはネットワーク・トラフィックを軽減しつつ、高い信頼性の要求を満たす。ある側面では、本アプローチは、HPC環境における実装のために、特に大規模なHPCジョブのために有利である。しかしながら、実行中のエンティティが小さなハンドヘルド装置からはるか高機能のサーバーまで幅がありうる不均一なコンピューティング環境と一緒でもきわめてよく機能する。
【００１１】
図１は、HPC環境において使われる通常の並列処理方式の簡略化されたビューを示している。図１に示されるように、第一の計算エンティティによってホストされるジョブ・ディスパッチャー１００が相互接続１０４を介して複数の計算エンティティ１０２に結合されている。一般に、HPC環境は、全体的なジョブまたはタスクが多数の計算エンティティ上で並列に実行されるより小さなジョブに分割される並列処理アプローチを使って、全体的なジョブまたはタスクを解くために使われる。ジョブ・ディスパッチャーは、後述するように、該より小さなジョブを計算エンティティに発送し、チェックポイントを協調させることを受け持つ。また、大きなタスクは、階層構造などにおいて構成される複数のジョブ・ディスパッチャーに関わることがありうる。階層構造における所与のレベルについての計算エンティティの集成は、クラスター、ジョブ・グループなどといったさまざまな用語で称されうる。ただし、ジョブ・グループは複数のクラスターを含むことがある。
【００１２】
一般に、計算ノートは、ジョブまたはタスクに対応するソフトウェアを実行できる任意のエンティティを含みうる。計算エンティティは、サーバー、コンピュータ、コンピューティング装置、プロセッサおよびプロセッサ中のコアを含むがそれに限られない。相互接続１０４は、ネットワーク・リンク（たとえば、イーサネット（登録商標）、InfiniBandなど）、高速シリアル相互接続（たとえば周辺コンポーネント相互接続エクスプレス（PCIエクスプレスまたはPCIe））およびプロセッサ、システムオンチップ（Soc）内の相互接続を含むさまざまな型の相互接続を代表する一般的な相互接続である。さらに、不均質な環境では、計算エンティティは、異なる型の相互接続を含む一つまたは複数の相互接続を介して、ジョブ・ディスパッチャーおよび／または他の計算エンティティに接続されうる。
【００１３】
図１にさらに示されるように、ジョブ・ディスパッチャー１００は、それぞれの計算エンティティ１０２にジョブ１０６を発送する。一般に、各ジョブ１０６は、計算エンティティによって実行されるべき実行可能コードを含んでいてもよい。ジョブ１０６は、演算対象となるデータを含んでいてもよく、および／または前記コード自身が前記計算エンティティによって記憶から取り出され、前記コードの実行を介して操作され、次いで記憶されるべきデータを参照してもよい。例示の目的のため、データは、当技術分野においてよく知られている単一の記憶装置、記憶アレイまたは他の記憶手段を含みうるネットワーク記憶１０８に記憶される。エンティティのクラスターまたは前記計算エンティティ自身が、ジョブ関係のデータが記憶されるローカル記憶を含んでいてもよい。さらに、システム性能を高めるために、さまざまなキャッシング方式が用いられてもよい。
【００１４】
計算エンティティ１０２−１に割り当てられるジョブAの抽象的な描画が図１に示されている。このジョブは、Foo()、Bar()、…、Qux()とラベル付けされた複数の関数を含むメイン・ループを含む実行可能コードを含む。所与のジョブは、完全な実行可能形式（たとえばスタンドアローンのアプリケーション）を含んでいてもよく、あるいはコード・モジュールなどを含んでいてもよい。いくつかの実装のもとでは、ジョブ・ディスパッチャーは、まず、実行可能形式またはモジュールを計算エンティティに発送し、その後その実行可能形式またはモジュールによって操作されるデータを送る（または他の仕方で該データの位置を特定する）のでもよい。簡単のため、一組のジョブ１０６はそれぞれの計算エンティティ１０２に発送されるものとして示されている。実際上は、全体的なジョブまたはタスクを処理している間に新しいジョブが動的に生成され、さまざまな計算エンティティに非同期的に発送されてもよい。ある共通の方式のもとで、計算エンティティは自らの可用性を「広告」し、ジョブ・ディスパッチャーはどの計算エンティティが所与のジョブを送られるかを、可用性、処理機能およびメモリ資源などの事情に基づいて動的に決定する。
【００１５】
並列処理アーキテクチャの性質のため、すべてのジョブが成功裏に完了することが重要であり、さもなければ全体的なタスクは失敗する。ある種のジョブの出力がその後のジョブの入力を与えるので、たとえ単一の計算エンティティの障害であっても全体的な失敗につながりうる。この問題に対処するためのさまざまなアプローチがあり、同じジョブを複数のエンティティに発送して次いで該ジョブの最初の成功裏の完了をその後のジョブのために使うことが含まれる。しかしながら、（同じジョブを発送された諸エンティティのうちの）最初に完了するのでないジョブに対して作業しているエンティティの処理帯域幅が最終的には使われないことになるので、このアプローチは無駄が多い。
【００１６】
もう一つのアプローチは、定期的なチェックポイント／リスタート・シーケンスを用いる。ある通常のチェックポイント方式のもとでは、以下の動作が実行される。第一に、いつどこでチェックポイントを取るべきかの決定が（ディスパッチャーによってまたは階層中でより上位のエンティティによって）される。次いで、バッチにされたジョブ内のすべての実行中のエンティティに対して「静穏（quiesce）」要求（単数または複数）が発される。さらに進む前に、プロセスはすべてのエンティティが静穏要求を受け取り確認してその実行をサスペンドする（あるいはさもなければサスペンド状態にあることを確認通知する）のを待つ。すべてのエンティティが記憶書き込みの完了を確認通知する間、第二の待ち時間が発生する。その結果、完了がそれらのエンティティに伝達される。
【００１７】
チェックポイント完了の伝達に続いて、リスタート・シーケンスが開始される。第一に、ジョブが、新たに割り当てられたエンティティに改めて発送される（すなわち、新たな計算エンティティに発送される）。次いで、各エンティティはその保存されたコンテキストを記憶から読み、再開準備ができたことを確認通知する。すべてのエンティティが自分が準備できたことを確認通知するまで待ち期間が続き、すべてのエンティティが自分が準備できたことを確認通知した時点で、再開するよう再開信号が各エンティティに送られる。
【００１８】
以上の通常のアプローチには多くの問題がある。その一部はスケーリングが大きくなると悪化する。第一に、エンティティに命令を通信し、状態を返すだけのために膨大なネットワーク・トラフィック・オーバーヘッドが生じる。第二に、各エポックの間に、各エンティティについてのコンテキストが保存されるときに、バースト記憶動作がある。典型的なネットワーク記憶方式は限られた入出力（IO）帯域幅をもち、記憶に対する同時アクセスを提供することができない。むしろ、各記憶アクセス要求は逐次的な仕方で扱われる必要がある。性能を改善するためにさまざまなキャッシング方式が一般に使われることを注意しておく。また、各エンティティのコンテキストを書き出すことは、特に大規模なジョブについては、かなりの量の記憶スペースを必要とする。
【００１９】
本稿に開示される実施形態の側面では、異なるアプローチが取られる。それらの実施形態は、通常のチェックポイント／リスタート方式のもとでアプリケーションをコーディングする人および／または操作者による手動の挿入に比べ、自動的かつ日和見的に適正なチェックポイントを定義するオフロード・プログラミング・モデルをレバレッジする。また、実行中のエンティティはサスペンドされない。その結果、プロセッサ・サスペンドに起因する処理帯域幅の損失がもはや存在しなくなるので、パフォーマンスが向上する。同期があるとすればその量は、通常の方式のもとでのグローバルな長ったらしい同期オーバーヘッドに比して、著しく低減される。状態／コンテキスト保存動作は分解され、全体的なジョブ実行を通じて拡散されうる。これは、記憶帯域幅についても記憶スペースについても競合しうるバースト記憶IO動作を著しく軽減する。
【００２０】
ある側面のもとでは、知的な事前計画された記憶セットアップがドメイン形成の間に実行される。これは、大きな並列ジョブ・スケーリング懸念に対処するための計算エンティティおよび記憶装置の最適なトポロジー配置を許容する。完全なプロセス・イメージが記憶されることを要求しないので、保存される状態／コンテキストのサイズは実質的に、より小さくなる。これは、リスタート（単数または複数）のためのよりよい成功レートおよびより少ない記憶スペースの使用につながる。
【００２１】
オフロード・プログラミング・モデルの上に構築されて、開示されるアプローチはバッチ化されたジョブをより小さな仮想ワークロード・ドメインに分解する。各ドメインは自分自身のローカルなチェックポイントをもつ。さらに、本方法は、再帰的な仕方で実装できる。オフロード・プログラミング・パラダイムから継承されて、本アプローチは、クラスタリングされる計算エンティティが異なるCPUアーキテクチャから構成されていてもよいおよび／または異なるオペレーティング・システムによってサポートされている不均質なコンピューティング環境について特に好適である。
【００２２】
概観として、図２は、所与のジョブに対応するコードのセクションを処理するためのオフロード・プログラミング・モデルの簡単な実装の図を描いている。ホスト・マシンを有し、「ソース」２００として動作する処理エンティティが、相互接続２０８を介して、通信において、「シンク」２０２、２０４および２０６を有する三つのオフロード・マシンと結合されている。この例では、図１のジョブAについての三つの関数Foo()、Bar()およびQux()の実行はソース２００からそれぞれのシンク２０２、２０４および２０６にオフロードされる。
【００２３】
図３のフローチャートおよびメッセージ・フロー図３００をさらに参照するに、ある実施形態に基づくオフロード・プログラミング・モデル・チェックポイント方式は次のように実装される。図３に示されるエンティティは、ソース３０２と、フェイルオーバー・ハートビート・モニタ３０４と、シンク３０６を有するオフロード・エンティティとを含む。図示していないが、実際の実装は複数のシンク・エンティティを含む。一般に、フェイルオーバー・ハートビート・モニタ３０４は、ソースまたは前記ソースでも前記シンクでもない（図示しない）別個のエンティティにおいて実装されてもよい。
【００２４】
ソース３０２について描かれる動作はブロック３０８で始まる。ここで、ソースはオフロード・プログラミング・モデルに基づく実行可能な構造をもつ。次いで、前記実行可能な構造中の各オフロード・コード・セクションについて、メイン・ループが描かれている。これはループ開始およびループ終了ブロック３１０および３１２によって描かれている。次いで、ブロック３１４、３１６、３１８によって描かれる動作が、各オフロードされたコード・セクションについて、ループごとに、継続的に実行される。
【００２５】
第一に、ブロック３１４において、オフロード・コンテキストが構築される。一般に、オフロード・コンテキストは、当該オフロードが要求に際してリスタートされるための十分な情報を含むべきである。オフロード・コンテキストは、当該ワークロードに関連する、シンク識別情報、プログラム・バイナリーまたはライブラリ参照、バッファ・データ、環境変数および／または関数パラメータといった情報を含むべきである。ある実施形態では、オフロード・コンテキストは、（オフロード・コードを実行するシンクの）リンク・アドレス、プログラム・コード・セクション・バイナリーまたはオフロードされるコード・セクションに対応する前記一つまたは複数の関数を含む以前に配送されたライブラリへの参照、環境変数、関数パラメータおよびバッファ・マッピング情報を含む。任意的に、下記に記載されるように、バッファ・マッピングのいくつかの側面は、前もって構成されてもよい。次に、非同期的に実行される一対の関係する動作がある。ブロック３１６では、ブロック３１４において生成されたオフロード・コンテキストが、シンク３０６によって描かれるような該当するシンク装置に送られる。関連して、ブロック３１４において生成されたオフロード・コンテキストに対応するコンテキスト・オブジェクトは、ブロック３１８において、ネットワーク記憶１０８によって描かれるような不揮発性記憶にプッシュされる。任意的に、コンテキスト・オブジェクトは、ソース・プラットフォームによって提供されるオンボード記憶にプッシュされることができる。別のオプションのもとでは、コンテキスト・オブジェクトは、ネットワーク記憶にミラーされるオンボード記憶に書き込まれる。
【００２６】
簡単のため、オフロード・コード・セクションはシンク３０６に送られるものとして描かれている。ある実際の実装では、オフロードされたコード・セクションは複数のシンクに送られる。所与のシンクは、全体的なジョブの実行中に、複数のオフロードされたコード・セクションを受け取る可能性がある。
【００２７】
シンク３０６のブロック３２０および判断ブロック３２２において描かれるように、シンク装置はソース３０２からの要求があるかどうか傾聴するリスナーを含む。たとえば、そのようなリスナーは当技術分野においてよく知られており、ソース３０２と通信するために使われる特定のポートで傾聴することまたは他の仕方でソース３０２からの通信（たとえば、ソース３０２から発する通信についてのソース・アドレスを使って検出される）があるかどうか傾聴することを含んでいてもよい。ひとたびオフロード・コンテキストが検出された要求を介して受領されたら、ブロック３２４および完了ブロック３２６によって描かれるように、オフロード・コンテキスト・コードにおいて定義されている関数（単数または複数）がシンク３０６によって完了まで走らされる（すなわち、実行される）。
【００２８】
コード・セクションの完了に際して、関数結果に対応する関数結果データ３２８は、図２を参照して上記で論じたように、ソースに返される。いくつかの実施形態では、データは、オフロード・コンテキストによって同定されるメモリ・バッファに直接該データを書くことによって返される。他の実施形態では、たとえばシンクがソースからリモートであるとき、結果データ３２８はパケット化された仕方で返され、パケット化されたデータの受領器が結果データ３２８を書き込むべきバッファを決定するのに使う情報を含む。
【００２９】
任意的なブロック３３０では、オフロードされたコード・セクションはソースによって完了されたとマークされる。コード・セクションを明示的に完了とマークすることに加えて、どのコード・セクションが完了したかを判別するための他の技法がある。たとえば、各オフロードされたコンテキストのオブジェクト・コンテキストがその関数を実行するシンクを同定するので、同じシンクに対するその後の要求がなされるとき、そのことは暗黙的に、前の要求が完了していることを示す。
【００３０】
進行中のプロセスの間に、シンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出するための手段が設けられる。これは、ループ開始およびループ終了ブロック３３２および３３４によって画定される動作および論理を含む。これらは、実行が成功裏に完了したと確証されるまたは失敗が検出されるまで、実行のためにシンクに発送された各オフロード・コード・セクションについて継続的に実行される。図３にさらに示されるように、ループ開始およびループ終了ブロック３１０および３１２ならびにループ開始およびループ終了ブロック３３２および３３４によって定義されるループは、非同期的に実行される。
【００３１】
ある実施形態のもとでは、フェイルオーバー・ハートビート・モニタ３０４が、クラスター内のシンク・エンティティの健全性をモニタリングするよう構成される。あるいはさもなければ、フェイルオーバー・ハートビート・モニタ３０４は、シンク・エンティティとして動作している計算エンティティの一つまたは複数のグループをモニタリングするよう構成されていてもよい。ある実施形態では、シンク・エンティティの健全性は、モニタリング・コンポーネントまたはエンティティがハートビート・メッセージをもって定期的にモニタリングされるエンティティを「ピング」して、モニタリングされるエンティティ（この例ではシンク３０６）が「アライブ」メッセージまたは適正に動作していることを示す信号を返す、よく知られるハートビート技法を使って決定される。
【００３２】
図３の図示した実施形態では、これは次のように実装される。ブロック３３６および判断ブロック３３８を含むループによって描かれるように、フェイルオーバー・ハートビート・モニタ３０４は定期的にハートビート・メッセージをもってシンク３０６をピングする。このループは、シンク３０６がアライブ・メッセージまたは信号を返し損なうまで続けられ、返し損なったら判断ブロック３３８の答えがNOになる。任意的なブロック３４０において、シンク３０６のためのバックアップ（たとえば交換用）エンティティが選択される。任意的に、この選択はソース３０２によってなされてもよい。たとえば、各コード・セクションが、ソース３０２によって動的に選択される利用可能なシンクにオフロードされる日和見実装では、ブロック３４０においてバックアップを選択する必要はないことがある。
【００３３】
ブロック３４２では、フェイルオーバー・ハートビート・モニタ３０４はソース３０２にシンク障害を通知する。フェイルオーバー・ハートビート・モニタがソース３０２とは別個のエンティティとして実装される場合、障害を起こしたシンクを（たとえば該シンクのアドレス、シンク識別子（ID）などを使って）同定するメッセージが相互接続３０７を通じてソース３０２に送られる。任意的に、交換用シンクがブロック３４０において同定されている場合、障害通知は交換用シンクから送られてもよい。フェイルオーバー・ハートビート・モニタ３０４がソース３０２内に実装される場合には、障害通知メッセージを相互接続を通じて送る必要はなく、障害通知は内部的にソース３０２内で転送される。
【００３４】
判断ブロック３４４は、オフロードされたコード・セクションのリスタートを要求する障害が起こったかどうかを判定するために使われる。フェイルオーバー・ハートビート・モニタ３０４からの障害通知を受領すると、判断ブロック３４４の答えがYESになり、これはシンク回復またはフェイルオーバー・プロセスを開始する。上述したように、障害通知は障害を起こしたシンク（または他の仕方でそのオフロードされたセクションの実行を成功裏に完了し損なったシンク）を同定する。こうして、シンク３０２は、ブロック３４６に描かれるように、記憶１０８から、障害を起こしたシンクに送られた最後のオフロード・コンテキストに対応するコンテキスト・オブジェクトを取り出し（すなわち「プル」し）、オフロード・コンテキストを再構築し、それをブロック３４０において交換のために選択されたシンクに送ることができる。任意的に、ソース３０２は、再構築されたオフロード・コンテンツをどのシンクに送るべきかを決定してもよい。
【００３５】
判断ブロック３４８および判断ブロック３４４に戻るループによって描かれるように、障害検出動作は、所与のオフロードされたコード・セクションについて、該オフロードされたコード・セクションの実行が完了されるまで（または障害の検出が生起するまで）、継続的に実行される。判断ブロック３４８からループ終了ブロック３３４に渡る矢印によってさらに描かれるように、本ループにおける動作および論理は、並列に複数のシンクに発送された、オフロードされた諸コード・セクションについて実行される。
【００３６】
ある任意的な方式のもとでは、シンクがオフロードされたコード・セクションの実行を完了し損なうことを検出するために、タイムアウト・タイマーなどが使われてもよい。たとえば、あるシンクはいまだ適正に動作している（よってハートビート・メッセージに対しては「アライブ」応答を提供し続ける）もののオフロードされたコード・セクションの実行中にエラーが発生し、該コード・セクションの実行の完了が妨げられるという事例がありうる。タイムアウト・タイマーを使うことによって、オフロードされたコード・セクションがタイムアウト期間内にソース３０２に返されないという指示があれば、オフロードされたコード・セクションの実行が失敗したと推定される。一般に、異なるコード・セクションについてのタイムアウト期間は、コード・セクションの複雑さおよびそのコード・セクションがオフロードされるシンクの処理機能に依存して変わりうる。例解のために、図３は、開始タイマー・アイコン３５０および満了タイマー・アイコン３５２およびクリアされたまたはリセットされたタイマー・アイコン３５４を含んでいる。
【００３７】
ある実施形態では、タイムアウト・タイマー実装は次のように機能する。ブロック３１６におけるオフロードされたコード・セクションの発送との関連で、該オフロードされたコード・セクションがオフロードされたシンクによって完了されると見積もられる時間期間を使って、好ましくは何らかの誤差マージンが加えられて、タイムアウト・タイマーが開始される。タイムアウト・タイマーは、クリア／リセットされるか満了されるまでカウントダウンする。完了ブロック３２６に戻って、オフロードされたコード・セクションの完了時に、判断ブロック３４８の結果がYESになり、そのコード・セクションは完了ブロック３５６において完了されたと示される。これは、カウントダウン・タイマーをクリア／リセットもする。しかしながら、オフロードされたコード・セクションが完了されたことを検出する前にカウントダウン・タイマーが満了したら、満了タイマー・アイコン３５２によって描かれるように、判断ブロック３３６に通知が与えられる。その結果、YESの答えとなり、オフロードされたコード・セクションは再構築され、以前と同様に、別のシンクに発送される。ある実施形態では、カウントダウン・タイマーの各インスタンスは、それが関連付けられているオフロード・コンテキストを同定する印（indicia）を含み、正しいコンテキスト・オブジェクトがブロック３４６において記憶から引き出されることができる。
【００３８】
いくつかの実装では、さまざまな関数の処理がパイプライン式にセットアップされる。たとえば、ある関数の処理からの結果が別の関数への入力として使われる。さらに、関数は、逐次的な仕方で、たとえば処理ループなどを介してデータのセットを生成するよう構成されていてもよい。オフロード・コンテキストにおいてシンクに渡されるメモリ・バッファ情報は、データ・セットが書き込まれるFIFO（先入れ先出し）バッファを参照してもよく、該セット中の各データ項目が関数の実行を介して生成されるにつれて、FIFOバッファ中の適切な「スロット」に書き込まれる。これは、中間的なパイプライン・データが該当するシンク・エンティティと交換される任意的なブロック３５８によって描かれている。
【００３９】
図３をさらに参照しつつ図２に戻ると、例示的なmain()実行可能コードの実行は、次のようにしてホスト・マシン２００によって実装される。ソース２００は、ジョブ・ディスパッチャーから受領するジョブ・コードの実行を管理することを受け持つ。これは、ソース上での、ジョブの実行可能コードの諸部分の実行を含む。ジョブ・コードが実行されるにつれて、該実行を行なっている計算エンティティ（たとえば、プロセッサ、サーバー、プロセッサ・コアなど）がオフロード命令またはオフロードされるべき次のコード・セクションを指示する同様の印に遭遇および／またはこれを検出する。具体的な実装に依存して、オフロードの扱いは、オフロードされるコード・セクションが実行のために送られるべき特定のシンクを指定する仕方で構築されてもよく、シンクの選択は利用可能なシンクに基づいて動的に選択されてもよく、あるいは両者の組み合わせが使われてもよい。
【００４０】
図２に示されるように、Main()コード・セクションの先頭付近に#Offload_Function_Fooプラグマがある。これは関数Foo()をオフロードするために生成されるコンパイラ命令を表わす。たとえば、後述するように、オフロードされる関数を使って実行されるソフトウェアの開発者は、コンパイラに、コードのどの部分がオフロードされるべきかを指示するために、ソース・コード中でプラグマなどを使ってもよい。オフロード命令に遭遇するおよび／またはオフロード命令を検出するのに応答して、ブロック３１４においてオフロード・コンテキストを生成し、該オフロード・コンテキストがシンク２０２に送られ、対応するコンテキスト・オブジェクト（CO）２１０が生成されてブロック３１８でネットワーク記憶１０８にプッシュされることによって、該当する関数コードがオフロードされる。Main()コードのその後の実行の間に同様のオフロード印が検出され、その結果、関数Bar()がシンク２０４にオフロードされ、それに関連して、対応するコンテキスト・オブジェクト２１２がネットワーク記憶１０８にプッシュされ、関数Qux()がシンク２０６にオフロードされ、それに関連して、対応するコンテキスト・オブジェクト２１４がネットワーク記憶１０８にプッシュされる。
【００４１】
シンク２０２、２０４および２０６のそれぞれは、それにオフロードされたコード・セクションを実行し、Main()コードの並列実行につながる。ある関数の実行の完了に際して（あるいはパイプラインされる実行をサポートするデータのセットを生成する関数の実行の間に）、関数結果データは、オフロード・コンテキストに含まれていたまたは他の仕方で事前にセットアップされたバッファ・マッピング・データを介して同定されうる該当するメモリ・バッファに結果データを書き込むことによって、ソースに返される。たとえば、バッファ・マッピング・データは、結果データが書き込まれるべきバッファの先頭のアドレスを同定してもよい。これは、オフロードされた関数Foo()、Bar()およびQux()のそれぞれについて同様の仕方で実行され、結果データはソース２００にとってアクセス可能な該当するバッファに書き込まれる。
【００４２】
結果データをバッファに書き込むこのオフロード方式の効果は、Main()コードがソースによって実行され続けることができ、結果データが、あたかもソースがオフロードされたコードを自ら実行したかのように、シンクによって生成されることができるということである。もう一つの内在的な特徴は、シンク障害がすぐに検出され、障害を起こしたシンクに送られたオフロード・コードを含むオブジェクト・コンテキストが（実質的に）すぐ再生成されて実行のために別のシンクに送られるので、これが非常に高い信頼性をもつ仕方で実装できるということである。
【００４３】
必要であれば、シンク障害の検出に続いてまたは検出の際に、「静穏（quiesce）」要求がソースから一つまたは複数の他のシンクに発されてもよい。これは、シンク障害に起因して失われた実行時間を考慮して並列実行プロセスを再同期させるためである。しかしながら、オフロードされたコード・セクションについての実行時間が短い場合には、および／またはソースがオフロードされるコンテキストを送出し、よって再同期は単に、先に進む前に、交換用エンティティに送られたオフロードされたコード・セクションの完了を待つことによって達成できることに鑑み、これは一般には不要である。
【００４４】
さらに、パイプラインされるデータ構造を用いるいくつかの実施形態では、データ構造は、アクセスするコード・セクションがデータが有効であるかどうかを検出できるようにマークされることができる。たとえば、別のオフロードされるコード・セクション（またさらにはソースによって実行されるコード・セクション）によってアクセスされる第一のバッファにデータを書き込んでいるシンクが故障すると考える。前記別のオフロードされるコード・セクションが古くなったデータにアクセスしようとする場合には更新されたデータが交換用シンクによって該バッファに書き込まれるまで待つよう、バッファがマークされてもよい。
【００４５】
オフロード・ドメインについての例示的なトポロジー
上記で論じたように、本稿に開示される実施形態の諸側面は、一つまたは複数の階層レベルを用いる構成を含むさまざまなシステム構成を使って実装されうる。一般に、階層の最低レベルは、計算エンティティまたはシンクとして実装されるエンティティの群を含む。そのような群は一般に、クラスターと称される。ただし、クラスターという用語の使用は限定するものではない。むしろ、本稿での用法では、クラスターは、一般に、計算エンティティまたはエンティティの集成を表わす。ある側面では、管理されるクラスター内のシンク・エンティティは、容量、地理的位置または特定の機能といった選ばれた基準に基づいて、種々の仮想または論理的ドメインにグループ化される。同じドメイン内の各エンティティは、計算タスク、IO記憶、ウェブ・フロントエンドまたは他の何かであれ、同じタスクを実行することができる。ドメイン形成は再帰的であることができる。すなわち、ドメインが別のドメイン内に存在することができる。
【００４６】
ある実装におけるさまざまなエンティティは、上記のように、さまざまな物理的相互接続構造を使って相互接続される。さらに、このアーキテクチャ内には三つの仮想（概念上の）相互接続がある：（ａ）ドメイン内の（シンク・エンティティ間の）通信；（ｂ）ソースとシンクの間の通信；および（ｃ）ソース間の通信である。（ａ）および（ｂ）は必須である。（ｃ）は任意的であるが、いくつかの実装では、MPI（message  passing  interface［メッセージ渡しインターフェース］）ジョブ発送ネットワークのような何かであることが期待される。これら三つの相互接続が分離しているおよび／または接続されているという要件はない。
【００４７】
図４は、相互接続４０６を介してn個のシンク４０４に接続されているソース４０２を含むオフロード・ドメイン・トポロジー４００の第一の例を描いている。シンク４０４は単一のドメイン４０８に関連付けられている。また、この構成のもとで、ジョブ・ディスパッチャー４１０の機能は、ソース４１２のために使われる同じマシン上で実装される。シンク４０４のために使われるエンティティの型に依存して、ソース４０２は、記憶４１２と各ソース４０２および相互接続４０６との間の点線によって描かれるように、相互接続４０６を介してまたは別の相互接続を介して記憶４１２に接続されてもよい。たとえば、図８を参照して後述する構成のもとで、相互接続４０６はPCIe相互接続構造を有し、ソース４０２は記憶４１２にネットワーク・アダプターを介して接続される。
【００４８】
図５は、ソース５０４および５０６の対に接続されたジョブ・ディスパッチャー５０２を含むオフロード・ドメイン・トポロジー５００の第二の例を描いている。ソース５０４および５０６のそれぞれは相互接続５０８に接続され、該相互接続５０８には単一ドメイン５１２内のn個のシンク５１０も接続されている。ソース５０４および５０６は、相互接続５０８または別の相互接続を介して記憶５１４にアクセスできるようにもされている。さらに図示されるように、ソース５０４は、ドメイン５１２内のシンク５１０の第一の群についてコード・セクションをオフロードするために使用され、一方、ソース５０６は、シンク５１０の第二の群にコード・セクションをオフロードするために使用される。ソース５０４および５０６のそれぞれは、相互接続５０８を介してまたは別の相互接続を介して記憶５１４に接続される。
【００４９】
図６は、ソース６０４および６０６の対に接続されたジョブ・ディスパッチャー６０２を含むオフロード・ドメイン・トポロジー６００の第三の例を描いている。ソース６０４は、第一のドメイン６１０内のm個のシンク６０８にコード・セクションをオフロードし、データは相互接続セグメント６１２を通じて転送される。ソース６０６は、第二のドメイン６１６内のn個のシンク６１４にコード・セクションをオフロードし、データは相互接続セグメント６１８を通じて転送される。一般に、相互接続セグメント６１２および６１８は別個の相互接続構造を有していてもよく、あるいは同じ相互接続構造の一部であってもよい（たとえば、いずれも同じローカル・エリア・ネットワーク（LAN）内の相互接続セグメントであってもよい）。ソース６０４および６０６のそれぞれは、相互接続セグメント６１２および６１８を介してまたは他の相互接続を介して記憶６２０に接続される。
【００５０】
システム・エンティティ間のポイントツーポイント接続に加えて、図７のオフロード・ドメイン・トポロジー７００によって描かれるような、バスのような「ファブリック」相互接続構造が実装されてもよい。この構成のもとでは、ジョブ・ディスパッチャー７０２はジョブ発送ファブリック７０６を介してk個のソース７０４に接続される。階層の次のレベルでは、ソース７０４はドメイン７１２および７１４内のm個のシンク７０８およびn個のシンク７１０にオフロード・ファブリック７１６を介して接続される。記憶７１８も、オフロード・ファブリック７１６に接続されるものとして描かれている。任意的に、ソース７０４の一つまたは複数が、図示しない別個の相続接続を介して記憶７１８に接続されてもよい。
【００５１】
一般に、本稿の実施形態に基づくHPC動作は、データ・センターにおいて使われるアーキテクチャを含むさまざまなシステム・アーキテクチャを使って実装されうる。データ・センターは一般に、ワークロード要求からのスケールをサポートするために計算、ネットワークおよび記憶の共有される資源の物理的な階層構造を用いる。図８は、データ・センター８００における例示的な物理的な階層構造の一部を示す。これはL個のポッド８０２、M個のラック８０４を含み、各ラックがN個のトレイ８０６のためのスロットを含んでいる。各トレイ８０６は複数のスレッド（sled）８０８を含んでいてもよい。説明の便宜上、ポッド８０２、ラック８０４およびトレイ８０６のそれぞれは、ポッド１、ラック２、トレイ１Ｂなどといった対応する識別子をもってラベル付けされる。
【００５２】
各ラック８０４の上にはそれぞれのラック上（TOP:  top  of  rack）スイッチ８１０が描かれている。これもTORスイッチ番号によってラベル付けされている。一般に、TORスイッチ８１０は、TORスイッチおよびラック８０４間のスイッチングをサポートする他の任意のスイッチング機能の両方を表わす。物理的にラックの上に位置しているかどうかによらず（一般にはそうだが）、これらのスイッチをTORスイッチと称することが慣例である。
【００５３】
各ポッド８０２はさらに、ポッドのTORスイッチ８１０が結合されるポッド・スイッチ８１２を含む。そのポッド・スイッチ８１２はデータ・センター（DC）スイッチ８１４に結合される。データ・センター・スイッチはデータ・センター・スイッチ階層のいちばん上に位置していてもよく、あるいは図示されない一つまたは複数の追加的なレベルがあってもよい。説明の簡単のため、本稿に記載される階層は物理的なLANを使う物理的な階層である。実際上は、基礎になる物理的なLANスイッチング施設を使う仮想LANを配備することが一般的である。
【００５４】
いくつかの実施形態では、実装環境の物理的な階層にマッチするまたは実質的にマッチするオフロード階層を配備することが有利である。また、階層中の異なるレベルについて異なるチェックポイント方式が用いられてもよい。一般に、シンクはオフロード階層の最下位レベルを占める。データ・センター８００によって用いられる物理的な階層構造に従って、シンクは計算エンティティまたはスレッド（sled）８０８内のエンティティに対応する。トレイおよびスレッドが異なる名前で称されてもよく、および／または複数のサーバー・ブレードを含むブレード・サーバー・シャーシのような異なる物理的コンポーネントがラック内で使われてもよいことを注意しておく。
【００５５】
あるデータ・センター実装方式のもとで、サーバー・ブレードまたはサーバー・モジュールはソースおよびシンクのために実装される。たとえば、スレッド（sled）は、それぞれが別個の相互接続インターフェースをもち、別個の計算エンティティとして論理的に動作させられる複数のサーバー・ブレードまたはサーバー・モジュールを含んでいてもよい。一般に、これらの計算エンティティのそれぞれは、別個のサーバーとして実装され、スタンドアローンの物理的なサーバーと同様の仕方で、ただしずっと小さな物理的パッケージ内で機能する。サーバー・ブレードまたはモジュールは、複数のマイクロサーバーとして構成されてもよい。この例では、マイクロサーバーはシンクのために使われてもよい。
【００５６】
多集積コア（MIC:  Many-integrated  Core）装置実装
近年、インテル（登録商標）は、PCIeカード上に実装される多数の集積コアをもつプロセッサを含むXeon  Phi（商標）コプロセッサのラインを導入した。このクラスの装置は本稿では多集積コア装置または単にMICと称される。ある実施形態では、MICは約60個のコアを含み、将来世代のXeon  Phi（商標）コプロセッサは100個程度またはそれ以上のコアを含むことが構想される。
【００５７】
MICアーキテクチャは、特に複数のMICが同じプラットフォームに設置されるとき、単一のサーバー・プラットフォームが多数の計算処理コアをサポートできるようにする。これはHPC環境にとって、特に処理タスクが高度の局所性および並列性に関わる場合には、きわめて有利である。一般に、最短の遅延をもつ相互接続はプロセッサおよび／またはSocデバイス内の相互接続である。非常に高い帯域幅および非常に短い長さを併せ持つからである。結果として、MIC内の計算コア間の通信は非常に短い遅延に関わり、それはHPCにとって理想的である。
【００５８】
ある実施形態では、シンクはプロセッサ・コアMICを使って実装される。図９は、複数のMICが実装されるデュアル・ソケット・サーバー・プラットフォーム９００を示している。サーバーは二つのインテル（登録商標）Xeon（登録商標）プロセッサ（CPUとしても知られる）９０２および９０４を含み、そのそれぞれはソケット９０６およびソケット９０８として描かれている別個の「ソケット」と関連付けられている。各ソケットは、デュアル・ソケット・サーバー・プラットフォーム９００の別個のサーバー・サブシステムとして集団的に動作させられるコンポーネントの集合を含む。ソケット９０６については、図示したコンポーネントは、ホスト・メモリ９１０、入出力ハブ（IOH）９１２、PCIe相互接続９１４およびj個のPCIe  MIC  ９１６−１…９１６−jを含む。同様に、ソケット９０８については、図示したコンポーネントは、ホスト・メモリ９２０、入出力ハブ（IOH）、PCIe相互接続９２４およびn-j個のPCIe  MIC  ９１６−k…９１６−nならびにネットワークまたはIBファブリック９３２に結合されたイーサネット（登録商標）NIC（ネットワーク・インターフェース・コントローラ）またはInfiniBand（IB）ホスト・コントローラ・アダプター（HCA）を含むネットワーク・アダプター９３０をを含む。図９にさらに示されるように、プロセッサ９０２および９０４は、ソケットからソケットへの相互接続を有するクイックパスインターコネクト（QuickPath  Interconnect）（登録商標）リンク９３４を介して接続される。
【００５９】
図９および本願の他の図面に示されるアーキテクチャは例示的であり、個別的なコンポーネントは単に特定の機能、一組の機能または実装のために実装されうるより一般的なコンポーネントの一つの型を表わすものであることを注意しておく。たとえば、Xeon（登録商標）プロセッサおよびIOHは一般的なCPUおよびIOサブシステムの代表である。
【００６０】
サーバー・プラットフォーム９００のもとで、サーバーのソフトウェアは、各ソケット９０６および９０８がソース・ソフトウェア９３６−１および９３６−２によって描かれるようにそれぞれのソースをホストするよう、構成される。この構成のもとでは、ソース１のためのシンクはMIC  ９１６−１、…、９１６−j上のプロセッサ・コアを含み、ソース２のためのシンクはMIC  ９１６−k、…、９１６−n上のプロセッサ・コアを含む。ある実施形態では、ソケット１のPCIeスロットに設置されるMIC内のプロセッサ・コアを介して実装されるシンクは、第一のドメイン内のシンクとして実装され、一方、ソケット２のPCIeスロット内のMIC内のプロセッサ・コアを介して実装されるシンクは、第二のドメイン内のシンクとして実装される。これらは図６に示し、上記で論じた。もう一つの実施形態では、ソケット１および２内のホスト・プロセッサはそれぞれのソース１および２として実装され、一方、両方のソケットのPCIeスロット内のMIC内のプロセッサ・コアは単一のドメイン内のシンクとして実装される。これらは図５に示し、上記で論じた。
【００６１】
簡単のため、ソース・ソフトウェア９３６−１および９３６−２のそれぞれは、オフロード論理９４０およびジョブ・コード９４２を含むものとして描かれている。これらのソフトウェア・コンポーネントに加え、各ソースはオペレーティング・システムおよびアプリケーションといった追加的なソフトウェアを含むであろう。オフロード論理９４０は、図３のソース３０２フローチャート部分の動作および論理ならびにさまざまな通信機能を実装するための論理を含む。フェイルオーバー・ハートビート・モニタが該ソースによって実装される場合、これらの機能を実装するためのソフトウェアがさらにソース・ソフトウェア９３６−１および９３６−２に含まれる。
【００６２】
任意的な構成では、ホスト・プロセッサの一つがソースとして実装される。この構成のもとでは、ソースとして実装されないホスト・プロセッサは、MICの健全性をモニタリングする、ソースによって実行されるタスクのいくつかをオフロードするなど、他の目的のために使用されてもよい。ある実施形態では、ソースとして実装されないホスト・プロセッサはジョブ・ディスパッチャーをホストするために使われる。
【００６３】
図１０は、インテル（登録商標）Xeon  Phi（商標）MICコプロセッサを用いるある実施形態に基づく、MICコプロセッサ・ソフトウェア１００４およびホスト・ソフトウェア１００６を含むMICコプロセッサPCIeカード１００２上に実装されるソフトウェア・コンポーネントを含むソフトウェア・アーキテクチャ１０００を示している。ソフトウェア・スタックには本質的に四つの層がある：オフロード・ツール・ランタイムと、ユーザー・レベル・オフロード・ライブラリと、ユーザー・レベル・ライブラリおよびカーネル・ドライバの間で分割される低レベル通信層と、オペレーティング・システムとである。それぞれについて、ホスト側およびコプロセッサ側コンポーネントがある。オフロード・ランタイムより下のすべては、インテル（登録商標）多コア・プラットフォーム・ソフトウェア・スタック（MPSS:  Manycore  Platform  Software  Stack）の一部である。
【００６４】
図１０では、オフロード・ツール・ランタイム・コンポーネント、ユーザー・レベル・オフロード・ライブラリおよび低レベル通信層コンポーネントが明灰色で網掛けされている。一般に、ユーザー・レベルにおけるMICコプロセッサ・ソフトウェア１００４およびホスト・ソフトウェア１００６のためのソフトウェア・コンポーネントの多くは、相補的であり、コプロセッサ・オフロード・インフラストラクチャー（COI:  Coprocessor  Offload  Infrastructure）をサポートする。MICコプロセッサ・ソフトウェア１００４コンポーネントは、オフロードされたアプリケーション・コード１００８、COIシンク・ランタイム・デーモン１０１０、ユーザー・モード・ライブラリ１０１２、カーネル・モード・ドライバ１０１４およびリナックス（登録商標）・カード・オペレーティング・システム（OS）１０１６を含む。ホスト・ソフトウェア１００６コンポーネントは、ホスト・アプリケーション・コード１０１８、オフロード・コンパイラー１０２０、COIソース・ランタイム・モジュール１０２２、ユーザー・モード・ライブラリ１０２４、カーネル・モード・ドライバ１０２６およびリナックス（登録商標）・ホストOS  １０２８を含む。
【００６５】
COIライブラリは、コプロセッサ側プロセスを生成する、ホストとコプロセッサの間のFIFOパイプラインを生成する、コードおよびデータを移動する、コプロセッサ上でコード（関数）を呼び出す、ホストおよびコプロセッサにまたがるメモリ・バッファを管理する、利用可能な資源を列挙するなどのサービスを提供する。オフロード・ランタイム実装は厳密にはCOIを使うことは必要とされないが、そうすることは開発者のかなりの実装およびチューニング努力を軽減し、マイクロソフト（登録商標）ウィンドウズ（登録商標）のような他のホストOSへの移植可能性を提供する。
【００６６】
あるアプローチのもとでは、コード・セクションをオフロードすることは、コードの特定の諸セクションをオフロードするよう（ソースとして動作する）ホスト・プロセッサに命令するための命令などをコンパイラによって生成されるバイナリー・コードに含めるようコンパイラに命令するために、ソース・コードに加えられるオフロード印の使用を通じて容易にされる。オフロード印（indicia）は次のものを含む：
言語プラグマ、たとえばインテル（登録商標）およびCAPS（Compiler  and  Architecture  for  Embedded  and  Superscalar  Processors［組み込みスーパースカラー・プロセッサのためのコンパイラおよびアーキテクチャ］）プロジェクトからのさまざまなコンパイラによって使用される#pragma  omp  target  data  device(1)  map()（ターゲット・データ・デバイス(1)マップ()）ならびに#pragma  offloadというインテル固有の拡張；
言語キーワード、たとえばインテル（登録商標）コンパイラによって使用されるシェアド（Shared）キーワードまたはCUDA（Compute  Unified  Device  Architecture［計算統一装置アーキテクチャ］）またはコプロセッサのためのOpenCLアプリケーションXEのためのインテル（登録商標）SDKのようなOpenCLによって使用される言語構造体；および
ライブラリ呼び出し、たとえばホストとコプロセッサを横断して作業を分割するインテル（登録商標）マス・カーネル・ライブラリ（MKL:  Math  Kernel  Library）、MAGMA（Matrix  Algebra  on  GPU  and  Multicore  Architecture［GPUおよびマルチコア・アーキテクチャ上の行列代数］）またはNAG（Numerical  Algorithms  Group）呼び出し。
【００６７】
一般に、オフロード・プラグマはプログラマーが明示的に何をすべきかを指定することに頼る。だが場合によっては、プログラミングの簡単のため、デフォルトがある。ある実施形態では、オフロードされたコードのためのコプロセッサとの間の変数のデータ移行は、map(to:…)、map(from:…)およびmap(tofrom:…)節（clause）を用いて明示的に名前を付けられるが、map(tofrom:…)節はコンパイル中の構造体のスコープ内に見えるすべての変数について暗黙的に使われる。コプロセッサ・オフロード・ターゲットは、たとえばdevice(1)のように明示的に指定される。必要に応じてコプロセッサ間でデータを明示的に同期させることは、プログラマーの責任である。
【００６８】
インテル（登録商標）Xeon  Phi（商標）MICコプロセッサについて使われる用語のもとでは、各MIC装置は「エンジン」と称され、初期化フェーズの間に、それらのMICの装置機能が、利用可能なエンジンの識別も含め、列挙される。たとえば、図１１は、エンジンの数を取得し、最初のエンジンへのハンドルを取得するために使われる擬似コード・リスティングを示している。同様のハンドルが他のエンジンについて取得され、MICはCOIエンジンとして実装されるよう構成される。
【００６９】
COIプロセスは、コード・セクションをCOIエンジンにオフロードすることを容易にするために使われる。COIプロセスはシンク上で実行中のリモート・プロセスを抽象化する。リモート・プロセスを開始および停止するためおよびダイナミック・ライブラリをロードするためにAPIが提供される。COIプロセスは、リモート・プロセスにおける関数を呼び出せるよう、それらの関数を検索するためにも使われる。
【００７０】
図１２ａおよび図１２ｂは、それぞれ、COIプロセスを使って機能をオフロードするための例示的なソース側およびシンク側の擬似コード・リスティングを示している。図１２ａに示されるように、まずCOIプロセスが生成される。これはエンジン、実行可能ファイル、argc/argv環境変数、プロキシI/Oセットアップおよびバッファのためのスペースを同定する。次に、関数へのハンドルが取得される。コードの最後のセクションは、COIプロセスがシャットダウンされる理由を判別することに対応する。図１２ｂのシンク側コードに示されるように、シンクは、パイプライン式に実行されるセットアップ・ラン関数を含むメイン・プロセスを実行する。
【００７１】
MIC装置機能を列挙し、COIエンジンとして実装されるべきエンジンへのハンドルを取得することに関連して、COIバッファがセットアップされる。COIバッファは、MIC装置上でデータを管理するために使われる。バッファはラン関数に渡されるが、他のAPIを使って直接書き込み／読み出しされることもできる。COIランタイムはバッファ・メモリの位置を管理する。それは必要とされるところで、たとえばラン関数の実行前に、バッファが存在することを保証する。それはホストとMIC装置との間でページングによりバッファをやりとりすることによって、MIC装置上の物理的なバッファ・スペースをも管理する。
【００７２】
図１３ａおよび図１３ｂは、それぞれ、バッファをセットアップし、使うための例示的なソース側およびシンク側の擬似コード・リスティングを示している。ソース側では、バッファのセットアップは、バッファを生成し、次いで該バッファをマッピングすることに関わる。その後、バッファは、ソースによって直接書き込まれてもよく（たとえば、「Hello  world!\n」の例）、あるいはシンクによって実行されるラン関数を呼び出し、該ラン関数が結果を同定されたバッファに書き込んでもよい。図１３ｂのシンク側擬似コード・リスティングは、バッファ内のデータを「プリント」する簡単な例を示している。これは、そのデータが同定されたバッファに書き込まれる結果となる。
【００７３】
RDMA実装
リモート直接メモリ・アクセス（RDMA:  Remote  Direct  Memory  Access）は、リモート装置が別の装置上のメモリに直接書き込みすることができるようにする機構を提供する。図８のデータ・センター・アーキテクチャのコンテキストでは、RDMAは、ネットワーク機能をもたされたホストをもつサーバー・エンティティの間で実装されることができる。最も一般的なRDMA配備は、InfiniBand  HCAを使って実装される。いくつかのInfiniBandベンダーは、該当するInfiniBand規格において定義されている標準化された機能をもつRDMA設備をもつInfiniBand  HCAを提供するからである。任意的には、収束するイーサネット（登録商標）を通じたRDMA（RoCE:  RDMA  over  Converged  Ethernet（登録商標））のような他のネットワーク相互接続構造を通じたRDMA実装がある。これも同様に、RoCE仕様において定義されている標準化された機能をサポートする。
【００７４】
本稿の実施形態に従って、オフロードされたコード・セクションをサポートするための基準の一つは、ソースによって使用されるホスト・プロセッサにとってアクセス可能であるバッファ中にシンクがデータを書き込むことができることである。InfiniBandを通じたRDMAおよびRoCEはいずれもこの機能をサポートし、第一のスレッド（sled）またはシャーシ内のサーバー・ブレードおよびサーバー・モジュールのようなシンクのために実装される計算エンティティが、別のスレッドまたはシャーシ内のホストによって使用されるメモリに直接書き込みすることを可能にする。
【００７５】
本稿に記載された主題のさらなる側面は、以下の番号を付した付記において記載される。
〔付記１〕
シンクをなす複数の計算エンティティに通信上結合されたソースをなす計算エンティティを含むコンピューティング環境において実装される方法であって：
前記ソースを使って実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を記憶する段階と；
オフロードされたコードの諸セクションについて、該コードの諸セクションがオフロードされたシンクによって生成された結果を受領する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを含む、
方法。
〔付記２〕
前記ジョブを実行するために前記ソースを用いる段階と；
前記ジョブの実行の間に、シンクにオフロードされるべき一つまたは複数の第一の関数を含む第一のコード・セクションを検出する段階と；
第一のシンクのアドレス、前記第一のコード・セクションか前記一つまたは複数の第一の関数を同定する印かの一つおよび前記一つまたは複数の第一の関数についての一つまたは複数の関数パラメータを含む第一のオフロード・コンテキストを構築する段階と；
前記第一のオフロード・コンテキストを前記第一のシンクに送る段階と；
前記第一のオフロード・コンテキストに対応する第一のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第一のシンクによる前記一つまたは複数の第一の関数の実行に際して前記第一のシンクによって生成された第一の関数実行結果データを受領する段階と；
前記ソースが前記一つまたは複数の第一の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する段階とをさらに含む、
付記１記載の方法。
〔付記３〕
前記ジョブの実行の間に、シンクにオフロードされるべき一つまたは複数の第二の関数を含む第二のコード・セクションを検出する段階と；
第二のシンクのアドレス、前記第二のコード・セクションか前記一つまたは複数のセクション関数を同定する印かの一つおよび前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータを含む第二のオフロード・コンテキストを構築する段階と；
前記第二のオフロード・コンテキストを前記第二のシンクに送る段階と；
前記第二のオフロード・コンテキストに対応する第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第二のシンクが故障したことを同定する情報を受領するか、前記第二のシンクが故障したことを検出するか、前記第二のシンクが前記第二のコード・セクションの実行を完了し損なったことを検出し、それに応答して、
前記第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶から取り出し；
前記第二のオフロード・コンテキスト・オブジェクトを用いて、第三のシンクのアドレス、前記第二のコード・セクションもしくは前記第二のコード・セクションを同定する印および前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータを含む第三のオフロード・コンテキストを構築し；
前記第三のオフロード・コンテキストを前記第三のシンクに送り；
前記第三のオフロード・コンテキストに対応する第三のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶し；
前記第三のシンクによる前記一つまたは複数の第二の関数の実行に際して前記第三のシンクによって生成された第二の関数実行結果データを受領し；
前記ソースが前記一つまたは複数の第二の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する、
段階とをさらに含む、
付記２記載の方法。
〔付記４〕
前記第一のオフロード・コンテキストが、前記第一の関数結果が書き込まれるメモリ・バッファを同定する情報を含み、前記シンクが前記第一の関数結果を前記メモリ・バッファに書き込む、付記２または３記載の方法。
〔付記５〕
前記ソースと前記第一のシンクとの間にリモート直接メモリ・アクセス（RDMA）機構をセットアップする段階と；
RDMA書き込みを用いて前記第一の関数結果を前記メモリ・バッファに直接書き込む段階とをさらに含む、
付記４記載の方法。
〔付記６〕
前記ジョブの実行に先立って、前記一つまたは複数の第一の関数を含むライブラリを前記第一のシンクまたは前記第一のシンクが実装されているホスト装置に配布する段階と；
どのライブラリ関数を実行すべきかを同定する印を前記第一のオフロード・コンテキスト中に含める段階とをさらに含む、
付記２ないし５のうちいずれか一項記載の方法。
〔付記７〕
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階が、シンクが故障したことを判別するハートビート・モニタリング方式を使うことによって検出される、付記１ないし６のうちいずれか一項記載の方法。
〔付記８〕
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階が、タイムアウト・タイマーを使うことによって検出される、付記１ないし７のうちいずれか一項記載の方法。
〔付記９〕
前記ソースがサーバー・プラットフォーム内のホスト・プロセッサを含み、前記シンクの少なくとも一部が、前記サーバー・プラットフォーム内に設置された多集積コア（MIC）装置内のプロセッサ・コアを含む、付記１ないし８のうちいずれか一項記載の方法。
〔付記１０〕
前記ソースが、複数の多集積コア（MIC）装置が設定されているサーバー・プラットフォームを含み、前記シンクが、前記複数のMIC装置内のプロセッサ・コアを含む、付記１ないし９のうちいずれか一項記載の方法。
〔付記１１〕
前記ソースが、オフロードされるコード・セクションを、単一ドメイン内で動作している前記複数のシンクに発送する、付記１ないし１０のうちいずれか一項記載の方法。
〔付記１２〕
前記シンクを単一ドメイン内で動作させることをさらに含み、前記単一ドメインに関連付けられたシンクが前記ソースによってオフロードされる実行可能コードのセクションを受領し、実行する、付記１ないし１１のうちいずれか一項記載の方法。
〔付記１３〕
付記１ないし１２のうちいずれか一項記載の方法を実装するよう前記複数の計算エンティティによって実行されるよう構成されている命令が記憶されている少なくとも一つの有体の非一時的な機械可読媒体。
〔付記１４〕
サーバー・プラットフォームであって、当該サーバー・プラットフォームは：
ホスト・メモリに結合されたホスト・プロセッサと；
前記ホスト・プロセッサに通信上結合された複数の拡張スロットと；
それぞれの拡張スロット内に設置された一つまたは複数の多集積コア（MIC）装置であって、各MIC装置は複数のプロセッサ・コアおよびオンボード・メモリを含む、MIC装置と；
拡張スロット内に設置されたまたは前記ホスト・プロセッサに通信上結合されているコンポーネントとして実装されたネットワーク・アダプターとを有しており、
前記サーバー・プラットフォームはさらに、前記ホスト・プロセッサおよび前記MIC装置内の前記プロセッサ・コアのうちの複数で実行されるよう構成されたソフトウェア命令を含み前記ソフトウェア命令は当該サーバー・プラットフォームが：
前記ホスト・プロセッサをソースとして、前記MIC装置内の前記複数のプロセッサ・コアの少なくとも一部をシンクとして構成する段階と；
前記のオンボードのMICメモリと前記ホスト・メモリとの間でメモリ・マッピングを構成する段階と；
前記ホスト・プロセッサ上で実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を、前記ネットワーク・アダプターに結合されたネットワークを介してアクセス可能な不揮発性記憶装置に記憶するために送信する段階と；
オフロードされたコード・セクションを前記シンク上で実行して結果データを生成する段階と；
前記結果データを前記ホスト・プロセッサにとってアクセス可能なメモリ・バッファに記憶する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを実行することを可能にするものである、
サーバー・プラットフォーム。
〔付記１５〕
前記命令の実行が当該サーバー・プラットフォームがさらに：
前記ソースを介して前記ジョブの第一の部分を実行する段階と；
前記ジョブの実行の間に、一つまたは複数の第一の関数を含む、オフロードされるべき第一のコード・セクションを検出する段階と；
前記第一のコード・セクションをオフロードすべき先の第一のシンクを同定する段階と；
前記第一のシンクのアドレス、前記第一のコード・セクションか前記一つまたは複数の第一の関数を同定する印かの一つ、前記一つまたは複数の第一の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第一の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第一のオフロード・コンテキストを構築する段階と；
前記第一のオフロード・コンテキストを前記第一のシンクに転送する段階と；
前記第一のオフロード・コンテキストに対応する第一のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第一のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数の第一の関数を実行して結果データを生成する段階と；
前記結果データを前記メモリ・バッファに書き込む段階と；
前記ソースが前記第一の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する段階とを実行することを可能にするものである、
付記１４記載のプラットフォーム・サーバー。
〔付記１６〕
前記命令の実行が当該サーバー・プラットフォームがさらに：
前記ジョブの実行の間に、一つまたは複数の第二の関数を含む、オフロードされるべき第二のコード・セクションを検出する段階と；
前記第二のコード・セクションをオフロードすべき先の第二のシンクを同定する段階と；
前記第二のシンクのアドレス、前記第二のコード・セクションか前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第二のオフロード・コンテキストを構築する段階と；
前記第二のオフロード・コンテキストを前記第二のシンクに送る段階と；
前記第二のオフロード・コンテキストに対応する第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第二のシンクが故障したことを検出するか、前記第二のシンクが前記第二のコード・セクションの実行を完了し損なったことを検出し、それに応答して、
前記第二のシンクが故障したことを同定する情報を受領するか、前記第二のシンクが故障したことを検出するか、前記第二のシンクでの前記第二のコード・セクションの実行がエラーを起こしたことを検出し、それに応答して、
前記第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶から取り出し；
前記第二のオフロード・コンテキスト・オブジェクトを用いて、第三のシンクのアドレス、前記第二のコード・セクションもしくは前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第三のオフロード・コンテキストを構築し；
前記第三のオフロード・コンテキストを前記第三のシンクに送り；
前記第三のオフロード・コンテキストに対応する第三のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶し；
前記第一の第三のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数のセクション関数を実行して結果データを生成し；
前記結果データを前記メモリ・バッファに書き込み；
前記ソースが前記一つまたは複数の第二の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する、
段階とを実行することを可能にするものである、
付記１５記載のサーバー・プラットフォーム。
〔付記１７〕
シンクの障害を検出するハートビート・モニタ方式を実装するようさらに構成されている、付記１６記載のシステム。
〔付記１８〕
前記第二のシンクでの前記第二のコード・セクションの実行がエラーを起こしたことを検出するためにタイムアウト・タイマーを実装するようさらに構成されている、付記１６または１７記載のシステム。
〔付記１９〕
当該サーバー・プラットフォームが第一および第二のソケットを含むデュアル・ソケット・サーバーを含み、各ソケットは、それぞれのホスト・メモリに結合されたそれぞれのホスト・プロセッサと、該ホスト・プロセッサに通信上結合された少なくとも一つの拡張スロットとを含み、付記１２記載のホスト・プロセッサおよびホスト・メモリが前記第一のソケット内の第一のホスト・プロセッサおよび第一のホスト・メモリをなす、付記１４ないし１８のうちいずれか一項記載のサーバー・プラットフォーム。
〔付記２０〕
前記第一および第二のソケットのそれぞれが、それぞれのMIC装置が設置されている一つまたは複数の拡張スロットを含み、前記第一および第二のソケット内の前記拡張スロットに設置されている前記MIC装置の前記プロセッサ・コアにおける前記シンクが単一ドメインとして実装される、付記１９記載のサーバー・プラットフォーム。
〔付記２１〕
前記第一および第二のソケットのそれぞれが、それぞれのMIC装置が設置されている一つまたは複数の拡張スロットを含み、各ソケットはさらに、そのソケットのホスト・プロセッサおよびそのソケットについての一つまたは複数のそれぞれの拡張スロットに設置されている一つまたは複数のMIC装置内の前記プロセッサ・コアのうちの複数で実行されるよう構成されたソフトウェア命令を含み、該ソフトウェア命令は各ソケットが：
そのソケット内の前記ホスト・プロセッサをソースとして、前記MIC装置内の前記複数のプロセッサ・コアの少なくとも一部をシンクとして構成する段階と；
そのソケットについての拡張スロットに設置された各MIC装置について、前記のオンボードのMICメモリと前記ホスト・メモリとの間でメモリ・マッピングを構成する段階と；
前記ホスト・プロセッサ上で実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を、前記ネットワーク・アダプターに結合されたネットワークを介してアクセス可能な不揮発性記憶装置に記憶するために送信する段階と；
オフロードされたコード・セクションを前記シンク上で実行して結果データを生成する段階と；
前記結果データを前記ホスト・プロセッサにとってアクセス可能なメモリ・バッファに記憶する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを実行することを可能にするものである、
付記２０記載のサーバー・プラットフォーム。
〔付記２２〕
前記第一のソケットの前記拡張スロットに設置された前記一つまたは複数のMIC装置の前記プロセッサ・コアに対応する前記シンクは、前記第一のソースによって管理される第一のドメイン内に実装され、前記第二のソケットの前記拡張スロットに設置された前記一つまたは複数のMIC装置の前記プロセッサ・コアに対応する前記シンクは、前記第二のソースによって管理される第二のドメイン内に実装される、付記２１記載のサーバー・プラットフォーム。
〔付記２３〕
前記第一および第二のホスト・プロセッサの少なくとも一つでの前記ソフトウェア命令の実行は、当該サーバー・プラットフォームがチェックポイント動作を実行することを可能にし、該チェックポイント動作のもとでは前記第一および第二のソケットで並列に実行されるそれぞれのジョブに対応する状態情報が、前記ネットワーク・アダプターを介してアクセスされる不揮発性記憶に書き込まれる、付記２２記載のサーバー・プラットフォーム。
〔付記２４〕
サーバー・プラットフォーム内の計算エンティティによって実行されるよう構成されている命令が記憶されている少なくとも一つの有体の非一時的な機械可読媒体であって、前記サーバー・プラットフォームは：
第一の計算エンティティを含むホスト・プロセッサと；
前記ホスト・プロセッサに結合されたホスト・メモリと；
前記ホスト・プロセッサに通信上結合された複数の拡張スロットと；
それぞれの拡張スロット内に設置された一つまたは複数の多集積コア（MIC）装置であって、各MIC装置は計算エンティティを含む複数のプロセッサ・コアおよびオンボード・メモリを含む、MIC装置と；
拡張スロット内に設置されたまたは前記ホスト・プロセッサに通信上結合されているコンポーネントとして実装されたネットワーク・アダプターとを含んでおり、
前記ホスト・プロセッサおよび前記一つまたは複数のMIC装置内のプロセッサ・コアによる前記命令の実行は、前記サーバー・プラットフォームが：
前記ホスト・プロセッサをソースとして、前記一つまたは複数のMIC装置内の前記複数のプロセッサ・コアの少なくとも一部をシンクとして構成する段階と；
各MIC装置について、そのMIC装置の前記のオンボードのMICメモリと前記ホスト・メモリとの間でメモリ・マッピングを構成する段階と；
前記ホスト・プロセッサ上で実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を、前記ネットワーク・アダプターに結合されたネットワークを介してアクセス可能な不揮発性記憶装置に記憶するために送信する段階と；
オフロードされたコード・セクションを前記シンク上で実行して結果データを生成する段階と；
前記結果データを前記ホスト・プロセッサにとってアクセス可能なメモリ・バッファに記憶する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを実行することを可能にする、
少なくとも一つの有体の非一時的な機械可読媒体。
〔付記２５〕
前記ホスト・プロセッサおよび前記一つまたは複数のMIC装置内のプロセッサ・コアによる前記命令の実行は、前記サーバー・プラットフォームが：
前記ソースを介して前記ジョブの第一の部分を実行する段階と；
前記ジョブの実行の間に、一つまたは複数の第一の関数を含む、オフロードされるべき第一のコード・セクションを検出する段階と；
前記第一のコード・セクションをオフロードすべき先の第一のシンクを同定する段階と；
前記第一のシンクのアドレス、前記第一のコード・セクションか前記一つまたは複数の第一の関数を同定する印かの一つ、前記一つまたは複数の第一の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第一の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第一のオフロード・コンテキストを構築する段階と；
前記第一のオフロード・コンテキストを前記第一のシンクに転送する段階と；
前記第一のオフロード・コンテキストに対応する第一のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第一のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数の第一の関数を実行して結果データを生成する段階と；
前記結果データを前記メモリ・バッファに書き込む段階と；
前記ソースが前記第一の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する段階とを実行することを可能にする、
付記２４記載の少なくとも一つの有体の非一時的な機械可読媒体。
〔付記２６〕
前記ホスト・プロセッサおよび前記一つまたは複数のMIC装置内のプロセッサ・コアによる前記命令の実行は、前記サーバー・プラットフォームが：
前記ジョブの実行の間に、第二の関数を含む、オフロードされるべき第二のコード・セクションを検出する段階と；
前記第二のコード・セクションをオフロードすべき先の第二のシンクを同定する段階と；
前記第二のシンクのアドレス、前記第二のコード・セクションか前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第二のオフロード・コンテキストを構築する段階と；
前記第二のオフロード・コンテキストを前記第二のシンクに送る段階と；
前記第二のオフロード・コンテキストに対応する第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第二のシンクが故障したことを同定する情報を受領するか、前記第二のシンクが故障したことを検出するか、前記第二のシンクでの前記第二のコード・セクションの実行がエラーを起こしたことを検出し、それに応答して、
前記第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶から取り出し；
前記第二のオフロード・コンテキスト・オブジェクトを用いて、第三のシンクのアドレス、前記第二のコード・セクションもしくは前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第三のオフロード・コンテキストを構築し；
前記第三のオフロード・コンテキストを前記第三のシンクに送り；
前記第三のオフロード・コンテキストに対応する第三のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶し；
前記第一の第三のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数のセクション関数を実行して結果データを生成し；
前記結果データを前記メモリ・バッファに書き込み；
前記ソースが前記一つまたは複数の第二の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する、
段階とを実行することを可能にする、
付記２５記載の少なくとも一つの有体の非一時的な機械可読媒体。
〔付記２７〕
前記ホスト・プロセッサによる前記命令の実行は、前記ホスト・プロセッサが、シンクが故障したことを判別するハートビート・モニタリング方式を使うことによって、あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出することを可能にする、付記２４ないし２６のうちいずれか一項記載の少なくとも一つの有体の非一時的な機械可読媒体。
〔付記２８〕
前記ホスト・プロセッサによる前記命令の実行は、前記ホスト・プロセッサが、タイムアウト・タイマーを使うことによって、あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出することを可能にする、付記２４ないし２７のうちいずれか一項記載の少なくとも一つの有体の非一時的な機械可読媒体。
〔付記２９〕
複数のジョブに分割された全体的なタスクを実行する方法であって、当該方法は、シンクをなす第二の複数の計算エンティティに通信上結合されたソースをなす第一の複数の計算エンティティを含むコンピューティング環境において実装され、当該方法は：
各ソースにおいて、そのソースに発送されたそれぞれのジョブを受領する段階であって、各ジョブは実行可能コードを含む、段階と；
各ソースにおいて行なわれる、
そのソースに発送されたジョブの実行を管理する段階と；
前記ジョブの実行可能コードの諸セクションを前記複数のシンクのうちの複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を記憶する段階と；
オフロードされたコードの諸セクションについて、該コードの諸セクションがオフロードされたシンクによって生成された結果を受領する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを含む、
方法。
〔付記３０〕
各ソースにおいて行なわれる、
前記ジョブを実行するために前記ソースを用いる段階と；
前記ジョブの実行の間に、シンクにオフロードされるべき一つまたは複数の第一の関数を含む第一のコード・セクションを検出する段階と；
第一のシンクのアドレス、前記第一のコード・セクションか前記一つまたは複数の第一の関数を同定する印かの一つおよび前記一つまたは複数の第一の関数についての一つまたは複数の関数パラメータを含む第一のオフロード・コンテキストを構築する段階と；
前記第一のオフロード・コンテキストを前記第一のシンクに送る段階と；
前記第一のオフロード・コンテキストに対応する第一のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第一のシンクによる前記一つまたは複数の第一の関数の実行に際して前記第一のシンクによって生成された第一の関数実行結果データを受領する段階と；
前記ソースが前記一つまたは複数の第一の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する段階とをさらに含む、
付記２９記載の方法。
〔付記３１〕
各ソースにおいて行なわれる、
前記ジョブの実行の間に、シンクにオフロードされるべき一つまたは複数の第二の関数を含む第二のコード・セクションを検出する段階と；
第二のシンクのアドレス、前記第二のコード・セクションか前記一つまたは複数のセクション関数を同定する印かの一つおよび前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータを含む第二のオフロード・コンテキストを構築する段階と；
前記第二のオフロード・コンテキストを前記第二のシンクに送る段階と；
前記第二のオフロード・コンテキストに対応する第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第二のシンクが故障したことを同定する情報を受領するか、前記第二のシンクが故障したことを検出するか、前記第二のシンクが前記第二のコード・セクションの実行を完了し損なったことを検出し、それに応答して、
前記第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶から取り出し；
前記第二のオフロード・コンテキスト・オブジェクトを用いて、第三のシンクのアドレス、前記第二のコード・セクションもしくは前記第二のコード・セクションを同定する印および前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータを含む第三のオフロード・コンテキストを構築し；
前記第三のオフロード・コンテキストを前記第三のシンクに送り；
前記第三のオフロード・コンテキストに対応する第三のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶し；
前記第三のシンクによる前記一つまたは複数の第二の関数の実行に際して前記第三のシンクによって生成された第二の関数実行結果データを受領し；
前記ソースが前記一つまたは複数の第二の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する、
段階とをさらに含む、
付記３０の方法。
〔付記３２〕
前記複数のソースが前記複数のシンクに、一つまたは複数のセグメントを含むネットワーク相互接続を介して結合され、前記複数のシンクが単一のドメインとして実装される、付記２９ないし３１のうちいずれか一項記載の方法。
〔付記３３〕
前記複数のソースが前記複数のシンクに、一つまたは複数のセグメントを含むネットワーク相互接続を介して結合され、前記複数のシンクが複数のドメインとして実装される、付記２９ないし３１のうちいずれか一項記載の方法。
〔付記３４〕
各ソースがそれぞれの一組のシンクに、それぞれのネットワーク相互接続セグメントを介して結合され、それぞれの一組のシンクがそれぞれのドメインにおいて実装される、付記３３記載の方法。
〔付記３５〕
前記複数のソースが前記複数のシンクにオフロード・ファブリックを介して結合されている、付記２９ないし３１のうちいずれか一項記載の方法。
〔付記３６〕
前記複数のシンクが複数組のシンクにグループ化され、各組のシンクがそれぞれのドメインにおいて実装されている、付記３５記載の方法。
〔付記３７〕
前記複数のソースがジョブ・ディスパッチ・ファブリックを介してジョブ・ディスパッチャーに接続され、前記ジョブ・ディスパッチャーは前記複数のソースにジョブをディスパッチする、付記２９ないし３６のうちいずれか一項記載の方法。
〔付記３８〕
前記複数のソースが一つまたは複数のジョブ・ディスパッチャーに相互接続され、前記一つまたは複数のジョブ・ディスパッチャー、前記複数のソースおよび前記複数のシンクは階層構造中のそれぞれのレベルを占め、前記複数のシンクが前記階層構造中の最下位レベルを占める、付記２９ないし３６のうちいずれか一項記載の方法。
〔付記３９〕
前記コンピューティング環境が最下位レベルをもつ物理的な階層構造をもち、前記複数のシンクが前記物理的な階層構造の最下位レベルを占める計算エンティティを含み、前記複数のソースは前記複数のシンクが占める前記物理的な階層構造中のレベルより上の前記物理的な階層構造中のレベルを占める計算エンティティを含み、前記一つまたは複数のジョブ・ディスパッチャーは前記複数のソースが占める前記物理的な階層構造中のレベルより上の前記物理的な階層構造中のレベルを占める計算エンティティによって実装される、付記３８記載の方法。
〔付記４０〕
少なくとも一つのソースがサーバー・プラットフォーム内のホスト・プロセッサを含み、前記シンクの少なくとも一部が、サーバー・プラットフォーム内に設置された多集積コア（MIC）装置内のプロセッサ・コアを含む、付記２９ないし３９のうちいずれか一項記載の方法。
〔付記４１〕
付記２９ないし４０のうちいずれか一項記載の方法を実装するよう前記複数の計算エンティティによって実行されるよう構成されている命令が記憶されている少なくとも一つの有体の非一時的な機械可読媒体。
媒体。
〔付記４２〕
サーバー・プラットフォームであって、当該サーバー・プラットフォームは：
ホスト・メモリに結合されたホスト・プロセッサと；
前記ホスト・プロセッサに通信上結合された複数の拡張スロットと；
それぞれの拡張スロット内に設置された一つまたは複数の多集積コア（MIC）装置であって、各MIC装置は複数のプロセッサ・コアおよびオンボード・メモリを含む、MIC装置と；
拡張スロット内に設置されたまたは前記ホスト・プロセッサに通信上結合されているコンポーネントとして実装されたネットワーク・アダプターと；、
前記ホスト・プロセッサをソースとして、前記MIC装置内の前記複数のプロセッサ・コアの少なくとも一部をシンクとして構成する段階と；
前記のオンボードのMICメモリと前記ホスト・メモリとの間でメモリ・マッピングを構成する段階と；
前記ホスト・プロセッサ上で実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を、前記ネットワーク・アダプターに結合されたネットワークを介してアクセス可能な不揮発性記憶装置に記憶するために送信する段階と；
オフロードされたコード・セクションを前記シンク上で実行して結果データを生成する段階と；
前記結果データを前記ホスト・プロセッサにとってアクセス可能なメモリ・バッファに記憶する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを実行する手段とを有する、
サーバー・プラットフォーム。
〔付記４３〕
前記ソースを介して前記ジョブの第一の部分を実行する段階と；
前記ジョブの実行の間に、一つまたは複数の第一の関数を含む、オフロードされるべき第一のコード・セクションを検出する段階と；
前記第一のコード・セクションをオフロードすべき先の第一のシンクを同定する段階と；
前記第一のシンクのアドレス、前記第一のコード・セクションか前記一つまたは複数の第一の関数を同定する印かの一つ、前記一つまたは複数の第一の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第一の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第一のオフロード・コンテキストを構築する段階と；
前記第一のオフロード・コンテキストを前記第一のシンクに転送する段階と；
前記第一のオフロード・コンテキストに対応する第一のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第一のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数の第一の関数を実行して結果データを生成する段階と；
前記結果データを前記メモリ・バッファに書き込む段階と；
前記ソースが前記第一の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する段階とを実行する手段をさらに有する、
付記４２記載のプラットフォーム・サーバー。
〔付記４４〕
前記ジョブの実行の間に、一つまたは複数の第二の関数を含む、オフロードされるべき第二のコード・セクションを検出する段階と；
前記第二のコード・セクションをオフロードすべき先の第二のシンクを同定する段階と；
前記第二のシンクのアドレス、前記第二のコード・セクションか前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第二のオフロード・コンテキストを構築する段階と；
前記第二のオフロード・コンテキストを前記第二のシンクに送る段階と；
前記第二のオフロード・コンテキストに対応する第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶する段階と；
前記第二のシンクが故障したことを検出するか、前記第二のシンクが前記第二のコード・セクションの実行を完了し損なったことを検出し、それに応答して、
前記第二のシンクが故障したことを同定する情報を受領するか、前記第二のシンクが故障したことを検出するか、前記第二のシンクでの前記第二のコード・セクションの実行がエラーを起こしたことを検出し、それに応答して、
前記第二のオフロード・コンテキスト・オブジェクトを不揮発性記憶から取り出し；
前記第二のオフロード・コンテキスト・オブジェクトを用いて、第三のシンクのアドレス、前記第二のコード・セクションもしくは前記一つまたは複数の第二の関数を同定する印かの一つ、前記一つまたは複数の第二の関数についての一つまたは複数の関数パラメータおよび前記一つまたは複数の第二の関数の実行を介して生成される結果データが書き込まれるべきメモリ・バッファをマッピングする情報を含む第三のオフロード・コンテキストを構築し；
前記第三のオフロード・コンテキストを前記第三のシンクに送り；
前記第三のオフロード・コンテキストに対応する第三のオフロード・コンテキスト・オブジェクトを不揮発性記憶に記憶し；
前記第一の第三のシンクを介して、前記一つまたは複数の関数パラメータを使って前記一つまたは複数のセクション関数を実行して結果データを生成し；
前記結果データを前記メモリ・バッファに書き込み；
前記ソースが前記一つまたは複数の第二の関数を実行したかのように前記ソースによって前記ジョブの実行を継続する、
段階とを実行する手段をさらに有する、
付記４３記載のサーバー・プラットフォーム。
〔付記４５〕
シンクの障害を検出するハートビート・モニタ方式を実装する手段をさらに有する、付記４４記載のシステム。
〔付記４６〕
前記第二のシンクでの前記第二のコード・セクションの実行がエラーを起こしたことを検出するためにタイムアウト・タイマーを実装する手段をさらに有する、付記４４または４５記載のシステム。
〔付記４７〕
当該サーバー・プラットフォームが第一および第二のソケットを含むデュアル・ソケット・サーバーを含み、各ソケットは、それぞれのホスト・メモリに結合されたそれぞれのホスト・プロセッサと、該ホスト・プロセッサに通信上結合された少なくとも一つの拡張スロットとを含み、付記４２記載のホスト・プロセッサおよびホスト・メモリが前記第一のソケット内の第一のホスト・プロセッサおよび第一のホスト・メモリをなす、付記１４ないし１８のうちいずれか一項記載のサーバー・プラットフォーム。
〔付記４８〕
前記第一および第二のソケットのそれぞれが、それぞれのMIC装置が設置されている一つまたは複数の拡張スロットを含み、前記第一および第二のソケット内の前記拡張スロットに設置されている前記MIC装置の前記プロセッサ・コアにおける前記シンクが単一ドメインとして実装される、付記４７記載のサーバー・プラットフォーム。
〔付記４９〕
前記第一および第二のソケットのそれぞれが、それぞれのMIC装置が設置されている一つまたは複数の拡張スロットを含み、前記第一および第二のソケットのそれぞれについて、
そのソケット内の前記ホスト・プロセッサをソースとして、前記MIC装置内の前記複数のプロセッサ・コアの少なくとも一部をシンクとして構成する段階と；
そのソケットについての拡張スロットに設置された各MIC装置について、前記のオンボードのMICメモリと前記ホスト・メモリとの間でメモリ・マッピングを構成する段階と；
前記ホスト・プロセッサ上で実行可能コードを含むジョブの実行を管理する段階と；
前記実行可能コードの諸セクションを前記複数のシンクにオフロードする段階と；
シンクにオフロードされるコードの各セクションについて、オフロードされるコードのセクションおよびそれがオフロードされる先のシンクを同定するオフロード・コンテキスト情報を、前記ネットワーク・アダプターに結合されたネットワークを介してアクセス可能な不揮発性記憶装置に記憶するために送信する段階と；
オフロードされたコード・セクションを前記シンク上で実行して結果データを生成する段階と；
前記結果データを前記ホスト・プロセッサにとってアクセス可能なメモリ・バッファに記憶する段階と；
あるシンクが、該シンクにオフロードされたコードのセクションを成功裏に実行し損なったことを検出する段階と；
前記検出に応答して、
前記シンクにオフロードされたコードのセクションに対応するオフロード・コンテキスト情報を取り出し、
コードの前記セクションを別のシンクに実行のためにオフロードする段階とを実行する手段をさらに有する、
付記４８記載のサーバー・プラットフォーム。
〔付記５０〕
前記第一のソケットの前記拡張スロットに設置された前記一つまたは複数のMIC装置の前記プロセッサ・コアに対応する前記シンクは、前記第一のソースによって管理される第一のドメイン内に実装され、前記第二のソケットの前記拡張スロットに設置された前記一つまたは複数のMIC装置の前記プロセッサ・コアに対応する前記シンクは、前記第二のソースによって管理される第二のドメイン内に実装される、付記４９記載のサーバー・プラットフォーム。
〔付記５１〕
チェックポイント動作を実行する手段をさらに有し、該チェックポイント動作のもとでは前記第一および第二のソケットで並列に実行されるそれぞれのジョブに対応する状態情報が、前記ネットワーク・アダプターを介してアクセスされる不揮発性記憶に書き込まれる、付記５０記載のサーバー・プラットフォーム。
【００７６】
個別的な実装を参照していくつかの実施形態が記述されているが、いくつかの実施形態によれば他の実装が可能である。さらに、図面に示されるおよび／または本稿に記載される要素または他の特徴の配置および／または順序は、図示および記載される特定の仕方で配置される必要はない。いくつかの実施形態によれば他の多くの配置が可能である。
【００７７】
図に示した各システムにおいて、いくつかの場合の要素は、表わされている要素が異なるおよび／または類似であることができることを示唆するために、それぞれ同じ参照符号または異なる参照符号をもつことがある。しかしながら、要素は、異なる実装をもち、本願で示されるまたは記載されるシステムの一部または全部と一緒に機能するのに十分柔軟でありうる。図面に示したさまざまな要素は同じまたは異なることがありうる。どれが第一の要素と称され、どれが第二の要素と呼ばれるかは任意である。
【００７８】
本稿および請求項において、「結合される」および「接続される」の用語ならびにその派生形が使用されることがある。これらの用語は互いに同義とは意図されていないことを理解しておくべきである。むしろ、個別的な実施形態において、「接続される」は二つ以上の要素が互いに直接的な物理的または電気的接触をしていることを示すために使われることがある。「結合される」は、二つ以上の要素が直接的な物理的または電気的接触をしていることを意味することがあるが、「結合される」は二つ以上の要素が互いに直接接触していないが、それでも互いに協働するまたは相互作用することをも意味しうる。
【００７９】
実施形態は、本発明の実装または例である。本明細書における「ある実施形態」、「一つの実施形態」、「いくつかの実施形態」または「他の実施形態」への言及は、その実施形態との関連で記述されている特定の特徴、構造または特性が少なくともいくつかの実施形態に含まれるが、必ずしも本発明のすべての実施形態には含まれないことを意味する。「ある実施形態」、「一つの実施形態」、「いくつかの実施形態」のさまざまな出現は、必ずしもみなが同じ実施形態を指すのではない。
【００８０】
本願で記述され、図示されるすべてのコンポーネント、特徴、構造、特性などが特定の実施形態（単数または複数）に含まれる必要はない。たとえば明細書があるコンポーネント、特徴、構造または特性が、含まれ「うる」、含まれ「てもよい」、含まれる「ことができる」または含まれる「ことがありうる」と述べる場合、その特定のコンポーネント、特徴、構造または特性が含まれることは必須ではない。明細書または請求項がある要素に言及する場合、それはその要素が一つだけあることを意味するのではない。明細書または請求項が「追加的な」要素に言及するとき、それは該追加的な要素が二つ以上あることを排除しない。
【００８１】
アルゴリズムは、本稿では、また一般に、所望の結果につながる工程または動作の自己完結的なシーケンスと考えられる。これらは物理量の物理的な操作を含む。必ずではないが通例、これらの量は、記憶、転送、組み合わせ、比較および他の操作をされることができる電気または磁気信号の形を取る。時に、主として慣用のため、これらの信号をビット、値、要素、シンボル、キャラクタ、項、数などと称することが便利であることが判明している。しかしながら、これらおよび同様の用語のすべては適切な物理量と関連付けられるものであり、これらの量に適用される単に便利なラベルであることを理解しておくべきである。
【００８２】
上記の詳細な説明における「i」「j」「l」「m」「n」「p」などのイタリック体の文字は整数を指すために使われる。特定の文字の使用は特定の実施形態に限定されない。さらに、同じ文字が別個の請求項では別個の整数を表わすために使われることがあるし、あるいは異なる文字が使われることがある。さらに、詳細な説明における特定の文字の使用は、詳細な説明における同じ主題に係る請求項において使用される文字に一致することもしないこともある。
【００８３】
上記で論じたように、本願の実施形態のさまざまな側面は、組み込みプロセッサによって実行されるソフトウェアおよび／またはファームウェアなどのような、対応するソフトウェアおよび／またはファームウェア・コンポーネントおよびアプリケーションによって容易にされてもよい。よって、本発明の実施形態は、何らかの形のプロセッサ、処理コアまたは組み込み論理、プロセッサもしくはコア上で走る仮想マシンで実行される、あるいはさもなければコンピュータ可読もしくは機械可読の非一時的な記憶媒体上または該媒体内に実装もしくは実現される、ソフトウェア・プログラム、ソフトウェア・モジュール、ファームウェアおよび／または分散ソフトウェアとして使われてもよく、あるいはそれをサポートしてもよい。コンピュータ可読もしくは機械可読の非一時的な記憶媒体は、機械（たとえばコンピュータ）によって読み取り可能な形で情報を記憶または伝送するための任意の機構を含む。たとえば、コンピュータ可読もしくは機械可読の非一時的な記憶媒体は、コンピュータまたはコンピューティング機械（たとえばコンピューティング装置、電子システムなど）によってアクセス可能な形で情報を提供する（すなわち、記憶および／または伝送する）任意の機構を含む。たとえば、記録可能／記録不能型媒体（たとえば、読み出し専用メモリ（ROM）、ランダム・アクセス・メモリ（RAM）、磁気ディスク記憶媒体、光記憶媒体、フラッシュメモリ・デバイスなど）である。コンテンツは直接実行可能物（「オブジェクト」または「実行可能」形式）、ソース・コードまたは異なるコード（「デルタ」または「パッチ」コード）であってもよい。コンピュータ可読もしくは機械可読な非一時的な記憶媒体は、そこからコンテンツがダウンロードできる記憶またはデータベースをも含んでいてもよい。コンピュータ可読もしくは機械可読な非一時的な記憶媒体、販売または送達の時点でそこにコンテンツが記憶されているデバイスまたはプロダクトをも含んでいてもよい。よって、記憶されたコンテンツをもつデバイスを送達することまたは通信媒体を通じたダウンロードのためにコンテンツをオファーすることは、本稿に記載されるそのようなコンテンツをもつコンピュータ可読もしくは機械可読な非一時的な記憶媒体を含む製造物を提供することと理解されうる。
【００８４】
本稿に記載されるプロセス、サーバーまたはツールとして上記で言及されるさまざまなコンポーネントは記載される機能を実行するための手段であってもよい。本稿に記載されるさまざまなコンポーネントによって実行される動作および機能は、処理要素上で走るソフトウェアによって組み込みのハードウェアなどを介して、あるいはハードウェアとソフトウェアの何らかの組み合わせによって実装されてもよい。そのようなコンポーネントは、ソフトウェア・モジュール、ハードウェア・モジュール、特殊目的ハードウェア（たとえば、特定用途向けハードウェア、ASIC、DSPなど）、組み込みコントローラ、固定構成回路、ハードウェア論理などとして実装されてもよい。ソフトウェア・コンテンツ（たとえば、データ、命令、構成設定情報など）は、実行されることのできる命令を表わすコンテンツを提供する、コンピュータ可読もしくは機械可読な非一時的な記憶媒体を含む製造物を介して提供されてもよい。該コンテンツは、コンピュータが本稿に記載されるさまざまな機能／動作を実行する結果を与えうる。
【００８５】
本稿での用法では、用語「少なくとも一つの」で結ばれる項目のリストは、リストされた項目の任意の組み合わせを意味しうる。たとえば、「A、BまたはCの少なくとも一つ」という句はA；B；C；AおよびB；AおよびC；BおよびC；またはA、BおよびCを意味することができる。
【００８６】
本発明の例解される実施形態の上記の記述は、要約書に記載されることも含めて、網羅的であることも、本発明を開示される厳密な形に限定することは意図されていない。本発明の特定的な実施形態や例が本稿において例解目的のために記述されているが、本発明の範囲内でさまざまな等価な修正が可能である。当業者はこのことを認識するであろう。
【００８７】
上記の詳細な説明に照らして本発明にこれらの修正をすることができる。付属の請求項において使われる用語は、本発明を明細書および図面において開示されている特定の実施形態に限定するものと解釈すべきではない。むしろ、本発明の範囲は、完全に請求項によって決定されるものであり、請求項は、クレーム解釈の確立されたドクトリンに従って解釈されるべきものである。
【符号の説明】
【００８８】
１００  ジョブ・ディスパッチャー
１０２  計算エンティティ
１０４  相互接続
１０６  ジョブ
１０８  ネットワーク記憶
２００  ソース
２０２、２０４、２０６  シンク
２０８  相互接続
２１０、２１２、２１４  コンテキスト・オブジェクト（CO）
３００  フローチャート兼メッセージ・フロー図
３０２  ソース
３０４  フェイルオーバー・ハートビート・モニタ
３０６  シンク
３０７  相互接続
３０８  ソースはオフロード・プログラミング・モデルに基づく実行可能な構造をもつ
３１０  各オフロード・コード・セクションについて
３１２  次のオフロード・コード・セクション
３１４  オフロード・コンテキスト（リンク・アドレス、プログラム・バイナリーまたは参照、環境変数、関数パラメータおよびバッファ・マッピング）を構築
３１６  シンク装置と通信し、オフロード・コンテキストを送る
３１８  コンテキスト・オブジェクトを記憶部にプッシュ
３２０  要求を傾聴
３２２  要求？
３２４  要求された関数／機能を実行
３２６  完了
３２８  関数結果
３３０  オフロード・セクションを完了とマーク
３３２  発送された各オフロード・コード・セクションについて
３３４  次の発送されたオフロード・コード・セクション
３３６  健全性モニタ
３３８  ハートビート？
３４０  バックアップを選択
３４２  ソースに通知
３４４  リスタートを要求する障害？
３４６  コンテキスト・オブジェクトを記憶からプル
３４８  最終結果に到達？
３５０  開始タイマー・アイコン
３５２  満了タイマー・アイコン
３５４  クリアされたまたはリセットされたタイマー・アイコン
３５６  コード・セクション完了
３５８  中間パイプライン・データを交換
４００  オフロード・ドメイン・トポロジー
４０２  ソース
４０４  シンク
４０６  相互接続
４０８  ドメイン
４１０  ジョブ・ディスパッチャー
４１２  記憶
５００  オフロード・ドメイン・トポロジー
５０２  ジョブ・ディスパッチャー
５０４、５０６  ソース
５０８  相互接続
５１０  シンク
５１２  ドメイン
５１４  記憶
６００  オフロード・ドメイン・トポロジー
６０２  ジョブ・ディスパッチャー
６０４、６０６  ソース
６０８  シンク
６１０  第一のドメイン
６１２  相互接続セグメント
６１４  シンク
６１６  第二のドメイン
６１８  相互接続セグメント
６２０  記憶
７００  オフロード・ドメイン・トポロジー
７０２  ジョブ・ディスパッチャー
７０４  ソース
７０６  ジョブ発送ファブリック
７０８、７１０  シンク
７１２、７１４  ドメイン
７１６  オフロード・ファブリック
８００  データ・センター
８０２  ポッド
８０４  ラック
８０６  トレイ
８０８  スレッド（sled）
８１０  ToR（ラック上）スイッチ
８１２  ポッド・スイッチ
８１４  データ・センター（DC）スイッチ
９００  デュアル・ソケット・サーバー・プラットフォーム
９０２、９０４  プロセッサ（CPU）
９０６、９０８  ソケット
９１０、９２０  ホスト・メモリ
９１２、９２２  入出力ハブ（IOH）
９１４、９２４  PCIe相互接続
９１６  PCIe  MIC
９３０  ネットワーク・アダプター
９３２  ネットワークまたはIBファブリック
９３４  クイックパスインターコネクト（QuickPath  Interconnect）（登録商標）リンク
９３６  ソース・ソフトウェア
９４０  オフロード論理
９４２  ジョブ・コード
１０００  ソフトウェア・アーキテクチャ
１００２  MICコプロセッサPCIeカード
１００４  MICコプロセッサ・ソフトウェア
１００６  ホスト・ソフトウェア
１００８  オフロードされたアプリケーション・コード
１０１０  COIシンク・ランタイム・デーモン
１０１２  ユーザー・モード・ライブラリ
１０１４  カーネル・モード・ドライバ
１０１６  リナックス（登録商標）・カード・オペレーティング・システム（OS）
１０１８  ホスト・アプリケーション・コード
１０２０  オフロード・コンパイラー
１０２２  COIソース・ランタイム・モジュール
１０２４  ユーザー・モード・ライブラリ
１０２６  カーネル・モード・ドライバ
１０２８  リナックス（登録商標）・ホストOS
【図１】
2016115340.tif 000003
【図２】
2016115340.tif 000004
【図３】
2016115340.tif 000005
【図４】
2016115340.tif 000006
【図５】
2016115340.tif 000007
【図６】
2016115340.tif 000008
【図７】
2016115340.tif 000009
【図８】
2016115340.tif 000010
【図９】
2016115340.tif 000011
【図１０】
2016115340.tif 000012
【図１１】
2016115340.tif 000013
【図１２ａ】
2016115340.tif 000014
【図１２ｂ】
2016115340.tif 000015
【図１３ａ】
2016115340.tif 000016
【図１３ｂ】
2016115340.tif 000017
【外国語明細書】
2016115340000001.pdf
2016115340000002.pdf
2016115340000003.pdf
2016115340000004.pdf