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)...);
}
我对以下内容感到困惑:
typename... Args
有用吗?答案 0 :(得分:4)
如果F是函数指针,为什么需要在参数中对其进行两次引用?
F不一定是函数指针。那只是默认类型。只要可以使用给定参数调用任何†调用,就可以传递该调用,并且您希望避免在不需要时复制有状态函数对象。有些甚至可能无法复制。这可能就是他们在此处使用参考的原因。
就C ++而言,†。我不知道HIP / CUDA可能会有的限制。
第一个模板参数
typename... Args
有用吗?
它允许将可变数量的参数传递给委托函数。
hipLaunchParm只是整数的别名,但是在参数中调用{}的含义是什么?
T{}
是用于临时值初始化的语法。对于整数,这意味着将零作为参数传递。