考虑以下两个函数模板:
template <typename... Params>
void foo(Params... params)
{
/* etc etc */
my_kernel<<<grid_dims, block_dims, shmem_size, stream_id>>>(params...);
}
和:
template <typename... Params>
void bar(Params... params)
{
/* etc etc */
void* arguments_ptrs[sizeof...(Params)];
auto arg_index = 0;
for_each_argument(
[&](auto param) {arguments_ptrs[arg_index++] = ¶m;},
params...);
cudaLaunchKernel<decltype(my_kernel)>(
&my_kernel, grid_dims, block_dims, argument_ptrs, shmem_size, stream_id);
}
由Sean Parent定义for_each_argument
。
问题:
foo
和的语义是否bar
完全相同?- 使用其中一个有什么好处吗?(例如,也许第一种形式在引擎盖下进行堆分配或其他东西......)
- 在第二个函数中使用转发引用是个好主意吗?两个功能?