Linux* でのプロジェクトの移行

コマンドラインの使用

プログラムには、システム・ライブラリーやほかのプロジェクトのヘッダーがインクルードされている場合があります。インテル® DPC++ 互換性ツールは、移行すべきヘッダーとそうでないヘッダーを識別する必要があります。--in-root オプションを使用して、プログラムソースの場所を指定します。--in-root で指定したディレクトリー内のすべてのソース (任意の入れ子レベル) は移行されます。--in-root で指定したディレクトリー内のヘッダーファイル (任意の入れ子レベル) のうち、移行するソースやヘッダーファイルでインクルードされているものは移行されます。--in-root ディレクトリー内にないファイルは、システムファイルと見なされ、プログラムやソースファイルでインクルードされていても移行されません。

--out-root オプションは、® DPC++ 互換性ツールにより生成される DPC++ コードの保存先ディレクトリーを指定します。相対パスは維持され、拡張子は .dp.cpp に変更されます。

以下に例を示します。

  1. 以下のいずれかの方法で Folder Options サンプルを開きます。

    1. oneapi-cli ユーティリティーを使用して、[Intel® DPC++ Compatibility Tool] カテゴリーからサンプルを選択します。

    2. GitHub* からダウンロードします: https://github.com/oneapi-src/oneAPI-samples/tree/master/Tools/Migration (英語)。

  2. サンプル・プロジェクトのルートに移動します。Folder Options サンプル・プロジェクトには、2 つのフォルダー (foobar) に格納された、3 つのファイル (main.cuutil.cu、および util.h) から成る単純な CUDA* プログラムが含まれています。

  3. ツールの --in-root オプションを使用して、移行する CUDA* ファイルの場所を指定する入力ファイルを提供します。--out-root オプションを使用して、結果ファイルを生成する場所を指定します。展開した foo フォルダーの親フォルダーから、インテル® DPC++ 互換性ツールを実行します。

    1
    dpct --in-root=foo --out-root=result/foo foo/main.cu foo/bar/util.cu --extra-arg="-Ifoo/bar/"
    

    --in-root オプションが指定しない場合、最初の入力ソースファイルのディレクトリーが使用されます。--out-root オプションを指定しない場合、./dpct_output が使用されます。

  4. 結果として、以下のファイルが生成されます。

    • ./result/foo/main.dp.cpp

    • ./result/foo/bar/util.dp.cpp

    • ./result/foo/bar/util.h

  5. 移行されたソースコードを確認し、インテル® DPCT により警告が出力された場合は対処し、新しいプログラムの正当性を検証してください。最も正確で詳細な警告の対処法については、サンプルの README ファイルの「Addressing Warnings in the Migrated Code (移行されたコードの警告の対処法)」を参照してください。

コマンドラインの機能については、「コマンドライン・オプションのリファレンス」を参照してください。

Make/CMake* を使用した完全なプロジェクトの移行

プロジェクトで Make や CMake* を使用している場合、コンパイル・データベース・サポートを利用して、コンパイルオプション、設定、マクロ定義、およびインクルード・パスをインテル® DPC++ 互換性ツールに提供できます。コンパイル・データベースは、特定のプロジェクトのビルドに必要なコマンドを含む JSON* ファイルです。インテル® DPC++ 互換性ツールによって提供される intercept-build スクリプトを実行することで生成できます。Intercept-build は、次の拡張子のファイルのコンパイル・コマンドラインのキャプチャーをサポートします: .c.C.cc.CC.cp.cpp.cxx.c++.C++.txx、および .cu。インテル® DPC++ 互換性ツールは、コンパイル・データベースを解析し、入力ソースを移行する際に必要なオプションを適用します。

この例では、Rodinia NW DPCT サンプルを使用しています。

  1. 以下のいずれかの方法で Rodinia NW DPCT サンプルを開きます。

    1. oneapi-cli ユーティリティーを使用して、[Intel® DPC++ Compatibility Tool] カテゴリーからサンプルを選択します。

    2. GitHub* からダウンロードします: https://github.com/oneapi-src/oneAPI-samples/tree/master/Tools/Migration (英語)。

  2. アプリケーションをクリーンします。

    1
     make clean
    

ステップ 1: コンパイル・データベースの作成

CMake* を使用する場合: intercept-build を実行する前に、CMakeLists.txt から Makefile を設定して生成します。典型的なコマンドの例は cmake... です。

