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* コードについて考えてみます。


1void bar(float *a) { 
2 a[0] = 1; 
3} 
4 
5void 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> 
4void bar(float *a) { 
5 a[0] = 1; 
6} 
7 
8void 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> 
4void bar(float *a) { 
5 dpct::get_host_ptr<float>(a)[0] = 1; 
6} 
7 
8void foo() { 
9 float* a; 
10 a = (float *)dpct::dpct_malloc(10 * sizeof(float)); 
11 bar(a); 
12}