DPCT1081#

メッセージ#

生成されたコードでは、<pointer variable> がグローバル・メモリー・アドレス空間を指していると仮定しています。ローカルまたはプライベート・メモリー・アドレス空間を指す場合、address_space::globaladdress_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 }