2016-10-15 18 views
1

私は、独自のカーネルとして価値があり、独立して動作するいくつかのコードを持っています。一方、大きなアルゴリズムでは、最初のものをフェーズとして使用する別のコードがあります。したがって、私は両方とも、単純なデビジョンとしてカーネルを起動しても、両方とも最初の関数を呼び出すことを望んでいます。__global__関数内から__global__関数を呼び出す代わりに?

__global__関数を別の__global__関数から呼び出すことはできません。関数を__global____device__とマークすることは許されていません(これは本当に悪いことですが、これが可能であると予想していました)。だからどのようにあなたはその関数呼び出しを行うことができますか?

+0

@talonmies:完了。 – einpoklum

+2

前提が正しくないため、実行されていません。 CC 3.5(Kepler)から始まる '__global__'から' __global__'を呼び出すことができます。再帰的に;)。この機能は[動的並列処理](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cuda-dynamic-parallelism)と呼ばれています – Drop

+0

@Drop:しかし、私はサブグリッドの立ち上げ、通常の関数呼び出しです。 – einpoklum

答えて

2

私の回避策は次のとおりです。動作しますが、ダミーのラッパーを持っており、あなたがする時々退屈な関数ヘッダを、複製する必要があるので、私はすべてのことずっとこのアプローチを好まない

namespace detail { 
    __device__ void foo(int) { /* ... */ } 
} // namespace detail 

__global__ void foo(int x) { detail::foo(x); } 
__global__ void bar(int x) { detail::foo(baz(x)); } 

関連する問題