DPCT1081#
メッセージ#
生成されたコードでは、<pointer variable> がグローバル・メモリー・アドレス空間を指していると仮定しています。ローカルまたはプライベート・メモリー・アドレス空間を指す場合、address_space::global
を address_space::local
または address_space::private
に置き換えます。
詳細な説明#
インテル® DPC++ 互換性ツールは、<pointer variable> が指すメモリーアドレス空間の推測を試みます。アドレス空間を推測できない場合 (例えば、ポインター変数が複数の関数で使用されている場合など)、ツールは address_space::global
を使用し、警告を出力します。
修正方法の提案
<ポインター変数 が>指すメモリーアドレス空間を確認して、address_space::global
を正しいアドレス空間に置き換えます。
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1 __device__ void bar1(double *out1, double *d) {
2 double i = 30;
3 double &d2 = *d;
4 sincos(i, out1, &d2);
5 }
6
7 __global__ void kernel(double *out1, double *out2) {
8 double d;
9 bar1(out1, &d);
10 *out2 = d;
11 }
このコードは、以下の SYCL* コードに移行されます。
1 void bar1(double *out1, double *d) {
2 double i = 30;
3 double &d2 = *d;
4 /*
5 DPCT1081:0: The generated code assumes that "&d2" points to the global memory
6 address space.If it points to a local or private memory address space,
7 replace "address_space::global" with "address_space::local" or
8 "address_space::private".
9 */
10 *out1 = sycl::sincos(
11 i, sycl::address_space_cast<sycl::access::address_space::global_space,
12 sycl::access::decorated::yes, double>(&d2));
13 }
14
15 void kernel(double *out1, double *out2) {
16 double d;
17 bar1(out1, &d);
18 *out2 = d;
19 }
このコードは次のように書き換えられます。
1 void bar1(double *out1, double *d) {
2 double i = 30;
3 double &d2 = *d;
4 *out1 = sycl::sincos(
5 i, sycl::address_space_cast<sycl::access::address_space::private_space,
6 sycl::access::decorated::yes, double>(&d2));
7 }
8
9 void kernel(double *out1, double *out2) {
10 double d;
11 bar1(out1, &d);
12 *out2 = d;
13 }