次の 2 つの関数テンプレートを検討してください。
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
まったく同じですか?- 一方を他方よりも使用することには、何らかの利点がありますか? (たとえば、最初の形式は内部でヒープ割り当てを行うか、何か...)
- 2 番目の関数で転送参照を使用することをお勧めしますか? 両方の機能?