DPCT1080
目次
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 }