コンパイル・データベースを作成するには、プロジェクトを作成してクリーンします。そして、intercept-build を実行します。

以下に例を示します。

1
intercept-build make

intercept-build スクリプトは、オリジナルのプログラムをビルドせずに、プロジェクトのビルドコマンドを実行します。また、コンパイラーの起動をすべて記録し、入力ファイルの名前とコンパイラー・オプションをコンパイル・データベース・ファイル (compile_commands.json) に保存します。

以下の例は、CUDA* ヘッダーが /usr/local/cuda/include にあると仮定しています。必要に応じて、このパスを実際のパスに置き換えてください。

intercept-build を実行後、compile_commands.json ファイルの内容を確認します。ファイルの内容は、次のようになります。

1
2
3
4
5
6
[{
  "command" : "nvcc -c -o needle -I/usr/local/cuda/include -D__CUDA_ARCH__=400 "
              "-D__CUDACC__=1 needle.cu",
  "directory" : "/home/user/projects/DPCPP_CT/rodinia_3.1/cuda/nw",
  "file" : "/home/user/projects/DPCPP_CT/rodinia_3.1/cuda/nw/needle.cu"
}]

ステップ 2: インテル® DPC++ 互換性ツールでのコンパイル・データベースの使用

デフォルトでは、インテル® DPC++ 互換性ツールは、現在のディレクトリーで compile_commands.json ファイルを検索して、このファイルにあるコンパイラーオプションを各入力ファイルに対して使用します。コンパイル・データベース・ファイルの場所は、-p オプションを使用して変更できます。以下に例を示します。

1
dpct -p=<path to location of compilation database file> --in-root=../.. --out-root=dpct_output <some_file.cu>

上記のコマンドは、<some_file.cu> の情報が <コンパイル・データベースのパス> にある compiler_commands.json で見つかった場合、このファイルを移行します。コンパイル・データベースに記録されているすべての関連ファイルを移行するには、以下のようなコマンドを使用します。

1
dpct -p compile_commands.json --in-root=. --out-root=migration

上記のコマンドを Rodinia NW DPCT サンプルで実行すると、migration 出力フォルダーに以下のファイルが生成されます。

  • needle.h

  • needle_kernel.dp.cpp

  • needle.dp.cpp

インテル® DPC++ 互換性ツールは、ソースの移行を試みます。移行できなかったコードには、生成されたソースファイルに追加の情報を示すコメントが挿入されます。生成されたソース ファイルで DPCT10grep すると、インテル® DPC++ 互換性ツールによって挿入されたコメントを確認できます。

警告の出力

インテル® DPC++ 互換性ツールは、コードを DPC++ に準拠させるため、または正しいコードにするため、ファイルの移行時に注意が必要なコード領域を示します。生成されるソースファイルにコメントが挿入され、出力に警告として表示されます。特定の警告の意味については、「診断のリファレンス」を参照してください。以下に例を示します。

1
2
3
/path/to/file.hpp:26:1: warning: DPCT1003:0: Migrated API does not return error code. (*,0) is inserted. You may need to rewrite this code.
// source code line for which warning was generated
^

ステップ 3: ソースの正当性の検証とインテル® DPC++ 互換性ツールが移行できなかったコードの修正

プリプロセッサー・ディレクティブを使用して宣言された変数を使用するソースコードの移行を核にします。移行されたソースコードを確認し、インテル® DPCT により警告が出力された場合は対処し、新しいプログラムの正当性を検証してください。最も正確で詳細な警告の対処法については、サンプルの README ファイルの「Addressing Warnings in the Migrated Code (移行されたコードの警告の対処法)」を参照してください。

Eclipse* の使用

Eclipse* プラグインは、インテル® oneAPI ベース・ツールキットのインストール時に Eclipse* インスタンスを指定すると、自動的にインストールされます。

Eclipse* からサンプルにアクセスして使用するには、次の操作を行います。

  1. Eclipse* を開きます。

  2. [Intel] メニューから [Browse Intel® oneAPI Samples] を選択して、任意のサンプルを参照します。

  3. 新しいプロジェクトを開いた状態で、[Migrate Project to DPC++] を選択します。

  4. 移行により新しいプロジェクトが作成され、Eclipse* ウィンドウに警告が直接表示されます。