DPCT1088

メッセージ

マクロ定義には、統一できなかったフリークエリー関数の次元の複数の移行結果があります。コードを変更する必要があります。

説明

インテル® DPC++ 互換性ツールは、コードを正しく移行できませんでした。手動でコードを変更する必要があります。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// original code:

#define TB(x) cg::thread_block x = cg::this_thread_block()

__global__ void kernel1() {
  int id = threadIdx.x;
  TB(a);
}
__global__ void kernel3() {
  int id = threadIdx.z;
  TB(b);
}

このコードを --assume-nd-range-dim=1 オプションと --use-experimental-features=free-function-queries オプションで移行すると、以下の DPC++ コードに移行されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#define TB(x) auto x = sycl::this_group< Placeholder /* Fix the dimension manually */>()
// It should be this_group<1>() when used in kernel1 and this_group<3>() when used in kernel3

void kernel1() {
  int id = sycl::this_nd_item<1>().get_local_id(0);
  TB(a);
}
void kernel3() {
  int id = sycl::this_nd_item<3>().get_local_id(0);
  TB(b);
}

このコードを以下のように手動で調整します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// fixed DPC++ code:

#define TB(x, dimensions) auto x = sycl::this_group< dimensions >()

void kernel1() {
  int id = sycl::this_nd_item<1>().get_local_id(0);
  TB(a, 1);
}
void kernel3() {
  int id = sycl::this_nd_item<3>().get_local_id(0);
  TB(b, 3);
}

修正方法の提案

このコードを手動で書き換えてください。