1

次の 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++] = &param;},
        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 番目の関数で転送参照を使用することをお勧めしますか? 両方の機能?
4

2 に答える 2