了解 C++ 函数指针在 HIP 中按引用传递

jer*_*yin 0 c++ templates function-pointers hip

HIP是与NVIDIA的CUDA对应的AMD GPU编程模型。我有一个来自 HIP 源代码的代码片段,我无法完全理解。提醒一下,理解以下代码snippnet不需要任何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)...);
}
Run Code Online (Sandbox Code Playgroud)

我对以下内容感到困惑:

  • 如果 F 是一个函数指针,为什么它需要在参数中被双重引用?
  • 第一个模板参数typename... Args有什么用?
  • hipLaunchParm只是integer的别名,但是在参数中调用时{}是什么意思呢?

eer*_*ika 5

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

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

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

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

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

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

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