(57)【要約】【課題】  アクセラレータなどのプログラムが、スタブを記述することなく、ホストの共有ライブラリをリンクすることができる。【解決手段】  動的リンク装置は、共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクするロード手段と、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替えるプラットフォーム切替手段と、を備える。【選択図】  図１
2020113050.tif 000002
【特許請求の範囲】
【請求項１】
共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクするロード手段と、
前記共有ライブラリのターゲットを識別し、呼び出し元の前記プログラムから前記共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替えるプラットフォーム切替手段と
を備える動的リンク装置。
【請求項２】
前記プラットフォーム切替手段は、前記共有ライブラリの前記ターゲットが自装置用である場合、ロードした前記共有ライブラリの初期化処理を実行し、ＧＯＴ（Global Offset Table）を設定することで再配置を完了させる
請求項１記載の動的リンク装置。
【請求項３】
共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクするロード手段と、
前記共有ライブラリのターゲットを識別し、呼び出し元の前記プログラムから前記共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替えるプラットフォーム切替手段と
を備える動的ロード装置。
【請求項４】
第１の情報処理装置と、前記第１の情報処理装置に接続された第２の情報処理装置と、を含む計算機システムであって、
前記第１の情報処理装置は、
共有ライブラリを前記第１の情報処理装置のメモリにロードし、呼び出し元のプログラムからリンクし、
前記共有ライブラリのターゲットを識別し、呼び出し元の前記プログラムから前記共有ライブラリの関数呼び出しの機能を前記第１の情報処理装置または前記第２の情報処理装置に切り替える
計算機システム。
【請求項５】
共有ライブラリを自装置のメモリにロードし、
呼び出し元のプログラムからリンクし、
前記共有ライブラリのターゲットを識別し、
呼び出し元の前記プログラムから前記共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える
動的リンク方法。
【請求項６】
共有ライブラリを自装置のメモリにロードし、
呼び出し元のプログラムからリンクし、
前記共有ライブラリのターゲットを識別し、
呼び出し元の前記プログラムから前記共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える
動的ロード方法。
【請求項７】
共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクする機能と、
前記共有ライブラリのターゲットを識別し、呼び出し元の前記プログラムから前記共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える機能と
をコンピュータに実行させる動的リンクプログラム。
【請求項８】
共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクする機能と、
前記共有ライブラリのターゲットを識別し、呼び出し元の前記プログラムから前記共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える機能と
をコンピュータに実行させる動的ロードプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、動的リンク装置、動的ロード装置、計算機システム、動的リンク方法、動的ロード方法、動的リンクプログラム、および動的ロードプログラムに関する。
【背景技術】
【０００２】
今日の計算機システムでは、半導体技術や電力の制約によって、汎用計算機の周波数を高めることによる性能向上が飽和してきている。そのため、処理に適したアクセラレータなど、特性の異なる計算機によって構成されたヘテロな計算機システムが拡大している。一例として、通常の計算や入出力を行う汎用プロセッサを備えるホストと、数値計算に適したプロセッサを備えるアクセラレータとで構成される計算機システムがある。アクセラレータには、Ｉｎｔｅｌ  Ｘｅｏｎ  Ｐｈｉ（登録商標）やＮＥＣ  ＳＸ−Ａｕｒｏｒａ  ＴＳＵＢＡＳＡ（登録商標）のように、オペレーティングシステムの機能、および共有ライブラリをサポートするものがある。
【０００３】
共有ライブラリは、プログラムの再利用性を高めることでソフトウェアの生産性を向上させ、かつ、複数のプログラムで使用する関数によって重複するコードによるストレージやメモリの消費を削減するために、計算機システムにおいて広く普及している。標準的なオペレーティングシステムは、共有ライブラリをサポートしている。例えば、Ｌｉｎｕｘ（登録商標）およびＵｎｉｘ（登録商標）系オペレーティングシステムでは、ＥＬＦ(Executable and Linking Format)およびＥＬＦ  ｓｈａｒｅｄ  ｏｂｊｅｃｔという動的リンク・動的ロード可能な共有ライブラリがサポートされている。
【０００４】
ヘテロな計算機システムは、プログラムの実行を開始する計算機（ホスト）上で動作する実行ファイルから、特定の処理に適した別の計算機（アクセラレータ）を起動する。この特定の処理は、最適化されたコードの再利用性のために共有ライブラリとして提供されることがある。
【０００５】
ヘテロな計算機システムに用いられる複数の計算機で動作する分散プログラムにおいて、自身の計算機以外の計算機（以下、サーバとも呼ばれる）で動作する機能（たとえば、関数・メソッド）を使用する場合、ＲＰＣ(Remote Procedure Call)が使用される。ＲＰＣでは、通常の関数呼び出しとは異なる煩雑な記述・処理の追加が必要である。たとえば、ＲＰＣを使用するときは、クライアントがリモートで呼び出すべき関数に渡す引数を、マーシャリングまたはシリアライズと呼ばれる、転送するためのデータの塊に変換する処理を実行し、変換したデータを、関数を実行するサーバに転送する。サーバは、マーシャリングまたはシリアライズされたデータを元の形に復元（アンマーシャリング、デシリアライズ）し、実際に関数を呼び出す。サーバは、関数を呼び出し実行した結果をマーシャリングしてクライアントに返信する。クライアントはサーバから返された結果をアンマーシャリングする。
【０００６】
一般に、ＲＰＣによって他の計算機の関数を呼び出すプログラムでは、クライアントスタブとサーバスタブとが用いられる。クライアントスタブは、クライアント側でマーシャリングを行い、サーバに要求を発行し、サーバから戻り値を受信し、その値を返す。サーバスタブは、サーバ側で要求を受け付け、アンマーシャリングを行い、サーバ上の関数に引数として渡し、関数を実行し、戻り値をクライアントに送信する。開発者は、クライアントスタブを呼び出すプログラムを記述し、クライアントスタブをリンクする。
【０００７】
非特許文献１には、ＲＰＣの一例としてのＯＮＣ(Open Network Computing)  ＲＰＣについての説明がある。
【０００８】
また、特許文献１には、ホストとホストに接続されるアクセラレータとを含むグラフィックシステムについての記載がある。このグラフィックシステムは、ホストのライブラリにストラクチャ管理部を設ける。クライアントは、ストラクチャ管理部により、直接、アクセラレータ内の共有メモリ上にストラクチャ編集リクエストを格納することができる。
【０００９】
特許文献２に記載の技術は、ゲストプラットフォームのライブラリをロードする必要があるとき、ホスト用の代替のライブラリがあるかを判別し、有れば当該代替のライブラリをロードして使用する。さらに、特許文献２に記載の技術は、ホスト用の代替のライブラリが無ければ、エミュレーション・バイナリ変換によりゲスト用のライブラリを使用する。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開平０９−３１９８５６号公報
【特許文献２】特表２０１３−５１１７８２号公報
【非特許文献】
【００１１】
【非特許文献１】R. Srinivasan, "RPC: Remote Procedure Call Protocol Specification Version 2", [online], August 1995, Request for Comments: 1831 (RFC1831), [平成30年12月25日検索], インターネット < http://www.ring.gr.jp/pub/doc/RFC/rfc1831.txt>
【発明の概要】
【発明が解決しようとする課題】
【００１２】
ＲＰＣに使用するクライアントスタブとサーバスタブ（以下、これらを纏めてスタブと呼ぶ）とを自動生成することで、スタブの開発にかかるコストが軽減される。たとえば、ＩＤＬ(Interface Definition Language)で関数のインタフェースが記述され、ＩＤＬコンパイラによって、スタブが生成される。詳細には、ＯＮＣ  ＲＰＣに使用するＩＤＬコンパイラとして、ＲＰＣＧＥＮが知られている。ＲＰＣＧＥＮは、インタフェース定義ファイルを使って、サーバおよびクライアントのＣ言語スタブを生成するコンパイラである。
【００１３】
しかしながら、ＩＤＬによるスタブの自動生成では、スタブ開発のコストは軽減されるものの、依然としてプログラムによってスタブをリンクさせなければならない。
【００１４】
本発明は、上記課題を解決するためになされたものであり、アクセラレータのプログラムが、スタブを記述することなく、ホストの共有ライブラリをリンクすることができる技術を提供することを目的とする。
【課題を解決するための手段】
【００１５】
本発明の動的リンク装置は、共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクするロード手段と、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替えるプラットフォーム切替手段と、を備える。
【００１６】
本発明の動的ロード装置は、共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクするロード手段と、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替えるプラットフォーム切替手段と、を備える。
【００１７】
本発明の計算機システムは、第１の情報処理装置と、第１の情報処理装置に接続された第２の情報処理装置と、を含む計算機システムであって、第１の情報処理装置は、共有ライブラリを第１の情報処理装置のメモリにロードし、呼び出し元のプログラムからリンクするロード手段と、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を第１の情報処理装置または第２の情報処理装置に切り替えるプラットフォーム切替手段と、を備える。
【００１８】
本発明の動的リンク方法は、共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクし、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える。
【００１９】
本発明の動的ロード方法は、共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクし、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える。
【００２０】
本発明の動的リンクプログラムは、共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクする機能と、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える機能と、をコンピュータに実行させる。
【００２１】
本発明の動的ロードプログラムは、共有ライブラリを自装置のメモリにロードし、呼び出し元のプログラムからリンクする機能と、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える機能と、をコンピュータに実行させる。
【発明の効果】
【００２２】
本発明によれば、アクセラレータのプログラムは、スタブを記述することなく、ホストの共有ライブラリをリンクすることができる。
【図面の簡単な説明】
【００２３】
【図１】本発明の第１の実施形態に係る動的リンク装置の構成例を示すブロック図である。
【図２】図１に示す動的リンク装置が動作する環境の一例としての計算機システムの構成例を示すブロック図である。
【図３】図２に示す計算機システム上で動作する動的リンク装置の動作例（動的リンク方法、動的ロード方法、動的リンクプログラム、動的ロードプログラム）を説明するフローチャートである。
【図４】第１の実施形態において、プログラム“a.out”を起動した際の初期状態における、アクセラレータのメモリ空間の配置例を示す図である。
【図５】第１の実施形態において、動的リンクされた共有ライブラリのロード後における、アクセラレータのメモリ空間の配置例を示す図である。
【図６】第１の実施形態において、動的リンクされた共有ライブラリの遅延リンク完了時における、アクセラレータおよびホストの各メモリ空間の配置例を示す図である。
【図７】本発明の第２の実施形態に係る動的リンク装置の構成例を示すブロック図である。
【図８】本発明の第３の実施形態に係る動的ロード装置の構成例を示すブロック図である。
【図９】本発明の第４の実施形態に係る計算機システムの構成例を示すブロック図である。
【発明を実施するための形態】
【００２４】
［第１の実施形態］
（構成の説明）
図１は、本発明の第１の実施形態に係る動的リンク装置１０の構成例を示すブロック図である。図１に示す動的リンク装置１０は、ロード部１１（ロード手段の一例）と、プラットフォーム切替部１２（プラットフォーム切替手段の一例）と、を備える。
【００２５】
ロード部１１は、共有ライブラリをアクセラレータのメモリにロードし、呼び出し元のプログラムからリンクする動的リンカまたは動的ローダである。ロード部１１は、アクセラレータをターゲットとする共有ライブラリとしての動的オブジェクトと、ホストをターゲットとする共有ライブラリとしての動的オブジェクトとの両方をロードする。
【００２６】
プラットフォーム切替部１２は、ロード部１１がロードした共有ライブラリのターゲットを識別する。また、プラットフォーム切替部１２は、呼び出し元のプログラムにより共有ライブラリの関数を呼び出すための関数呼び出し機能を切り替える。
【００２７】
本実施形態における上記各部は、ハードウェア、またはハードウェアおよびソフトウェアの組み合わせた環境下で実現可能である。たとえば、上記各部は、図２に示す環境下で実現可能である。
【００２８】
図２は、図１に示す動的リンク装置１０が動作する環境の一例としての計算機システム２０の構成例を示すブロック図である。図２に示す計算機システム２０は、ホスト２１とアクセラレータ２２とを備える。ホスト２１とアクセラレータ２２とは、Ｉ／Ｏ(Input/Output)インタフェース２３を介して接続される。ホスト２１とアクセラレータ２２とは、それぞれ、１つまたは複数のプロセッサとメモリとを備える。図２に示す例では、ホスト２１は、ｎ個のプロセッサ２１１−１〜２１１−ｎと、メモリ２１２と、を備える。アクセラレータ２２は、プロセッサ２２１とメモリ２２２とを備える。ホスト２１は、ディスク装置２１３を備える。ディスク装置２１３により、ホスト２１が使用するファイルシステムが、構築される。ディスク装置２１３には、ホスト２１のオペレーティングシステムや、ホスト２１およびアクセラレータ２２が実行するプログラムや、共有ライブラリの情報が格納される。共有ライブラリは、読み出し元のプログラムに動的リンクしている。
【００２９】
ホスト２１およびアクセラレータ２２は、たとえば、ネットワーク上で情報（データやサービス等）を提供しているハードウェアが搭載された機器のことである。ここで、ハードウェアとは、たとえば、ＩＣやＦＰＧＡ等の電子回路、またはコンピュータ（たとえば、ＣＰＵやＧＰＵがメモリに記憶されたプログラムを実行することにより機能を実現する装置）である。あるいは、ハードウェアとは、たとえば、電子回路とコンピュータとが組み合わせされた装置のことを指す。上記において、ＩＣはIntegrated Circuitの略であり、ＦＰＧＡはField Programmable Gate Arrayの略である。また、ＣＰＵはCentral Processing Unitの略であり、ＧＰＵはGraphics Processing Unitの略である。
【００３０】
以下の説明において、動的リンク装置１０は、アクセラレータ２２において実現される場合について説明する。ただし、これは、第１の実施形態を限定するものではない。動的リンク装置１０は、ホスト２１において動作してもよい。すなわち、動的リンク装置１０は、アクセラレータ２２またはホスト２１（以下、第１の情報処理装置または自装置と呼ぶ場合もある）のいずれかにおいて動作すればよい。そして、動的リンク装置１０は、第１の情報処理装置における共有ライブラリの関数呼び出しを、第１の情報処理装置および第１の情報処理装置に接続される装置（以下、第２の情報処理装置または他の装置と呼ぶ場合もある）とのどちらかに切り替える。例えば、動的リンク装置１０がアクセラレータ２２において動作する場合、アクセラレータ２２が第１の情報処理装置であり、ホスト２１が第２の情報処理装置である。動的リンク装置１０がホスト２１において動作する場合、ホスト２１が第１の情報処理装置であり、アクセラレータ２２が第２の情報処理装置である。
【００３１】
（動作の説明）
図３は、図２に示す計算機システム２０上で動作する動的リンク装置１０の動作例を説明するフローチャートである。すなわち、本フローチャートは、動的リンク方法、動的ロード方法、動的リンクプログラム、動的ロードプログラムを説明するものに他ならない。
【００３２】
アクセラレータ２２上でプログラム“a.out”が開始されると、ロード部１１は、プログラム“a.out”が動的リンクしているライブラリをロードする（ステップＳ１０）。
【００３３】
動的リンクしているライブラリがロードされると、プラットフォーム切替部１２はライブラリのターゲットがホスト２１であるかアクセラレータ２２であるかを判別する（ステップＳ１１）。
【００３４】
ライブラリのターゲットがホスト用であれば（ステップＳ１１のＹｅｓ）、プラットフォーム切替部１２は、ホスト２１上でも同じライブラリをロードするよう要求する（ステップＳ１４）。ライブラリをロードした後、プログラム“a.out”がホスト２１のライブラリに含まれる関数を呼び出すと、プラットフォーム切替部１２は、ホスト用スタブへジャンプするよう設定する。詳細には、プラットフォーム切替部１２は、当該関数の呼び出しのためのコードを格納するＰＬＴ(Procedure Linkage Table)からホスト用スタブへジャンプするよう設定する（ステップＳ１５）。
【００３５】
一方、ライブラリのターゲットがアクセラレータ用であれば（ステップＳ１１のＮｏ）、プラットフォーム切替部１２は、ステップＳ１０でロードしたライブラリの初期化処理を実行する（ステップＳ１２）。さらに、プラットフォーム切替部１２は、ＧＯＴ(Global Offset Table)を設定することで、後述される図５のようにメモリの再配置を完了させる（ステップＳ１３）。ステップＳ１２およびステップＳ１３の処理は、一般的な動的リンカでも実行される処理である。
【００３６】
図４および図５を用いて、図３で示されるステップＳ１０の詳細な処理について説明する。
【００３７】
図４は、本実施形態において、プログラム“a.out”を起動した際の初期状態における、アクセラレータ２２のメモリ２２２のメモリ空間３の配置例を示す図である。本実施例における“a.out”は、たとえば、ＥＬＦ動的リンク実行ファイルである。
【００３８】
図４に示すように、アクセラレータ２２のメモリ空間３には、プログラム“a.out”のヘッダおよびテキストを保持する領域であるテキスト領域３１１と、“a.out”のデータを格納する領域であるデータ領域３１２とが配置される。さらに、アクセラレータ２２のメモリ空間３には、プログラム“a.out”をロードした動的リンカ“ld.so”のヘッダおよびテキストを保持するテキスト領域３２１と、動的リンカ“ld.so”のデータを格納するデータ領域３２２とが配置される。
【００３９】
プログラム“a.out”は、共有ライブラリ“libhost.so”をリンクし、“libhost.so”に含まれる関数ｆｕｎｃを呼び出している。
【００４０】
テキスト領域３１１は、動的リンクした関数を呼び出すためのＰＬＴを含む。関数ｆｕｎｃを呼び出すＰＬＴは、ｆｕｎｃ＠ｐｌｔ３１１１を含む。
【００４１】
また、データ領域３１２は、動的リンクしたライブラリにおける関数のアドレスを格納する“.got.plt”において関数ｆｕｎｃに対応するエントリであるＧＯＴ３１２１を有する。ＧＯＴ３１２１は、ｆｕｎｃ＠ｐｌｔで指示される領域に格納される間接ジャンプ命令のオペランドとして使用される。ＧＯＴ３１２１の初期値は、ｆｕｎｃ＠ｐｌｔ３１１１中の間接ジャンプ命令の次の命令のアドレスである。これは、遅延リンクに使用するためである。
【００４２】
動的リンカのテキスト領域３２１は、共有ライブラリ用スタブ３２１１と、ホスト用スタブ３２１２とを含む。
【００４３】
共有ライブラリ用スタブ３２１１は、動的リンカ“ld.so”のシンボルテーブルから、所定のＰＬＴエントリの関数の配置されたアドレスを解決してＰＬＴの再配置を行う。すなわち、共有ライブラリ用スタブ３２１１は、“.got.plt”の対応するエントリを更新して、当該関数のアドレスにジャンプする。共有ライブラリ用スタブ３２１１による再配置の後は、共有ライブラリ中の関数は、ＰＬＴからジャンプ命令により、共有ライブラリ用のスタブを経由せずに呼び出される。
【００４４】
ホスト用スタブ３２１２は、関数呼び出しの引数として渡された値を、ホスト２１側で呼び出す関数とともにアクセラレータ２２からホスト２１に通知して、ホスト２１上での関数の呼び出しを要求する。一例としては、ホスト用スタブ３２１２は、ＡＢＩ(Application Binary Interface)で規定されたレジスタの値および呼び出す関数のアドレスをマーシャリングし、Ｉ／Ｏインタフェース２３を介してホスト２１に転送する。
【００４５】
ロード部１１は、プログラム“a.out”が要求している、すなわち動的リンクしているライブラリをファイルシステムからメモリ空間３にロードする。そして、ロード部１１は、“a.out”の初期化ルーチンを実行する。本実施例において、“libhost.so”のテキスト領域およびデータ領域は、ディスク装置２１３上のファイルシステムからアクセラレータ２２のメモリ空間３にマップされる。
【００４６】
図５は、本実施例において動的リンカ“ld.so”による初期化処理によって、動的リンクされた共有ライブラリのロード後における、アクセラレータ２２のメモリ空間３の配置の一例を示す図である。図４と同じ領域については、図４と同じ番号を付与し、その詳細な説明を省略する。図５に示すアクセラレータ２２のメモリ空間３には、図４と同様に、“a.out”のテキスト領域３１１およびデータ領域３１２、並びに、動的リンカ“ld.so”のテキスト領域３２１およびデータ領域３２２が配置されている。さらに、図５に示すメモリ空間３には、“libhost.so”のヘッダおよびテキストを格納するテキスト領域４３１と、“libtest.so”のデータを格納するデータ領域４３２とが配置されている。テキスト領域４３１には、関数ｆｕｎｃ４３１１が含まれる。ただし、関数ｆｕｎｃ４３１１は、ホスト２１で実行するバイナリであり、アクセラレータ２２のプロセッサ２２１では実行できない。
【００４７】
図６を参照して、本実施例におけるプラットフォーム切替部１２によるＰＬＴの設定処理、すなわち遅延リンク（ステップＳ１５）の詳細を説明する。
【００４８】
図６は、本実施形態において関数呼び出し時にプラットフォーム切替部１２が行う遅延リンク完了時における、アクセラレータ２２のメモリ２２２のメモリ空間３、およびホスト２１のメモリ２１２のメモリ空間５の配置の一例を示す図である。図４および図５と同じ領域については、図４および図５と同じ番号を付し、その説明を省略する。ホスト２１のメモリ空間５には、“libhost.so”のテキスト領域５３１とデータ領域５３２とが配置されている。テキスト領域５３１およびデータ領域５３２は、ステップＳ１４においてロード部１１がロードした領域である。テキスト領域５３１は、関数ｆｕｎｃ５３１１を含んでいる。アクセラレータ２２のメモリ空間３に配置されたｆｕｎｃ用スタブ５４１は、ホスト２１の関数ｆｕｎｃ５３１１を呼び出すためのスタブである。
【００４９】
プログラム“a.out”が関数ｆｕｎｃを呼び出すと、アクセラレータ２２は、まず、“a.out”のテキスト領域３１１にあるｆｕｎｃ＠ｐｌｔ３１１１のコードを実行する。動的リンクをサポートするプログラムにおいて、ＰＬＴには、“.got.plt”のエントリに保持されたアドレスへの間接ジャンプ命令と、ＰＬＴの番号を設定して共有ライブラリ用スタブ３２１１にジャンプする命令とが含まれる。データ領域３１２にある“.got.plt”のエントリＧＯＴ３１２１が未設定であるため、アクセラレータ２２は、間接ジャンプにより次の命令を実行する。アクセラレータ２２の処理は、共有ライブラリ用スタブ３２１１へジャンプする。
【００５０】
本実施形態における共有ライブラリ用スタブ３２１１の処理を説明する。共有ライブラリ用スタブ３２１１は、シンボルテーブルから対応するアドレスを検索する。プラットフォーム切替部１２は、検索した結果得られたアドレスを含むテキスト領域が、ホスト用のライブラリのものか、アクセラレータ用のライブラリのものかを識別する。
【００５１】
アクセラレータ用であれば、プラットフォーム切替部１２は、一般的な動的リンカと同様に、“.got.plt”のエントリであるＧＯＴ３１２１を、得られたアドレスで更新する。
【００５２】
ホスト用であれば、プラットフォーム切替部１２は、アクセラレータ２２のメモリ空間３に領域を割り当て、ｆｕｎｃ用スタブ５４１を作成する。ｆｕｎｃ用スタブ５４１は、ホスト２１の関数ｆｕｎｃ５３１１のアドレスをセットしてホスト用スタブ３２１２にジャンプするアクセラレータ用の命令列である。ホスト２１の関数ｆｕｎｃ５３１１のアドレスは、ＡＢＩ上における関数呼び出しによって、破壊してよいレジスタの一つにセットされる。あるいは、ホスト２１の関数ｆｕｎｃ５３１１のアドレスは、スタックのトップにセットされてもよい。あるいは、本用途のために、アドレス１つ分のＴＬＳ(Thread Local Storage)の領域が予約されてもよい。プラットフォーム切替部１２がｆｕｎｃ用スタブ５４１を作成した後、“.got.plt”のエントリであるＧＯＴ３１２１をｆｕｎｃ用スタブ５４１のアドレスにセットし、アクセラレータ２２は、ホスト用スタブ３２１２にジャンプする。ホスト用スタブ３２１２は、ホスト２１の関数ｆｕｎｃ５３１１を呼び出す。
【００５３】
また、２回目以降の関数ｆｕｎｃの呼び出しでは、“.got.plt”が更新されているので、アクセラレータ２２は、ＰＬＴからｆｕｎｃ用スタブ５４１で関数ｆｕｎｃ５３１１のアドレスを指定して、ホスト用スタブ３２１２にジャンプする。これによって、ホスト用スタブ３２１２からホスト２１の関数ｆｕｎｃ５３１１が呼び出される。
【００５４】
（効果の説明）
以上説明した第１の実施形態によれば、プラットフォーム切替部１２を備えることで、アクセラレータ２２のプログラムは、スタブを記述することなく、ホスト２１の共有ライブラリをリンクできる。
【００５５】
（変形例）
以上説明した第１の実施形態では、動的リンカが、スタンダードなＬｉｎｕｘ（登録商標）の動的リンカである場合を例に挙げた。しかしながら、これはあくまで一例であり、第１の実施形態は、上記のような動的リンカに限定されない。
【００５６】
また、動的ローダは、たとえば、プログラムのロード時に依存関係に基づいてロードする代わりに、ｄｌｏｐｅｎ関数のようなＡＰＩ(Application Programming Interface)の呼び出しを用いて動作してもよい。
【００５７】
また、遅延リンクは、必須ではない。たとえば、最初の呼び出しより前に、ロード直後にｆｕｎｃ用スタブ５４１が生成され、“.got.plt”のエントリがｆｕｎｃ用スタブ５４１のアドレスにセットされてもよい。
【００５８】
また、ＩＳＡ(Instruction Set Architecture)やＡＢＩによっては、各関数用のスタブ（ｆｕｎｃ用スタブ５４１相当）を用意せず、直接ホスト用スタブにセットできる場合がある。例えば、スタブにジャンプした時点で関数呼び出しのアドレス（ｆｕｎｃ＠ｐｌｔ）が残っていれば、そのアドレスから対応するＰＬＴがわかる、つまり、呼び出すべき関数ｆｕｎｃを特定することが可能である。
【００５９】
また、以上説明した実施形態の場合、汎用レジスタにおける数値引数になる可能性のあるものは、すべて転送することを前提としているが、本実施形態は、これに限定されることはない。
【００６０】
たとえば、動的ローダは、ｘ８６−６４のように引数の型によって異なるレジスタに引数が保存されるＡＢＩでは、すべての引数をマーシャリングして送る。なお、ｘ８６−６４は、インテル（登録商標）社の命令セットアーキテクチャを６４ビットに拡張した命令セットの一つである。
【００６１】
また、動的ローダは、Ｄｗａｒｆのデバッグ情報または名前修飾（ｎａｍｅ  ｍａｎｇｌｉｎｇ）された関数名（たとえばＣ＋＋の場合）などを用いる場合、次のように動作してもよい。すなわち、動的ローダは、バイナリに含まれている情報から、引数の型およびサイズを取得し、構造体ポインタの引数がある場合にデータをコピーインおよびマーシャリングして転送することも可能である。なお、Ｄｗａｒｆは、広く使われているデバッグ用データフォーマットの規格である。
【００６２】
［第２の実施形態］
図７は、本発明の第２の実施形態に係る動的リンク装置３００の構成例を示すブロック図である。動的リンク装置３００は、ロード部３０２（ロード手段の一例）と、プラットフォーム切替部３０４（プラットフォーム切替手段の一例）と、を備える。
【００６３】
ロード部３０２は、共有ライブラリをアクセラレータ２２のメモリ２２２にロードし、呼び出し元のプログラムからリンクする。プラットフォーム切替部３０４は、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える。すなわち、ロード部３０２とプラットフォーム切替部３０４は、ロード部１１とプラットフォーム切替部１２と、それぞれ同様に動作する。
【００６４】
本実施形態によれば、アクセラレータ２２のプログラムは、スタブを記述することなく、ホスト２１の共有ライブラリをリンクすることができる。その理由は、動的リンク装置３００のロード部３０２とプラットフォーム切替部３０４が、第１の実施形態における対応する構成とそれぞれ同様に動作するためである。
【００６５】
［第３の実施形態］
図８は、本発明の第３の実施形態に係る動的ロード装置４００の構成例を示すブロック図である。動的ロード装置４００は、ロード部４０２（ロード手段の一例）と、プラットフォーム切替部４０４（プラットフォーム切替手段の一例）と、を備える。
【００６６】
ロード部４０２は、共有ライブラリをアクセラレータ２２のメモリ２２２にロードし、呼び出し元のプログラムからリンクする。プラットフォーム切替部４０４は、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を自装置または他の装置に切り替える。すなわち、ロード部４０２とプラットフォーム切替部４０４は、ロード部１１とプラットフォーム切替部１２と、それぞれ同様に動作する。
【００６７】
本実施形態によれば、アクセラレータ２２のプログラムは、スタブを記述することなく、ホスト２１の共有ライブラリをリンクすることができる。その理由は、動的ロード装置４００のロード部４０２とプラットフォーム切替部４０４が、第１の実施形態における対応する構成とそれぞれ同様に動作するためである。
【００６８】
［第４の実施形態］
図９は、本発明の第４の実施形態に係る計算機システム５００の構成例を示すブロック図である。
【００６９】
計算機システム５００は、ホスト６００と、ホスト６００に接続されたアクセラレータ７００と、を含む。
【００７０】
動的リンク装置１０などがアクセラレータ７００に含まれる場合、アクセラレータ７００は、共有ライブラリをアクセラレータ７００のメモリにロードし、呼び出し元のプログラムからリンクする。さらに、アクセラレータ７００は、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能をアクセラレータ７００またはホスト６００に切り替える。つまり、アクセラレータ７００は、関数呼び出しの機能を第１の情報処理装置または第２の情報処理装置に切り替える。このように、アクセラレータ７００は、アクセラレータ２２と同様に動作する。
【００７１】
本実施形態によれば、アクセラレータ７００のプログラムは、スタブを記述することなく、ホスト６００の共有ライブラリをリンクすることができる。その理由は、アクセラレータ７００が、第１の実施形態のアクセラレータ２２と同様に動作するためである。
【００７２】
なお、動的リンク装置１０などがホスト６００に含まれる場合、ホスト６００は、共有ライブラリをホスト６００のメモリにロードし、呼び出し元のプログラムからリンクする。さらに、ホスト６００は、共有ライブラリのターゲットを識別し、呼び出し元のプログラムから共有ライブラリの関数呼び出しの機能を切り替える。この場合、ホスト６００が、動的リンク装置１０などと同様の機能を実現する。
【００７３】
以上説明した各実施形態は、共有ライブラリをサポートするヘテロな計算機システム、そのオペレーティングシステム、動的リンカ、または動的ローダなどに広く適用可能である。
【００７４】
以上、各実施形態を用いて本発明を説明したが、本発明の技術的範囲は、上記各実施形態の記載に限定されない。上記各実施形態に多様な変更又は改良を加えることが可能であることは当業者にとって自明である。従って、そのような変更又は改良を加えた形態もまた本発明の技術的範囲に含まれることは説明するまでもない。また、以上説明した各実施形態において使用される、数値や各構成の名称等は例示的なものであり適宜変更可能である。また、図面中の矢印の方向は、一例を示すものであり、ブロック間の信号の向きを限定するものではない。
【符号の説明】
【００７５】
３    メモリ空間
５    メモリ空間
１０    動的リンク装置
１１    ロード部
１２    プラットフォーム切替部
２０    計算機システム
２１    ホスト
２２    アクセラレータ
２３    Ｉ／Ｏインタフェース
２１１−１〜２１１−ｎ    プロセッサ
２１２    メモリ
２１３    ディスク装置
２２１    プロセッサ
２２２    メモリ
３００    動的リンク装置
３０２    ロード部
３０４    プラットフォーム切替部
４００    動的ロード装置
４０２    ロード部
４０４    プラットフォーム切替部
５００    計算機システム
６００    ホスト
７００    アクセラレータ
【図１】
2020113050.tif 000003
【図２】
2020113050.tif 000004
【図３】
2020113050.tif 000005
【図４】
2020113050.tif 000006
【図５】
2020113050.tif 000007
【図６】
2020113050.tif 000008
【図７】
2020113050.tif 000009
【図８】
2020113050.tif 000010
【図９】
2020113050.tif 000011