了解HIP中通过引用传递的C ++函数指针

时间:2019-01-11 17:33:42

标签: c++ templates function-pointers hip

HIP是与NVIDIA CUDA相对应的AMD GPU编程模型。我有一个code snippet的HIP源代码,我无法完全理解。提醒一下,对以下代码段的理解不需要HIP的任何背景知识,而是C ++模板/函数指针中的更多问题。

typedef int hipLaunchParm;    
template <typename... Args, typename F = void (*)(hipLaunchParm, Args...)>
inline void hipLaunchKernel(F&& kernel, const dim3& numBlocks, const dim3& dimBlocks,
                        std::uint32_t groupMemBytes, hipStream_t stream, Args... args) 
{
    hipLaunchKernelGGL(kernel, numBlocks, dimBlocks, groupMemBytes, stream, 
        hipLaunchParm{}, std::move(args)...);
}

我对以下内容感到困惑:

  • 如果F是函数指针,为什么需要在参数中对其进行两次引用?
  • 第一个模板参数typename... Args有用吗?
  • hipLaunchParm只是整数的别名,但是在参数中调用{}的含义是什么?

1 个答案:

答案 0 :(得分:4)

  

如果F是函数指针,为什么需要在参数中对其进行两次引用?

F不一定是函数指针。那只是默认类型。只要可以使用给定参数调用任何调用,就可以传递该调用,并且您希望避免在不需要时复制有状态函数对象。有些甚至可能无法复制。这可能就是他们在此处使用参考的原因。

就C ++而言,

。我不知道HIP / CUDA可能会有的限制。

  

第一个模板参数typename... Args有用吗?

它允许将可变数量的参数传递给委托函数。

  

hipLaunchParm只是整数的别名,但是在参数中调用{}的含义是什么?

T{}是用于临时值初始化的语法。对于整数,这意味着将零作为参数传递。

相关问题