GPU で変数 (たとえば、N 個の要素を持つ配列 alpha cudaMalloc((void**)&alpha, N * sizeof(double))) を宣言し、メモリを解放せずにその値をグローバル関数に割り当てると、この変数は他の連続するグローバル関数で使用できるはずですよね?
cudaMalloc()
グローバル関数 (カーネル) から呼び出すことはできません。ホスト機能です。malloc()
とnew
をカーネルで使用できますが、非効率的です。
複数のカーネルで同じ配列を使用できます。たとえば、異なるカーネルで複数の計算ステップを実行できます。
さらに、GPU でスカラー変数を計算し、それを GPU の複数のグローバル関数間で共有することは可能ですか (または推奨されますか)、それとも CPU からの引数として毎回渡す方がよいでしょうか?
定数を引数としてカーネルに渡すと、すべてのスレッド間で非常に効率的に共有されます。そのため、通常、CPU でパラメーターを計算してカーネルに渡す方がはるかに効率的です。
スカラーの作成に多くの並列計算が必要な場合は、別のカーネルで計算し、それをホストに戻してから、次のカーネルに引数として渡すのが最善です。代替手段は、コードの複雑さを増すだけで、パフォーマンス上の利点はありません。
スカラーに必要な計算がほとんどない場合、カーネルで計算しても意味がありません。また、カーネルでブロックが起動される順序について保証がないことを覚えておいてください。そのため、カーネルで別のコード パスを作成してスカラーを設定し、コストのかかるスレッド インデックスのテストと同期を行って、スカラーにして、すべてのスレッドで利用できるようにします。