通知
すべてクリア

syncとflushの仕様について


遠藤克浩
(@katsuhiro-endo)
New Member
結合: 7年前
投稿: 4
Topic starter  

牧野チームインターン(慶應)の遠藤です.

お世話になっております。

各階層でリダクションをとるコードを検証しております.

flushした時に同期が入ると思いますが,各flush_L1,flush_L2,flush_L3の時に,どの階層で同期が起こりますでしょうか?

また,Prefecture単位などで同期を取りたい場合に使える命令はありますでしょうか?

宜しくお願いします.


引用
ishikawa
(@ishikawa)
Eminent Member Admin
結合: 9年前
投稿: 21
 

お世話になります。
気が付かず返答が遅くなってしまい申し訳ございません。

syncおよびflushのレベルは以下の通りです。L3は現在は存在しないですね。

sync_L1()/flush_L1() --> village
sync_L2()/flush_L2() --> city
sync()/flush() --> state(全体)

組み込み関数ではプリフェクチャレベルでの同期は存在しませんが、アセンブラで記述することで可能です。
これはSC2では以下のようになります。(アーキテクチャによりこの数字が異なります)

__asm__ __volatile__("c.sync 0") --> PE内の(現在活きている)4スレッド
__asm__ __volatile__("c.sync 1") --> PE内の8スレッド
__asm__ __volatile__("c.sync 2") --> village(L1 Cache)
__asm__ __volatile__("c.sync 3") --> City(L2 Cache)
__asm__ __volatile__("c.sync 4") --> Prefecture
__asm__ __volatile__("c.sync 5") --> State(全体)
__asm__ __volatile__("c.sync 6") --> Atomic Cache
__asm__ __volatile__("c.sync 7") --> LLC Cache
__asm__ __volatile__("c.sync 8") --> State

もしもflushを行う場合は、このc.syncの代わりにc.wflushを記述して頂ければと思います。


返信引用