CUDA 9のリリース以降、異なるスレッドとブロックを同じグループにグループ化して、それらを一緒に管理できるようになりました。私はいくつかのブロックを持つカーネルを起動し、それらのすべてが同期されるまで待つ必要があるので、非常に便利です(スレッドが同期された後、カーネルで作業を続ける必要があるため、cudaThreadSynchronize()は役に立ちません)。CUDAの協力グループ
これらのスレッドのブロックを同じグループに入れ、Nvdiaのメインページの例に示すように、すべてのスレッドが同期するまで待つことを考えました。
__device__ int reduce_sum(thread_group g, int *temp, int val)
{
int lane = g.thread_rank();
// Each iteration halves the number of active threads
// Each thread adds its partial sum[i] to sum[lane+i]
for (int i = g.size()/2; i > 0; i /= 2)
{
temp[lane] = val;
g.sync(); // wait for all threads to store
if(lane<i) val += temp[lane + i];
g.sync(); // wait for all threads to load
}
私の問題は、どのようにグラムグループにグループこれらのブロックを、以下のとおりです。
彼らは、このような何かを行います。 これは私が最初に私のカーネルを立ち上げ方法です:
asap << <5, 1000 >> > (cuda_E2, cuda_A2, cuda_temp, Nb, *binM, Nspb);
私は thread_groupコンパイラを使用しようとするときはいつでも、それがundefiedされていることを述べています。私はcooperative_groups.hヘッダーを使用しています。
誰もこれに対処する方法を知っていますか?前もって感謝します。 documentationから
ご協力いただきありがとうございます。私は名前空間の概念で新しいです、私はいくつかのものを読んでいますが、私はここにそれを適用する方法を知らない、あなたは私を助けることができますか? –
@IgnacioRey http://en.cppreference.com/w/cpp/language/namespace – Aram
CGの使用方法を示すサンプルコードがあります。あなたは、縮小CGの例のようなものの一つを勉強したいかもしれません。また、あなたが望む協調グリッドシンク(今日のブロック間の同期は協調グリッドでしか達成できません)では、別の起動構文が必要です。 '<<<...> >>構文を使用することはできません。これはプログラミングガイドの該当するセクションでカバーされており、完全に機能している例は前述のCG削減の例/サンプルコードで与えられています。 –