2017-11-07 20 views
0

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から

答えて

1

引用:

協同組合グループは、CUDA 9.0以降が必要です。協調 グループを使用するために、ヘッダファイルを含む:

#include <cooperative_groups.h> 

を協調グループの名前空間を使用する:

そして任意 イントラブロック協調グループ機能を含むコードが 正常にコンパイルすることができる
using namespace cooperative_groups; 

nvccを使用しています。

名前空間は、あなたが欠けているものです。

+0

ご協力いただきありがとうございます。私は名前空間の概念で新しいです、私はいくつかのものを読んでいますが、私はここにそれを適用する方法を知らない、あなたは私を助けることができますか? –

+0

@IgnacioRey http://en.cppreference.com/w/cpp/language/namespace – Aram

+1

CGの使用方法を示すサンプルコードがあります。あなたは、縮小CGの例のようなものの一つを勉強したいかもしれません。また、あなたが望む協調グリッドシンク(今日のブロック間の同期は協調グリッドでしか達成できません)では、別の起動構文が必要です。 '<<<...> >>構文を使用することはできません。これはプログラミングガイドの該当するセクションでカバーされており、完全に機能している例は前述のCG削減の例/サンプルコードで与えられています。 –

関連する問題