Linux* でのプロジェクトの移行¶
コマンドラインの使用¶
プログラムには、システム・ライブラリーやほかのプロジェクトのヘッダーがインクルードされている場合があります。インテル® DPC++ 互換性ツールは、移行すべきヘッダーとそうでないヘッダーを識別する必要があります。--in-root
オプションを使用して、プログラムソースの場所を指定します。--in-root
で指定したディレクトリー内のすべてのソース (任意の入れ子レベル) は移行されます。--in-root
で指定したディレクトリー内のヘッダーファイル (任意の入れ子レベル) のうち、移行するソースやヘッダーファイルでインクルードされているものは移行されます。--in-root
ディレクトリー内にないファイルは、システムファイルと見なされ、プログラムやソースファイルでインクルードされていても移行されません。
--out-root
オプションは、® DPC++ 互換性ツールにより生成される DPC++ コードの保存先ディレクトリーを指定します。相対パスは維持され、拡張子は .dp.cpp
に変更されます。
以下に例を示します。
以下のいずれかの方法で Folder Options サンプルを開きます。
oneapi-cli ユーティリティーを使用して、[Intel® DPC++ Compatibility Tool] カテゴリーからサンプルを選択します。
GitHub* からダウンロードします: https://github.com/oneapi-src/oneAPI-samples/tree/master/Tools/Migration (英語)。
サンプル・プロジェクトのルートに移動します。Folder Options サンプル・プロジェクトには、2 つのフォルダー (
foo
とbar
) に格納された、3 つのファイル (main.cu
、util.cu
、およびutil.h
) から成る単純な CUDA* プログラムが含まれています。ツールの
--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
が使用されます。結果として、以下のファイルが生成されます。
./result/foo/main.dp.cpp
./result/foo/bar/util.dp.cpp
./result/foo/bar/util.h
移行されたソースコードを確認し、インテル® 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 サンプルを使用しています。
以下のいずれかの方法で Rodinia NW DPCT サンプルを開きます。
oneapi-cli ユーティリティーを使用して、[Intel® DPC++ Compatibility Tool] カテゴリーからサンプルを選択します。
GitHub* からダウンロードします: https://github.com/oneapi-src/oneAPI-samples/tree/master/Tools/Migration (英語)。
アプリケーションをクリーンします。
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++ 互換性ツールは、ソースの移行を試みます。移行できなかったコードには、生成されたソースファイルに追加の情報を示すコメントが挿入されます。生成されたソース ファイルで DPCT10
を grep
すると、インテル® 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* からサンプルにアクセスして使用するには、次の操作を行います。
Eclipse* を開きます。
[Intel] メニューから [Browse Intel® oneAPI Samples] を選択して、任意のサンプルを参照します。
新しいプロジェクトを開いた状態で、[Migrate Project to DPC++] を選択します。
移行により新しいプロジェクトが作成され、Eclipse* ウィンドウに警告が直接表示されます。