この記事は、インテル® デベロッパー・ゾーンに公開されている「Known Issue: Static Libraries and Target Offload」の日本語参考訳です。
既知の問題: スタティック・ライブラリーとターゲットオフロード
次の問題は、オフロードカーネルを含むスタティック・ライブラリーを使用する、インテル® oneAPI ベース・ツールキットおよびインテル® oneAPI HPC ツールキットの Linux* LLVM ベースのコンパイラー (dpcpp、icx、icpx、および ifx) に影響します。
大規模なアプリケーションは、コンポーネントのスタティック・ライブラリーに分解されることがあります。コンポーネントのライブラリーは、アプリケーションのオブジェクト・ファイルとリンクされて最終的な実行ファイルが形成されます。コンパイラーとリンカーは通常、-L オプションを使用してライブラリー検索パスにディレクトリーを追加し、-l オプションを使用してリンクするライブラリーを省略表記で指定します。
例えば、スタティック・ライブラリー・アーカイブ libfoo.a または libbar.a をビルドして /path/to/libs に格納するアプリケーションは通常、次のようにメインプログラム prog にリンクします。
ifx -o prog obj1.o obj2.o -L /path/to/libs -lfoo -lbar
icx -o prog obj1.o obj2.o -L /path/to/libs -lfoo -lbar
dpcpp -o prog obj1.o obj2.o -L /path/to/libs -lfoo -lbar
このコマンドラインで、リンカーは、コマンドラインで以前リンクされたオブジェクトから未定義シンボルの関係を満たすアーカイブ libfoo.a または libbar.a のオブジェクト・ファイルにリンクします。
2021.1 リリースでは、バグにより、インテル® oneAPI コンパイラーは、ターゲット・オフロード・コード (GPU または FPGA 向けのオフロードコードなど) を含むライブラリーで -l オプションを使用したライブラリー・アーカイブのリンクをサポートしていません。リンクのコマンドラインで、-l オプションを使用する代わりに、アーカイブ (拡張子 .a のファイル) のフルパスを指定する必要があります。さらに、-l オプションで指定したライブラリーがコマンドラインから省略された場合でも、すべての必要なオブジェクトがリンクされることを保証する必要があります。最も簡単な方法は、アーカイブ全体をリンクすることです。
上記の例で、libbar.a にターゲット・オフロード・コードが含まれる場合、リンクのコマンドラインを次のように変更します。
icx -o prog obj1.o obj2.o -L /path/to/libs -lfoo -Wl,–whole-archive /path/to/libs/libbar.a -Wl,–no-whole-archive
コンパイラーは追加のライブラリーをリンカーに渡し、whole-archive モードを無効にしないとコンパイラー指定のライブラリーに複数のシンボルが定義されるため、追加のライブラリーをリストしない場合でもユーザー・ライブラリーの後に -Wl,–no-whole-archive オプションが必要なことに注意してください。
一部のライブラリー・アーカイブには、さまざまなアプリケーションをサポートする多くのルーチンが含まれています。アプリケーションがライブラリーの一部しか使用しない場合、アーカイブ全体をリンクするコストは非常に高いと考えられます。
オリジナルの動作を実現する 1 つの方法は、ターゲット・オフロード・コードを含むライブラリーを直接リンクすることです。
上記の例で、libbar.a にターゲット・オフロード・コードが含まれる場合、リンクのコマンドラインを次のように変更します。
ifx -o prog obj1.o obj2.o /path/to/libs/libfoo.a /path/to/libs/libbar.a
この状況は問題であると認識されており、oneAPI の将来のリリースで修正される予定です。インテル® oneAPI ベース・ツールキットおよびインテル® oneAPI HPC ツールキットの Linux* LLVM ベースのコンパイラー (dpcpp、icx、icpx、および ifx) はすべて、この影響を受けます。
製品とパフォーマンス情報
1実際の性能は利用法、構成、その他の要因によって異なります。
詳細は、www.Intel.com/PerformanceIndex (英語) を参照してください。