2015-10-20 92 views
2

我可以知道OpenCL的函数调用堆栈大小吗?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); 
} 

这是结果:OpenCL中的1.x中不支持

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 

回答

6

递归从AMD的介绍OpenCL的:

中的OpenCL C语言的主要限制是:

  • 函数指针不被支持。
  • 不支持位字段。
  • 不支持变长数组。
  • 不支持递归。
  • 没有C99标准头文件,如ctypes.h,errno.h,stdlib.h等。可以包括在内。

据我所知并非所有的实现都调用堆栈类似功能的。在这些情况下,并且可能在您的情况下,在调用作用域中内联任何函数调用。

+0

Hello Aderstedt。谢谢你的回答。那么,在OpenCL中没有任何调用堆栈吗? AFAIK,OpenCL的函数调用使用内联函数,并且所有上下文更改仅使用寄存器。如果它是正确的,调用堆栈不能在OpenCL中存在。 我说的是对的吗? – soongk

+0

是的。有些平台(如CPU)可能会在内部使用调用堆栈,但您不能依靠深度堆栈。 – Aderstedt

+0

谢谢Aderstedt。你的帮助对我来说是如此翔实。 – soongk