2016-10-03 7 views
0

いつもCUDA並列ブロックは毎回最初から最後まで実行されますか?私は意味:CUDAスレッドは起動時と同じ順序で実行されます

私は3つのスレッドを持っている場合は、私はいつもこれを取得:最初のスレッドが終了•

。 ?2番目のスレッドが終了します。 •3番目のスレッドが終了しました。

これが正常な動作の原因かどうかは疑問ですが、私はCUDAの新機能です。私は、Open MP、C++ Threads、またはJava Threadsは通常毎回異なる結果を出すことを知っています。しかし、CUDAではいつも同じ注文があります。それは可能ですか?それとも、何かがうまくいかないということですか?

答えて

1

この動作のCUDAによる保証はありません。

32個のスレッドがwarpにグループ化されているため、典型的または反復可能な動作が見られるかもしれませんが、300万のスレッドを起動すると、実行ごとにさまざまな順序が観察されます。これらのスレッドが同じ経糸にある場合

+0

私は実際には10個のスレッドを持っており、約100回実行して常に同じ結果を得ています。 1から10までです。すべてがうまくいくと、これはまだ起こる可能性がありますか? :) – user3111627

+0

はい。 Warpはロックステップで実行される32個のスレッドのグループです(私の答えで提供されたドキュメントへのワープリンクを読むことができます)。したがって、彼らの行動はより予測可能である可能性が高い。 64スレッドを起動しても、多少の差異は見えないかもしれません。しかし、3百万のスレッドを起動すると、動作の違いが表示されます。 –

0

は、それらが順序は、それらのスレッドが異なる縦糸に同じである場合は0から31

に非常に可能性があるハードウェアによって決定され、ロックステップで実行されますワープスケジューラによって決定された順序は予測できません。

これらのスレッドが異なるスレッドブロックにある場合、ブロックスケジューラによって決定される順序は予測できません。

+0

スレッドが同じワープにあるかどうかを何とか確認することはできますか?私はそれをテストし、それらが0である同じブロックにあることを保証することができます。スレッドを異なるブロックで実行することが可能かどうか、ランダム化された順序を得ることができるのだろうか? – user3111627

+0

@ user3111627あなたの最初の質問では、(スレッドID%32)を満たすスレッドは同じワープにあります。 2番目の質問では、カーネルを起動するときにブロック番号を1以上にし、各ブロックは1つのスレッドのみで構成します。そうすれば、あなたはランダムな順序を得ることができます。ワープ、ブロック、マルチプロセッサの概念をよく理解しているかどうかを明確にすることができます。 – BugRepairMan

+0

実際には、ワープ/ブロック/ SMの概念を理解する必要があります。あるブロック内のスレッドは、ロックステップで実行される32スレッド(これまでは32ビットであり、将来変更される可能性があります)の「ワープ」にグループ化されます。つまり、すべて命令0、次に1、次に2などです。あなたは本当に他の保証はありません。特に、私はブロック内にワープの順序が保証されているとは思わない。 – leo

関連する問題