DPCT1088#

Message#

The macro definition has multiple migration results in the dimension of free queries function that could not be unified. You may need to modify the code.

Detailed Help#

SYCLomatic was unable to migrate the code correctly. You need to modify the code manually.

For example, this original CUDA* code:

 1  namespace cg = cooperative_groups;
 2
 3  #define TB(b) cg::thread_block b = cg::this_thread_block();
 4
 5  __global__ void test1() {
 6    TB(b);
 7  }
 8
 9  __global__ void test2() {
10    TB(b);
11  }
12
13  void foo() {
14    test1<<<dim3(2, 2, 2), dim3(2, 2, 2)>>>();
15    test2<<<2, 2>>>();
16  }

migrated with options --assume-nd-range-dim=1 and --use-experimental-features=free-function-queries, results in the following migrated SYCL code:

 1  /*
 2  DPCT1088:0: The macro definition has multiple migration results in the dimension
 3  of free queries function that could not be unified. You may need to modify the
 4  code.
 5  */
 6  #define TB(b)                                                                  \
 7    auto b = sycl::ext::oneapi::this_work_item::get_work_group<                        \
 8        dpct_placeholder /* Fix the dimension manually */>();
 9
10  void test1() {
11    TB(b);
12  }
13
14  void test2() {
15    TB(b);
16  }
17
18  void foo() {
19    sycl::device dev_ct1;
20    sycl::queue q_ct1(dev_ct1,
21                      sycl::property_list{sycl::property::queue::in_order()});
22    q_ct1.parallel_for(
23        sycl::nd_range<3>(sycl::range<3>(2, 2, 2) * sycl::range<3>(2, 2, 2),
24                          sycl::range<3>(2, 2, 2)),
25        [=](sycl::nd_item<3> item_ct1) {
26          test1();
27        });
28    q_ct1.parallel_for(sycl::nd_range<1>(sycl::range<1>(2) * sycl::range<1>(2),
29                                         sycl::range<1>(2)),
30                       [=](sycl::nd_item<1> item_ct1) {
31                         test2();
32                       });
33  }

which is manually adjusted to:

 1  #define TB(b, d)                                                                  \
 2    auto b = sycl::ext::oneapi::this_work_item::get_work_group<d>();
 3
 4  void test1() {
 5    TB(b, 3);
 6  }
 7
 8  void test2() {
 9    TB(b, 1);
10  }
11
12  void foo() {
13    sycl::device dev_ct1;
14    sycl::queue q_ct1(dev_ct1,
15                      sycl::property_list{sycl::property::queue::in_order()});
16    q_ct1.parallel_for(
17        sycl::nd_range<3>(sycl::range<3>(2, 2, 2) * sycl::range<3>(2, 2, 2),
18                          sycl::range<3>(2, 2, 2)),
19        [=](sycl::nd_item<3> item_ct1) {
20          test1();
21        });
22    q_ct1.parallel_for(sycl::nd_range<1>(sycl::range<1>(2) * sycl::range<1>(2),
23                                         sycl::range<1>(2)),
24                       [=](sycl::nd_item<1> item_ct1) {
25                         test2();
26                       });
27  }

Suggestions to Fix#

Rewrite the code manually.