Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以在CUDA中调用另一个内核函数中的内核函数?_C++_Cuda - Fatal编程技术网

C++ 是否可以在CUDA中调用另一个内核函数中的内核函数?

C++ 是否可以在CUDA中调用另一个内核函数中的内核函数?,c++,cuda,C++,Cuda,我们是否可以调用另一个\uuuuu global\uuuuu函数中的\uuuu global\uuuu函数,该函数也是CUDA中的内核(\uuuu global\uuu) 例如: __global__ void func() { . . } __global__ void foo() { . . func //this is a "fu

我们是否可以调用另一个
\uuuuu global\uuuuu
函数中的
\uuuu global\uuuu
函数,该函数也是CUDA中的内核(
\uuuu global\uuu

例如:

    __global__ void func()
    {
            .
            .
    }

    __global__ void foo()
    {
            .
            .
            func //this is a "func" function that has defination on the kernel
    }

    int main(void)
    {
            .
            .
            func <<<1, 1 >>>()
            foo <<<1, 1 >>>()
    }
\uuuuu全局\uuuuuu无效函数()
{
.
.
}
__全局无效foo()
{
.
.
func//这是一个在内核上有定义的“func”函数
}
内部主(空)
{
.
.
func()
foo()
}

它是否可以在
\uuu global\uuu
函数中使用推力库中的任何函数?

Compute capability 3.5和更新的硬件支持所调用的功能,这使它们能够通过在GPU上运行内核来启动内核,而无需任何主机API调用

较旧的硬件支持可以从内核调用的函数(这些函数表示为
\uuuuu device\uuuuu
,而不是
\uuuu global\uuuu
),并且只在线程范围内执行,因此不会启动新内核


自从推出推力1.8以来,引入了一种新的推力算法,它允许现有运行内核中的线程调用推力算法,就像
\uuuu设备\uuu
函数一样。通过受支持硬件上的
推力::设备
执行策略,推力还应支持动态并行。

谢谢,全局函数中的推力库如何?@FirstJens:删除推力库的另一种方法是编辑它以(a)使其回答问题和(b)让它包含的内容正确。@FirstJens:我自己做的。如果您不喜欢或认为自己可以做得更好,请随时回滚编辑。@Talonmes非常感谢您。你的回答很有用@您编辑为“推力目前不支持动态并行”的Talonmes;但是声明:“或者,您可以使用推力::设备让算法启动子内核(使用动态并行性)”;哪一个是正确的?是的,您可以使用从另一个
\uuuuu global\uuuu
函数中调用
\uuu global\uuuu
函数。推力函数也可以从
\uuuuu全局\uuuu
函数调用,并且有多种选项,参见和@RobertCrovella您能否澄清以下关于不支持动态并行的推力的答案是否正确?当在cc3.5或更高版本的设备上的嵌套算法案例中指定了
推力::设备
的执行策略时,推力应使用动态并行,如果使用了适当的编译开关。我讨论了这一点,并在前面的评论()的第二个链接中给出了一个工作示例。可以通过
nvprof
确认动态并行的使用。(我现在又这样做了。)如果不需要这种行为,那么在这种情况下可以通过指定
推力::seq
而不是
推力::设备
来明确避免使用动态并行。