我可以知道OpenCL的函数调用堆栈大小吗?
我在Ubuntu中使用NVIDIA OpenCL1.2。 (NVIDIA CC = 5.2) 我在测试代码中发现了一些意想不到的结果。
当某个函数调用64次时,下一个调用的函数似乎无法访问参数。
在我的想法中,调用堆栈溢出使得这个问题。
以下是我的示例代码和结果:
void testfunc(int count, int run)
{
if(run==0) return;
count++;
printf("count=%d run=%d\n", count, run);
run = run - 1;
testfunc(count, run);
}
__kernel void hello(__global int * in_img, __global int * out_img)
{
int run;
int count=0;
run = 70;
testfunc(count, run);
}
这就是结果:
count=1 run=70
count=2 run=69
count=3 run=68
count=4 run=67
count=5 run=66
count=6 run=65
count=7 run=64
.....
count=59 run=12
count=60 run=11
count=61 run=10
count=62 run=9
count=63 run=8
count=64 run=7
count=0 run=0 // <--- Why count and run values are ZERO?
count=0 run=0
count=0 run=0
count=0 run=0
count=0 run=0
count=0 run=0
答案 0 :(得分:6)
OpenCL 1.x中不支持递归。来自AMD的OpenCL简介:
OpenCL C语言的主要限制是:
- 不支持函数指针。
- 不支持位字段。
- 不支持可变长度数组。
- 不支持递归。
- 没有C99标准头文件,例如ctypes.h,errno.h,stdlib.h等。可以包括在内。
AFAIK并非所有实现都具有类似于调用堆栈的功能。在这些情况下,并且可能在您的情况下,任何函数调用都在调用范围内联。