c++ - 理解 C++ 函数指针在 HIP 中的引用传递
问题描述
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 只是整数的别名,但在参数中调用时 {} 是什么意思呢?
解决方案
如果 F 是一个函数指针,为什么它需要在参数中被双重引用?
F 不一定是函数指针。这只是默认类型。您可以传递任何†</sup> 可调用对象,只要它可以使用给定的参数调用,并且您希望避免在不需要时复制有状态的函数对象。有些甚至可能无法复制。这可能是他们在这里使用参考的原因。
†</sup> 就 C++ 而言。我不知道 HIP / CUDA 可能有的限制。
第一个模板参数
typename... Args
有什么用?
它允许将可变数量的参数传递给委托函数。
hipLaunchParm 只是整数的别名,但在参数中调用时 {} 是什么意思呢?
T{}
是临时值初始化的语法。如果是整数,这意味着零作为参数传递。
推荐阅读
- java - 检查数据库中是否已经存在电子邮件,但如果用户相同则忽略
- php - 值字段未接收 php 变量
- azure-cosmosdb - CosmosDB 上的 Gremlin - 在不删除顶点的情况下删除并重新创建顶点的属性
- elasticsearch - 将 JSON 文件插入 Elasticsearch
- angular5 - webapi的角度5交叉原点问题
- android - 使用 gradle 构建和运行 tensorflow lite demo
- vmware-clarity - 在 AngularJs (Angular 1.x) 应用程序中使用 Clarity 组件的推荐方法是什么。
- ms-access - 错误:您的数据库或项目包含对文件 UTILITY.ACCDA 的缺失或损坏的引用
- java - 如何读取包含两列数字的文件,然后返回每列的平均值?
- android - 为什么使用android改造时没有响应,虽然我可以看到请求?