DPCT1070#

メッセージ#

<pointer variable name>dpct::dpct_malloc で割り当てられます。ホストコードからポインターにアクセスするには、dpct::get_host_ptr<type>(pointer variable name) を使用します。

詳細な説明#

このポインターが参照するメモリーは、dpct::dpct_malloc によって割り当てられており、ホストコードから直接アクセスできません。dpct::get_host_ptr 関数を使用してポインターを変換することで、ホストコードからメモリーにアクセスできます。

修正方法の提案#

  1. --usm-level=none を指定せずにコードを再度移行します。

  2. または、コードを確認して手動で調整してください。

例えば、以下のオリジナル CUDA* コードについて考えてみます。

1  void bar(float *a) { 
2   a[0] = 1; 
3  } 
4 
5  void foo() { 
6   float* a; 
7   cudaMallocManaged(&a, 10 * sizeof(float)); 
8   bar(a); 
9  }

このコードは、以下の SYCL* コードに移行されます。

1  #define DPCT_USM_LEVEL_NONE 
2  #include <sycl/sycl.hpp> 
3  #include <dpct/dpct.hpp> 
4  void bar(float *a) { 
5   a[0] = 1; 
6  } 
7 
8  void foo() { 
9   float* a; 
10  /* 
11  DPCT1070:0: 'a' is allocated by dpct::dpct_malloc.Use 
12  dpct::get_host_ptr<float>(a) to access the pointer from the host code.
13  */ 
14  a = (float *)dpct::dpct_malloc(10 * sizeof(float)); 
15  bar(a); 
16 }

このコードは次のように書き換えられます。

1  #define DPCT_USM_LEVEL_NONE 
2  #include <sycl/sycl.hpp> 
3  #include <dpct/dpct.hpp> 
4  void bar(float *a) { 
5   dpct::get_host_ptr<float>(a  )[0] = 1; 
6  } 
7 
8  void foo() { 
9   float* a; 
10  a = (float *)dpct::dpct_malloc(10 * sizeof(float)); 
11  bar(a); 
12 }