DPCT1080#

メッセージ#

可変個引数関数は、SYCL* カーネルやカーネルから呼び出される関数では呼び出すことはできません。コードを調整する必要があります。

詳細な説明#

SYCL*デバイス関数では、可変個引数関数を呼び出すことはできません。

修正方法の提案#

非可変個引数関数を使用して手動でコードを書き換えます。

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

1  __device__ int add(int arg_num,...){ 
2   va_list args; 
3   va_start(args, arg_num); 
4   int sum = 0; 
5   for (int i = 0; i < arg_num; i++) { 
6   sum += va_arg(args, int);; 
7   } 
8   va_end(args); 
9   return sum; 
10 }; 
11 
12 __global__ void kernel(int *p) { 
13  int x = add(2, 123, 456); 
14  int y = add(3, 123, 456, 789); 
15 }

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

1  /* 
2  DPCT1080:0: Variadic functions cannot be called in a SYCL kernel or by functions 
3  called by the kernel. You may need to adjust the code. 
4  */ 
5  int add(int arg_num, ...) { 
6   va_list args; 
7   va_start(args, arg_num); 
8   int sum = 0; 
9   for (int i = 0; i < arg_num; i++) { 
10  sum += va_arg(args, int);; 
11  } 
12  va_end(args); 
13  return sum; 
14 }; 
15 
16 void kernel(int *p) { 
17  int x = add(2, 123, 456); 
18  int y = add(3, 123, 456, 789); 
19 }

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

1  int add(int a0, int a1) { 
2   return a0 + a1; 
3  }; 
4 
5  int add(int a0, int a1, int a2) { 
6   return a0 + a1 + a2; 
7  }; 
8 
9  void kernel(int *p) { 
10  int x = add(123, 456); 
11  int y = add(123, 456, 789); 
12 }