0

HIP是与 NVIDIA 的 CUDA 对应的 AMD GPU 编程模型。我有一个我无法完全理解的 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 只是整数的别名,但在参数中调用时 {} 是什么意思呢?
4

1 回答 1

5

如果 F 是一个函数指针,为什么它需要在参数中被双重引用?

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

†</sup> 就 C++ 而言。我不知道 HIP / CUDA 可能有的限制。

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

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

hipLaunchParm 只是整数的别名,但在参数中调用时 {} 是什么意思呢?

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

于 2019-01-11T17:56:42.383 回答