[過去ログ]
(情報科学)技術的特異点と科学技術等 2 (ナノテク)©2ch.net (319レス)
(情報科学)技術的特異点と科学技術等 2 (ナノテク)©2ch.net http://rio2016.5ch.net/test/read.cgi/future/1489922543/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
232: >>229-231 [NGワード誤検出回避分割sage] 2018/07/30(月) 06:33:48 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Prefecture City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) City (16PE) L3 I-Cache (128KB) L3 D-Cache (2MB) http://rio2016.5ch.net/test/read.cgi/future/1489922543/232
233: >>229 [NGワード誤検出回避分割sage] 2018/07/30(月) 06:45:42 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif DDR4-I/F 64 bit 2400MHz DDR4-I/F 64 bit 2400MHz http://rio2016.5ch.net/test/read.cgi/future/1489922543/233
234: >>230 [NGワード誤検出回避分割sage] 2018/07/30(月) 06:46:14 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif DDR4-I/F 64 bit 2400MHz DDR4-I/F 64 bit 2400MHz http://rio2016.5ch.net/test/read.cgi/future/1489922543/234
235: >>231 [NGワード誤検出回避分割sage] 2018/07/30(月) 06:47:10 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif DDR4-I/F 64 bit 2400MHz DDR4-I/F 64 bit 2400MHz http://rio2016.5ch.net/test/read.cgi/future/1489922543/235
236: >>232 [NGワード誤検出回避分割sage] 2018/07/30(月) 06:47:55 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif DDR4-I/F 64 bit 2400MHz DDR4-I/F 64 bit 2400MHz http://rio2016.5ch.net/test/read.cgi/future/1489922543/236
237: >>229-236 [sage] 2018/07/30(月) 06:51:12 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif ARM926 Host I/F & Inter Processor I/F Host I/F PCI Express Gen3 x8 Host I/F PCI Express Gen3 x8 Host I/F PCI Express Gen3 x8 Host I/F PCI Express Gen3 x8 UART SPI BUS GPIO http://rio2016.5ch.net/test/read.cgi/future/1489922543/237
238: >>229-237 [sage] 2018/07/30(月) 06:54:34 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 15 階層構造と同期メカニズム ? スレッドを階層管理 ? 同期レベル(バリア同期) ? Level 0 :スレッドレベル、 PE内の0-3スレッド、または4-7スレッド ? Level 1 : PEレベル、PE内の8スレッド ? Level 2 : Villageレベル、4つのPEとL1キャッシュ ? Level 3 : Cityレベル、16のPEとL1/L2キャッシュまで ? Level 4 : Prefectureレベル、256のPEとL1/L2/L3キャッシュまで ? Level 5 : PEZY-SCレベル、1024のPEとL1/L2/L3キャッシュまで Sync Level 0 Thread 0-3 Thread 4-7 1 PE PE PE PE L1 Cache 2 Village Village Village Village L2 Cache 3 City L3 Cache 4 Prefecture 5 PEZYSC Core http://rio2016.5ch.net/test/read.cgi/future/1489922543/238
239: >>238 [sage] 2018/07/30(月) 06:55:38 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 16 オンチップキャッシュ level Size(B) Chip Total(B) Way Entry Line 長(B) 接続 データキャッシュ L1 2K 1M 8 4 64 2PEに1つ L2 64k 4M 8 32 256 Ciry毎 L1 8 個に対して L3 2M 8M 8 256 1k Prefecture毎 L2 16 個に対して 命令キャッシュ L1 2K 2M 8 2 128 PE毎 L2 32K 2M 4 32 256 City毎 PE 16個 L3 128K 512K 4 32 1K Prefecture毎 L2 16 個 複数PE間のメモリコンシステンシはソフトウェア責任、 PE毎に16KBのローカルメモリを備える Page 17 プログラミング概要 http://rio2016.5ch.net/test/read.cgi/future/1489922543/239
240: >>239 [sage] 2018/07/30(月) 06:56:30 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 18 プログラミング対象 Xeon PEZY-SC PEZY-SC PEZY-SC PEZY-SC <演算リソース> ・1024個の演算コア(PE) ・1PEあたり8個のスレッド <メモリ> ・32GBのデバイスメモリ ・1PEあたり16KBのローカルメモリ http://rio2016.5ch.net/test/read.cgi/future/1489922543/240
241: >>240 [sage] 2018/07/30(月) 06:57:53 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 19 作成するプログラム ? 2種類のプログラムを作成する必要がある ? CPU上のプログラム(C++で記述) ? PEZY-SC上のカーネルプログラム(PZCLで記述) ※PZCL=カーネルプログラムを記述するPEZY独自仕様の言語 コンパイラはllvmを用いている。 main関数呼び出し CPU プログラム 起動 終了 カーネルプログラム1 起動 終了 カーネルプログラム2 上図のようにCPUプログラムからカーネルプログラムを起動する http://rio2016.5ch.net/test/read.cgi/future/1489922543/241
242: >>241 [sage] 2018/07/30(月) 06:58:54 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 20 特殊な関数 ? カーネルプログラムで利用可能な、PEZY-SC制御に必要な組み込み関数がある。 ? sync_L1 (L1キャッシュにアクセスする単位でのスレッド同期) ? sync_L2 (L2キャッシュにアクセスする単位でのスレッド同期) ? sync_L3 (L3キャッシュにアクセスする単位でのスレッド同期) ? sync (sync_L3と同等) ? flush_L1 (L1キャッシュのフラッシュ) ? flush_L2 (L2キャッシュのフラッシュ) ? flush_L3 (L3キャッシュのフラッシュ) ? flush (flush_L3と同等) ? get_pid (PE ID取得) ? get_tid (PE内スレッドID取得) ? chgthread (PE内スレッドの表裏切り替え) http://rio2016.5ch.net/test/read.cgi/future/1489922543/242
243: >>242 [sage] 2018/07/30(月) 06:59:40 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 21 カーネルプログラムの構造 ? 基本的な構造 void pzc_foo(…) { ? PE ID取得(get_pid) ? PE内スレッドID取得(get_tid) ? 自スレッドに割り当てられた処理の実行 ? 出力バッファフラッシュ(flush) } Page 22 pzcAddサンプル ? カーネルは起動するとユニークな tid,pid を持って、 CPUから指定されたスレッド分実行される。 tid=0,pid=0 void pzc_Add(float* a, float* b, float* c, int count) { int tid = get_tid(); int pid = get_pid(); int index = pid * get_maxtid() + tid; if(index >= count) return; c[index] = a[index] + b[index]; flush(); // cache flush } http://rio2016.5ch.net/test/read.cgi/future/1489922543/243
244: >>243 [sage] 2018/07/30(月) 07:00:23 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif tid=1,pid=0 void pzc_Add(float* a, float* b, float* c, int count) { int tid = get_tid(); int pid = get_pid(); int index = pid * get_maxtid() + tid; if(index >= count) return; c[index] = a[index] + b[index]; flush(); // cache flush } … tid=7,pid=N void pzc_Add(float* a, float* b, float* c, int count) { int tid = get_tid(); int pid = get_pid(); int index = pid * get_maxtid() + tid; if(index >= count) return; c[index] = a[index] + b[index]; flush(); // cache flush } ? 1つのPEには8スレッドが存在する ? スレッド数を128で起動した場合、128/8=16個のPEが実行される ? 8192を超えるスレッド数で起動する場合、CPUから複数回に分けて起動される http://rio2016.5ch.net/test/read.cgi/future/1489922543/244
245: >>244 [sage] 2018/07/30(月) 07:01:00 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 23 簡単な最適化の説明 ? 前述のpzcAddサンプルを用いて、PEZY-SC内での簡単な最適化の説明を行う ? ここでは以下のような最適化を行っている ? カーネル呼び出しのオーバヘッドの削減 ? chgthreadを用いたレイテンシーの隠蔽 ? 同期を用いたキャッシュアクセスの効率化 Page 24 オーバヘッド削減(1/2) ? 以下のコードをスレッド数=要素数として起動する場合、 8192を超えるサイズを処理しようとした場合にカーネルが複数回起動されるため、カーネル呼び出しのオーバヘッドが増加する void pzc_Add(float* a, float* b, float* c, int count) { int tid = get_tid(); // thread ID (0 - 7) int pid = get_pid(); // PE ID int index = pid * get_maxtid() + tid; if(index >= count) return; c[index] = a[index] + b[index]; flush(); // cache flush } http://rio2016.5ch.net/test/read.cgi/future/1489922543/245
246: >>245 [sage] 2018/07/30(月) 07:03:04 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 25 オーバヘッド削減(2/2) ? 以下のようにカーネルコードを修正し、CPUからの呼び出し時のスレッド数を固定にしても、 1回のカーネル呼び出しで全要素の処理を行えることとなる。 ? これによってオーバヘッドを減らすことができる。 void pzc_Add(float* a, float* b, float* c, int count) { int tid = get_tid(); // thread ID (0 - 7) int pid = get_pid(); // PE ID int offset = pid * get_maxtid() + tid; int step = get_maxtid() * get_maxpid(); for(int pos = offset; pos < count; pos += step) { c[pos] = a[pos] + b[pos]; } flush(); } http://rio2016.5ch.net/test/read.cgi/future/1489922543/246
247: >>246 [sage] 2018/07/30(月) 07:03:40 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 26 寄り道:CPUエミュレート ? このようにカーネルの中でループさせることは別のメリットもある。 ? CPUで1スレッドでの動作として、この関数を同じように動作させることができる →ソースを共有したデバッグに有効 void pzc_Add(float* a, float* b, float* c, int count) { int tid = get_tid(); // thread ID (0 - 7) int pid = get_pid(); // PE ID int offset = pid * get_maxtid() + tid; int step = get_maxtid() * get_maxpid(); for(int pos = offset; pos < count; pos += step) { c[pos] = a[pos] + b[pos]; } flush(); } CPUでは get_tid() … 常に0 get_pid() … 常に0 get_maxtid() … 1 get_maxpid() … 1 http://rio2016.5ch.net/test/read.cgi/future/1489922543/247
248: >>247 [sage] 2018/07/30(月) 07:04:41 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 27 スレッドの切り替え (1/3) ? 1つのPEに8スレッド存在するが、一度には4スレッドのみが動作する。 ? 表裏で4スレッドずつ。 ? sync/flushなどの同期やchgthreadを使用しないと、表裏が切り替わらない。 http://rio2016.5ch.net/test/read.cgi/future/1489922543/248
249: >>248 [sage] 2018/07/30(月) 07:05:33 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 28 スレッドの切り替え (2/3) ? 以下の実装では、ループの中にスレッドが切り替わる命令が無いので 現在実行中の各スレッドが flushにたどり着くまで裏スレッドは処理されない。 ? アクセスのアドレスが不連続になり、キャッシュ効率が悪い ? メモリアクセスのレイテンシーを隠蔽できない void pzc_Add(float* a, float* b, float* c, int count) { int tid = get_tid(); // thread ID (0 - 7) int pid = get_pid(); // PE ID int offset = pid * get_maxtid() + tid; int step = get_maxtid() * get_maxpid(); for(int pos = offset; pos < count; pos += step) { c[pos] = a[pos] + b[pos]; } flush(); } memory ↑ request ↓ t0 stall flush t4 http://rio2016.5ch.net/test/read.cgi/future/1489922543/249
250: >>249 [sage] 2018/07/30(月) 07:06:07 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 29 スレッドの切り替え (3/3) ? 以下のようにa, bの読み込み後にchgthreadを入れる事で改善される。 void pzc_Add(float* a, float* b, float* c, int count) { int tid = get_tid(); // thread ID (0 - 7) int pid = get_pid(); // PE ID int offset = pid * get_maxtid() + tid; int step = get_maxtid() * get_maxpid(); for(int pos = offset; pos < count; pos += step) { float a_ = a[pos]; float b_ = b[pos]; chgthread(); c[pos] = a_ + b_; } flush(); } memory ↑ request ↓ t0 stall flush ↓ chgthread t4 http://rio2016.5ch.net/test/read.cgi/future/1489922543/250
251: >>250 [sage] 2018/07/30(月) 07:06:50 ID:wOzVCFyH sssp://img.5ch.net/ico/nida.gif Page 30 メモリアクセスの同期(1/2) ? 以下の実装だと、各スレッドがメモリレイテンシーの状況によって進行度がばらばらになり、 キャッシュアクセスが非効率となる場合がある。 void pzc_Add(float* a, float* b, float* c, int count) { int tid = get_tid(); // thread ID (0 - 7) int pid = get_pid(); // PE ID int offset = pid * get_maxtid() + tid; int step = get_maxtid() * get_maxpid(); for(int pos = offset; pos < count; pos += step) { float a_ = a[pos]; float b_ = b[pos]; chgthread(); c[pos] = a_ + b_; } flush(); } memory request t0 ↑ t1 ↑ … t7 ↑ http://rio2016.5ch.net/test/read.cgi/future/1489922543/251
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 68 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.008s