DPCT1054
目次
DPCT1054#
メッセージ#
<variable name> のタイプは、デバイスの関数内で <type> という名前で宣言されています。アクセサー宣言時に <type> 宣言が参照できるようにコードを調整します。
詳細な説明#
この警告は、__shared__
変数の型がデバイス関数内で宣言されている場合に出力されます。
移行したコードで次のことが行われます。
ツールは、デバイス関数に以下を追加します。
#
uint8_t*
入力パラメーター # タイプへの名前 (名前がない場合) — 例:type_ct1
#uint8_t*
からオリジナルのタイプへのタイプキャスト (オリジナルの型宣言の後)呼び出し側では、ローカルアクセサーを定義する際に、最初のテンプレート引数が
uint8_t[sizeof(<original type, for example "type_ct1">)]
に設定されます。
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1 // header file
2 template <typename T> __global__ void k() {
3 __shared__ union {
4 T t;
5 ...
6 } a;
7 ...
8 }
9
10 // source file
11 void foo() { k<int><<<1, 1>>>(); }
このコードは、以下の SYCL* コードに移行されます。
1 // header file
2 template <typename T> void k(uint8_t *a_ct1) {
3 union type_ct1 {
4 T t;
5 ...
6 };
7 type_ct1 &a = *(type_ct1 *)a_ct1;
8 ...
9 }
10
11 // source file
12 void foo() {
13 dpct::get_default_queue().submit([&](sycl::handler &cgh) {
14 /*
15 DPCT1054:0: The type of variable a is declared in device function with the
16 name type_ct1.Adjust the code to make the type_ct1 declaration visible at
17 the accessor declaration point.
18 */
19 sycl::local_accessor<uint8_t[sizeof(type_ct1)], 0> a_ct1_acc_ct1(cgh);
20
21 cgh.parallel_for(
22 sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)),
23 [=](sycl::nd_item<3> item_ct1) {
24 k<int>(a_ct1_acc_ct1.get_pointer());
25 });
26 });
27 }
このコードは次のように書き換えられます。
1 // header file
2 template <typename T>
3 union type_ct1 {
4 T t;
5 ...
6 };
7 template <typename T> void k(uint8_t *a_ct1) {
8 type_ct1<T> &a = *(type_ct1<T> *)a_ct1;
9 ...
10 }
11
12 // source file
13 void foo() {
14 dpct::get_default_queue().submit([&](sycl::handler &cgh) {
15 sycl::local_accessor<uint8_t[sizeof(type_ct1<T>)], 0> a_ct1_acc_ct1(cgh);
16
17 cgh.parallel_for(
18 sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)),
19 [=](sycl::nd_item<3> item_ct1) {
20 k<int>(a_ct1_acc_ct1.get_pointer());
21 });
22 });
23 }
修正方法の提案#
型宣言をアクセサー宣言位置で見えるように移動するか sizeof(<original type>
をオリジナルのタイプに必要なサイズ (バイト) に置き換えます。