DPCT1104
目次
DPCT1104#
メッセージ#
<式テキスト> は、メモリーにロードされた動的ライブラリーを指す必要があります。動的ライブラリーは、ラップされたカーネル関数を提供しなければなりません。
詳細な説明#
CUDA* アプリケーションは、<expression text> がファイルイメージがコピーされている CUDA* モジュラーを指していることを前提としています。ユーザーは、CUDA* モジュールを生成した CUDA* コードが SYCL* コードに移行され、カーネル・ライブラリーを生成するためコンパイルされ、移行された STCL* アプリケーションによってメモリーにコピーされることを確認する必要があります。
修正方法の提案
ユーザーは、CUDA* モジュールの生成に使用されるモジュールのソースファイルを検索し、インテル® DPC++ 互換性ツールの --extra-arg=--ptx
オプションを使用して SYCL* に移行し、ラップされたカーネル関数を生成する必要があります。
dpct <モジュールのソースファイル(複数可能)> --extra-arg=--ptx
移行されたモジュールのソースファイルをコンパイルして、カーネル・ライブラリーを作成します。
Linux*:
icpx -fsycl <移行されたモジュールのソースファイル(複数可能)> -fPIC -shared -o <カーネル・ライブラリーのファイル名>
Windows*:
icpx -fsycl <移行されたモジュールのソースファイル(複数可能)> -shared -o <カーネル・ライブラリーのファイル名>
ユーザーは、アプリケーションの実行中にカーネル・ライブラリーをメモリーにロードすることを確認する必要があります。次の例では、<カーネル・ライブラリーのファイル名> を library.so
に設定します。
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1 void test() {
2 CUmodule module;
3 const void *image = loadFile("module.ptx");
4 cuModuleLoadData(&module, image);
5 }
このコードは、以下の SYCL* コードに移行されます。
1 void test() {
2 dpct::kernel_library module;
3 const void *image = loadFile("module.ptx");
4 /*
5 DPCT1104:0: 'image' should point to a dynamic library loaded in memory. The
6 dynamic library should supply wrapped kernel functions.
7 */
8 module = dpct::load_kernel_library_mem(image);
9 }
このコードは次のように書き換えられます。
1 void test() {
2 dpct::kernel_library module;
3 // "library.so" is compiled from the SYCL code which is migrated from CUDA code
4 // used to build "module.ptx"
5 const void *image = loadFile("library.so");
6 module = dpct::load_kernel_library_mem(image);
7 }