インテル® oneAPI ツールキットの既知のコンパイラー問題の回避方法

同カテゴリーの次の記事

oneAPI 仕様日本語版の公開

この記事は、インテル® デベロッパー・ゾーンに公開されている「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 (英語) を参照してください。

関連記事

  • OpenCL* 向けの設計を DPC++ へ移行OpenCL* 向けの設計を DPC++ へ移行 この記事は、インテル® デベロッパー・ゾーンに公開されている「Migrating OpenCL™ Designs to DPC++」の日本語参考訳です。 この記事の PDF 版はこちらからご利用になれます。 概要 この記事は、Khronos OpenCL* とデータ並列 C++ (DPC++) […]
  • DPC++ または OpenMP* オフロードを使用するヘテロジニアス・プログラムをデバッグするときの課題、ヒント、既知の問題DPC++ または OpenMP* オフロードを使用するヘテロジニアス・プログラムをデバッグするときの課題、ヒント、既知の問題 この記事は、インテル® デベロッパー・ゾーンに公開されている「Challenges, tips, and known issues when debugging heterogenous programs using DPC++ or OpenMP offload」の日本語参考訳です。 2020 年 11 月 17 […]
  • ファクトシート: oneAPIファクトシート: oneAPI この記事は、インテル ニュースルームに公開されている「Fact Sheet: oneAPI」の日本語参考訳です。 この記事の PDF 版はこちらからご利用になれます。 oneAPI とは? oneAPI […]
  • ターゲット GPU での C++ アプリケーションのスピードアップを予測ターゲット GPU での C++ アプリケーションのスピードアップを予測 この記事は、インテル® デベロッパー・ゾーンに公開されている「Intel® Advisor Cookbook」の「Estimate the C++ Application Speedup on a Target GPU」の日本語参考訳です。 バージョン: 2021.1 (最終更新日: 2021 年 5 月 19 […]
  • HPC パフォーマンスの測定HPC パフォーマンスの測定 この記事は、インテル® デベロッパー・ゾーンに掲載されている「Measuring performance in HPC」の日本語参考訳です。 この記事は、HPC (ハイパフォーマンス・コンピューティング) におけるインテル® Xeon Phi™ コプロセッサーについて紹介するシリーズの 1 つ目です。インテル® […]