Microsoft PowerPoint - embedded-multicore-print.ppt [互換モード]

Similar documents
untitled

untitled

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)

untitled

Microsoft Word - openmp-txt.doc

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1

Microsoft PowerPoint - HPCseminar2013-msato.pptx

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並

NUMAの構成

untitled

GNU開発ツール

Microsoft PowerPoint - AICS-SS-msato.pptx

untitled

VXPRO R1400® ご提案資料

01_OpenMP_osx.indd

NUMAの構成

本文ALL.indd

Microsoft PowerPoint - OpenMP入門.pptx

HPC143

untitled

Microsoft PowerPoint ppt [互換モード]

para02-2.dvi

N08

PowerPoint プレゼンテーション

1.overview

Microsoft PowerPoint - KHPCSS pptx

02_C-C++_osx.indd

スライド 1

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

演習1: 演習準備

Microsoft PowerPoint ppt [互換モード]

POSIXスレッド

コードのチューニング

XACCの概要

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments

04-process_thread_2.ppt

スライド 1

XMPによる並列化実装2

スライド 1

スレッド

特集新世代マイクロプロセッサアーキテクチャ ( 後編 ) 3. 実例 3 ユビキタス コンピューティング時代の組み込みマイクロコンピュータ, SuperH と M32R 清水徹 * 1 長谷川淳 * 2 服部俊洋 * 3 近藤弘郁 * 4 ( 株 ) ルネサステクノロジシステムソリューション統括本部

1 M32R Single-Chip Multiprocessor [2] [3] [4] [5] Linux/M32R UP(Uni-processor) SMP(Symmetric Multi-processor) MMU CPU nommu Linux/M32R Linux/M32R 2. M

卒業論文

Microsoft PowerPoint - sales2.ppt

スライド 1

スレッド

Microsoft PowerPoint ppt [互換モード]

PowerPoint プレゼンテーション

Microsoft PowerPoint - 演習1:並列化と評価.pptx

WinHPC ppt

連載講座 : 高生産並列言語を使いこなす (4) ゲーム木探索の並列化 田浦健次朗 東京大学大学院情報理工学系研究科, 情報基盤センター 目次 1 準備 問題の定義 αβ 法 16 2 αβ 法の並列化 概要 Young Brothers Wa

openmp1_Yaguchi_version_170530

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

HPC146

XcalableMP入門

並列計算導入.pptx

Microsoft PowerPoint - 11Web.pptx

Microsoft PowerPoint ppt [互換モード]

10-vm1.ppt

untitled

PowerPoint プレゼンテーション

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト

chap2.ppt

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - 講義:コミュニケータ.pptx

Microsoft PowerPoint - sps14_kogi6.pptx

プログラミング実習I

program7app.ppt

Microsoft PowerPoint - compsys2-06.ppt

HPCマシンの変遷と 今後の情報基盤センターの役割

スパコンに通じる並列プログラミングの基礎

GNU開発ツール

01-introduction.ppt

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

Microsoft PowerPoint - ARCEMB08HayashiSlides.ppt [互換モード]

インテル アーキテクチャプラットフォーム リーダーシップ 2000 年 12 月 21 日 第 14 回数値流体力学シンポジウム インテル株式会社 ia 技術本部本部長坂野勝美

POSIXプログラミング Pthreads編

enshu5_4.key

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

PowerPoint Presentation

23 Fig. 2: hwmodulev2 3. Reconfigurable HPC 3.1 hw/sw hw/sw hw/sw FPGA PC FPGA PC FPGA HPC FPGA FPGA hw/sw hw/sw hw- Module FPGA hwmodule hw/sw FPGA h

TFTP serverの実装

スパコンに通じる並列プログラミングの基礎

Microsoft PowerPoint - CCS学際共同boku-08b.ppt

Microsoft PowerPoint - kougi7.ppt

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

memo

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

~~~~~~~~~~~~~~~~~~ wait Call CPU time 1, latch: library cache 7, latch: library cache lock 4, job scheduler co

gengo1-11

IntelR Compilers Professional Editions

Microsoft Word ●MPI性能検証_志田_ _更新__ doc

Krylov (b) x k+1 := x k + α k p k (c) r k+1 := r k α k Ap k ( := b Ax k+1 ) (d) β k := r k r k 2 2 (e) : r k 2 / r 0 2 < ε R (f) p k+1 :=

Insert your Title here

ex04_2012.ppt

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

スパコンに通じる並列プログラミングの基礎

コードのチューニング

Transcription:

プログラミング環境特論 組み込みシステムでのマルチコアプロセッサのプログラミングと課題 佐藤三久 筑波大学

プロセッサ研究開発の動向 クロックの高速化 製造プロセスの微細化 いまでは 3GHz, 数年のうちに 10GHz か!? インテルの戦略の転換 マルチコア クロックは早くならない!? プロセスは 65nm 45nm, 将来的には 32nm トランジスタ数は増える! アーキテクチャの改良 Good news & bad news! スーパーパイプライン スーパースカラ VLIW キャッシュの多段化 マイクロプロセッサでも L3 キャッシュ マルチスレッド化 Intel Hyperthreading 複数のプログラムを同時に処理 マルチコア :1 つのチップに複数の CPU インテル Pentium プロセッサプログラミングに関係するところエクストリーム エディションのダイ 2

マルチコア プロセッサの分類 共有メモリ 分散メモリ SMP( Symmetric Multi Processor) 同じ種類のコア サーバー用マルチコア MPCore ルネサス M32R ルネサス RP1 (SH3X) 富士通 FR-V(?) AMP( Asymmetric Multi Processor) 異種のコアが混在 ( コミュニケーションのための少量のメモリがついていることがある ) IBM Cell DSP 混載チップ最近では GPU 混載も 3

SMP と AMP SMP(Symmetric Multi Processor) 同じコアを複数配置したもの 普通は 共有メモリ型 汎用 AMD quad-core AMP(Asymmetric Multi Processor) 機能が異なるコアを配置した非対称な型 通常は 分散メモリ型 Cell プロセッサが有名 GPU やDSPもこれに分類 機能が特化されている コストが安い IBM Cell CPU コア DSP 共有メモリ vs. 分散メモリ 各コアからどのようにメイン メモリにアクセスできるかもプログラミングを考える場合に重要な点 4

マルチコアプロセッサの使い方 ( その 1) 複数のプロセス スレッドでの利用 主に 共有メモリ SMP のマルチコアプロセッサ 通常 組み込みシステムはマルチタスク ( プロセス ) のプログラム 特別なプログラミングはいらない ( はず ) シングルコアでのマルチタスクプログラムが マルチコア (SMP) で動かない? シングルコアで優先度が高いタスクの実行中は優先度が低いタスクが動かないことが前提としている場合 マルチコアでは * 本当に * 並列に動いてしまい 優先度が無効になる キチンと同期をとりましょう コア 1 コア 1 コア 2 5

マルチコアプロセッサの使い方 ( その 2) コアごとに異なる機能で使う AMP 型では主な使い方 SMP 型でも 共有メモリを持たない場合にはこのタイプ 従来 複数のチップで構成したものを 1 つに 個々のコアに OS を走らせる (DSP など OS がない場合もあり ) 違う OS の場合も Linux と RTOS SMP で VM 等を使って違う OS を乗せる場合も同じ 通信は Chip 内インタコネクトまたはバス RPC モデルも使える アプリ アプリ アプリ OS OS OS コア コア コア アプリ DSP Chip 間インターコネクト BUS 6

マルチコアプロセッサの使い方 (3) 高性能化のためにつかう ( 最終的にはみんなこれ?!) 複数のコアで並列処理 共有メモリ SMP の場合は OpenMP ハイエンドで使われている技術が使える AMP でも DSP 等を加速機構としてつかっている場合は このケースに当たる コア 1 コア 2 プログラム コア 3 コア 4 コア プログラム DSP 特別処理 コアで分担して実行 7

並列処理による高速化 : アムダールの法則 アムダールの法則 逐次処理での実行時間を T 1, 逐次で実行しなくてはならない部分の比率がαである場合 pプロセッサを用いて実行した時の実行時間 ( の下限 )T pは T p = α*t 1 + (1-α)*T 1/p 逐次部分があるため 高速化には限界があるということ 実行時間 並列部分 1/p 逐次実行 P プロセッサ並列実行 逐次部分 8

並列プログラミング モデル メッセージ通信 (Message Passing) メッセージのやり取りでやり取りをして プログラムする 分散メモリシステム ( 共有メモリでも 可 ) プログラミングが面倒 難しい プログラマがデータの移動を制御 プロセッサ数に対してスケーラブル 共有メモリ (shared memory) 共通にアクセスできるメモリを解して データのやり取り 共有メモリシステム プログラミングしやすいグ ( 逐次プログラムから ) システムがデータの移動を行ってくれる プロセッサ数に対してスケーラブルではないことが多いラブルではないことが多い 9

マルチスレッドプログラミング 共有メモリプログラミングの基礎グの基礎 スレッド : 一連のプログラムの実行を抽象化したもの プロセスとの違い プロセスは スレッド + メモリ空間 ( メモリプロテクション ) POSIX スレッド pthread たくさんのプログラムが同時に実行されている スレッド 10

スレッドの生成 thread_create スレッドの join pthread_join POSIX thread ライブラリ #include <pthread.h> h> void func1( int x ); void func2( int x ); 同期, ロック main() { pthread_t t1 ; pthread_t t2 ; pthread_create( &t1, NULL, main (void *)func1, (void *)1 ); pthread_create( &t2, NULL, pthread_create (void *)func2, (void *)2 ); printf("main() n"); pthread_create pthread_join( t1, NULL ); pthread_join( t2, NULL ); pthread_join pthread_join func1 void func1( int x ) { int i ; for( i = 0 ; i<3 ; i++ ) { printf("func1( %d ): %d n",x, i ); void func2( int x ) { printf("func2( %d ): %d n",x); func2 ( ) { 11

POSIX スレッドによるプログラミング スレッドの生成ループの担当部分の分割 足し合わせの同期 Pthread, Solaris thread for(t=1;t<n _ thd;t++){ r=pthread_create(thd_main,t) thd_main(0); for(t=1; t<n_thd;t++) pthread_join(); スレッド= プログラム実行の流れ ; int s; /* global */ int n_thd; /* number of threads */ int thd_main(int id) { int c,b,e,i,ss; c=1000/n_thd; b=c*id; e=s+c; ss=0; for(i=b; i<e; i++) ss += a[i]; pthread_lock(); s += ss; pthread_unlock(); return s; 12

メッセージ通信プログラミング 分散メモリの一般的なプログラミングパラダイム send と receive でデータ交換をする 通信ライブラリ レイヤ POSIX IPC, socket TIPC (Transparent Interprocess Communication) LINX (on Enea s OSE Operating System) MCAPI (Multicore Communication API) MPI (Message Passing Interface) Send Receive コア 1 コア 3 Chip 内ネットワーク コア 2 コア 4 13

メッセージ通信プログラミング 1000 個のデータの加算の例 int a[250]; /* それぞれ 250 個づづデータを持つ */ main(){ /* それぞれのプロセッサで実行される */ int i,s,ss; s=0; for(i=0; i<250;i++) s+= a[i]; /* 各プロセッサで計算 */ if(myid == 0){ /* プロセッサ0の場合 */ for(proc=1;proc<4; proc++){ recv(&ss,proc); /* 各プロセッサからデータを受け取る */ s+=ss; /* 集計する */ else { /* 0 以外のプロセッサの場合 */ send(s,0); /* プロセッサ0にデータを送る */ 14

MPI によるプログラミング MPI (Message Passing Interface) おもに用途は 高性能科学技術計算 現在 ハイエンドの分散メモリシステムにおける標準的なプログラミングライブラリ 100 ノード以上では必須 面倒だが 性能は出る アセンブラでプログラミングと同じ メッセージをやり取りして通信を行う Send/Receive 集団通信もある Reduce/Bcast Gather/Scatter 組み込みシステムのプログラミングには 牛刀 か!? Send Receive ネットワーク 15

MPI でプログラミングしてみると #include "mpi.h" #include <stdio.h> #define MY_TAG 100 double A[1000/N_PE]; int main( int argc, char *argv[]) { int n, myid, numprocs, i; double sum, x; int namelen; char processor_name[mpi_max_processor_name]; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); _ MPI_Get_processor_name(processor_name,&namelen); fprintf(stderr,"process %d on %s n", myid, processor_name);... 16

MPI でプログラミングしてみると sum = 0.0; for (i = 0; i < 1000/N_PE; i++){ sum+ = A[i]; if(myid == 0){ for(i = 1; i < numprocs; i++){ MPI_ Recv(&t,1,MPI, _ DOUBLE,i,MY, _ TAG,MPI _ COMM_ WORLD,&status sum += t; else MPI_Send(&t,1,MPI_DOUBLE,0,MY_TAG,MPI_COMM_WORLD); /* MPI_Reduce(&sum, &sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_ MPI_Barrier(MPI_COMM_WORLD);... MPI_Finalize(); return 0; 17

MCAPI MCAPI (Multicore Communication API) Multicore Association (www.multicore-association.org, Intel, Freescale, TI, NEC) で制定された通信 API March 31, 2008 時点で V1.063 MRAPI (Resource Management API) ともに用いる MPI よりも簡単 hetero, scalable, fault tolerance(?), general 3 つの基本的な機能 1. Messages connection-less datagrams. 2. Packet channels connection-oriented, uni-directional, FIFO packet streams. 3. Scalar channels connection-oriented i t single word uni-directional, FIFO packet streams. MCAPI s objective is to provide a limited number of calls with sufficient communication functionality while keeping it simple enough to allow efficient implementations. 18

例 19

////////////////////////////////////////// // The TPU task ////////////////////////////////////////// void TPU_Task() Task() { char* smem; size_t msgsize; mcapi_endpoint_t cntrl_endpt, cntrl_remote_endpt; mcapi_sclchan_send_hndl_t send hndl cntrl_chan; chan; mcapi_request_t r1; mcapi_status_t err; // init the system mcapi_initialize(tpu_node, &err); CHECK_STATUS(err); cntrl_endpt = mcapi _ create_ endpoint(tpu _ PORT_ CNTRL, &err); CHECK_STATUS(err); mcapi_get_endpoint_i(cntrl_node, CNTRL_PORT_TPU, &cntrl_ remote_ endpoint, &r1, &err); CHECK_STATUS(err); // wait on the remote endpoint mcapi _ wait(&r1,null,&err);, CHECK_STATUS(err); // now get the shared mem ptr mcapi_msg_recv(cntrl_endpt, &smem, sizeof(smem), &msgsize, &err); CHECK_MEM(sMem); CHECK_STATUS(err); // NOTE connection handled by control task // open the channel mcapi_open_sclchan_send_i(&cntrl_chan, i(& l h cntrl_endpt, &r1, &err); CHECK_STATUS(err); // wait on the open mcapi_wait(&r1,null,&err); &err); CHECK_STATUS(err); // ALL bootstrapping is finished, begin processing while (1) { // do something that updates shared mem smem[0] = 1; // send a scalar flag to cntrl process // indicating smem has been updated mcapi_sclchan_send_uint8(cntrl_chan, (uint8_t) 1,&err); CHECK_STATUS(err); 20

OpenMP とは 共有メモリマルチプロセッサの並列プログラミングのためのプログラミングモデル 言語ではない ベース言語 (Fortran/C/C++) をdirective( 指示文 ) で並列プログラミングできるように拡張 もともとは ( いまでも ) 科学技術計算向け マルチコアプロセッサの普及とともに 共有メモリの性能向上のためのプログラミングモデルとして注目されている OpenMP Architecture Review Board (ARB) が仕様を決定 当初 米国コンパイラ関係の ISV を中心に組織 Oct. 1997 Fortran ver.1.0 API Oct. 1998 C/C++ ver.1.0 API 現在 OpenMP 3.0 http://www.openmp.org/ 21

OpenMP の実行モデル 逐次実行から始まる Fork-joinモデル parallel l region 関数呼び出しも重複実行 fork A A... #pragma omp parallel { foo(); /*..B... */ C. #pragma omp parallel { D E... Call foo() Call foo() Call foo() B join C D E Call foo() 22

Work sharing 構文 Team 内のスレッドで分担して実行する部分を指定 parallel region 内で用いる for 構文 イタレーションを分担して実行 データ並列 sections 構文 各セクションを分担して実行 thread1 thread2 thread3 Duplicated execution タスク並列 single 構文 一つのスレッドのみが実行 directives parallel 構文と組み合わせた記法 parallel for 構文 parallel sections 構文 work-sharing, sync 23

For 構文 For ループのイタレーションを並列実行 指示文の直後の forループは canonical shape でなくてはならない #pragma omp for [clause ] for(var=lb; var logical-op l ub; incr-expr) ) body var は整数型のループ変数 ( 強制的に private) incr-expr ++var,var++,--var,var--,var+=incr,var-=incr,,,, logical-op < <= > >= ループの外の飛び出しはなし breakもなし clause で並列ループのスケジューリング データ属性を指定 24

例 Matvec(double a[],int row_start,int col_idx[], double x[],double y[],int n) { int i,j,start,end; double t; #pragma omp parallel for private(j,t,start,end) for(i=0; i<n;i++){ start=row row_start[i]; end=row_start[i+1]; t = 0.0; for(j=start;j<end;j++) j j t += a[j]*x[col_idx[j]]; y[i]=t; A 疎行列ベクトル積ルーチン a[col_idx[j]] X y a 25

Data scope 属性指定 parallel 構文 work sharing 構文で指示節で指定 shared(var_list) 構文内で指定された変数がスレッド間で共有される private(var_list) 構文内で指定された変数が private firstprivate(var_list) private と同様であるが 直前の値で初期化される lastprivate(var_list) private と同様であるが 構文が終了時に逐次実行された場合の最後の値を反映する reduction(op:var_list) reduction アクセスをすることを指定 スカラ変数のみ 実行中は private 構文終了後に反映 26

バリア同期を行う Barrier 指示文 チーム内のスレッドが同期点に達するまで 待つ それまでのメモリ書き込みも flush する 並列リージョンの終わり work sharing 構文で nowait 指示節が指定されない限り 暗黙的にバリア同期が行われる #pragma omp barrier 27

MPEG2 encoder by OpenMP. MediaBench motion estimation predict dct_type estimation transform putpict calcsnr itransform iquantize /*loop through all macro-blocks of the picture*/ #pragma omp parallel private(i,j,myk) { #pragma omp for for (j=0; j<height2; j+=16) { for (i=0; i<width; i+=16) {... loop body... j i 28

OpenMP のプログラム例 :laplace Laplace 方程式の陽的解法 上下左右の4 点の平均で update していくプログラム Old と new を用意して直前の値をコピー 典型的な領域分割 最後に残差をとる OpenMP 版 lap.c 3つのループを外側で並列化 OpenMP は 1 次元のみ Parallel 指示文と for 指示文を離してつかってみた 29

void lap_solve() { int x,y,k; double sum; #pragma omp parallel private(k,x,y) { for(k = 0; k < NITER; k++){ /* old <- new */ #pragma omp for for(x = 1; x <= XSIZE; x++) for(y = 1; y <= YSIZE; y++) uu[x][y] = u[x][y]; /* update */ #pragma omp for for(x = 1; x <= XSIZE; x++) for(y = 1; y <= YSIZE; y++) u[x][y] = (uu[x-1][y] + uu[x+1][y] + uu[x][y-1] + uu[x][y+1])/4.0; /* check sum */ sum = 0.0; #pragma omp parallel for private(y) reduction(+:sum) for(x = 1; x <= XSIZE; x++) for(y = 1; y <= YSIZE; y++) sum += (uu[x][y]-u[x][y]); printf("sum = %g n",sum); 30

OpenMP3.0 で追加された点 www.openmp.org に富士通訳の日本語バージョンの仕様書がある タスクの概念が追加された Parallel 構文とTask 構文で生成されるスレッドの実体 task 構文 taskwait 構文 メモリモデルの明確化 Flush の扱い ネストされた場合の定義の明確化 Collapse 指示節 スレッドのスタックサイズの指定 C++でのprivate 変数に対するconstructor, destructorの扱い 31

Task 構文の例 struct node { struct node *left; struct t node *right; ; void postorder_traverse( traverse( struct node *p ) { if (p->left) #pragma omp task // p is firstprivate by default postorder_traverse(p traverse(p->left); if (p->right) #pragma omp task // p is firstprivate by default postorder_traverse(p traverse(p->right); #pragma omp taskwait process(p); 32

ルネサステクノロジ ( 旧三菱電機 ) M32R-II コア x 2 M32700 の特徴 7 段パイプライン 32bit 命令 (1 命令同時発行 +16bit 命令 (2 命令同時発行可能 ) 浮動小数点ユニットは持たない gcc 付属の浮動小数点ライブラリ (soft-float) 内蔵 512KB SRAM 今回は未使用 SDRAMコントローラ内蔵 μt-engine M3T-32700UTを使用 128 I Cache 8KB/2way I TLB 32Entries CPU1 CPU0 CPU Core D Cache 8KB/2way D TLB 32Entries Bus Arbiter 512KB Shared SRAM Peripherals ICU Clock Control Timer UART GPIO Bus Controller DMAC SDRAMC 32 Debugging Interface PLL Clock Divider 33

ARM+NEC エレクトロニクス MPCore の特徴 ARM MP11 コア (ARM11 アーキテクチャ )x 4 ARMv6 命令セット ARM 命令セット (32bit), Thumb 命令セット (16bit), Jazelle 命令セット ( 可変長 ) 8 段パイプライン 1 命令同時発行 チップ実装の際には柔軟な構成が可能 Distributed L2 cache, 1MB, Interrupt Controller 8way-set-assoc CT11MPCore + RealView Emulation Baseboard を使用 DDR-SDRAM コントローラなど周辺 I/F は FPGA に搭載 Instr & Data 64bit Bus Interrupt CPU0 Interface Timer & watchdog MP11 CPU0 Interrupt CPU1 Interface Timer & watchdog MP11 CPU1 Interrupt CPU2 Interface Timer & watchdog MP11 CPU2 Snoop Control Unit (SCU) Interrupt CPU3 Interface Timer & watchdog MP11 CPU3 Interrup lines Coherency Control Bus AXI 64bit Bus x 2 34

RP1 の特徴 早稲田大 + ルネサステクノロジ + 日立 SH-X3アーキテクチャ,SH-4Aコア x 4 16bit 命令セット,2 命令同時発行可能 8 段パイプライン 専用のスヌープバス SHwy のトラフィックを避けて転送 Snoop bus オンチップメモリ 今回は未使用 ローカルメモリ 命令用 ILRAM (8Kbyte, 1clock) データ用 OLRAM (8Kbyte, 1clock) URAM (128Kbyte, 1~ 数クロック ) 集中共有メモリ (CSM, 128Kbyte) Core 3 Core CPU 2 FPU Core CPU 1 I$ FPU D$ Core CPU 0 CCN I$ FPU 32K D$ 32K CPU ILRAM CCN I$ FPU 32K D$ 32K DTU ILRAM CCN I$ 32K D$ 8K OLRAM 16K DTU 32K ILRAM CCN 32K 8K OLRAM URAM 16K DTU 32K 128K ILRAM 8K OLRAM URAM 16K DTU 128K 8K URAM 16K 128K URAM 128K SRAM LBSC OLRAM On chip system bus (SuperHwy) DBSC CSM 128K DDR2 SDRAM Snoop Controller (SNC) 35

各プロセッサの比較 ルネサス ARM+NEC 早大 + ルネサス + Intel Core2Quad M32700 MPCore 日立 Q6600 RP1 コア数 2 4 4 4 コア周波数 300MHz 210MHz 600MHz 2.4GHz 内部バス周波数 75MHz 210MHz 300MHz 外部バス周波数 75MHz 30MHz 50MHz キャッシュ (I+D) 2way 8K+8K 4way 32K+32K L2, 1MB, 8way 4way 32K+32K ラインサイズ 16byte 32byte 32byte 64byte 主記憶 32MB SDRAM 100MHz 256MB DDR-SDRAM 30MHz 128MB DDR2-600 300MHz 8way 32K+32K (L1) 16way 4M(2コア ) x 2 (L2) 4GB DDR2-800 400MHz 36

実行時ライブラリの実装 Omni OpenMPコンパイラでは 排他制御を行なう関数の選択が可能 POSIX thread の mutex lock 特定アーキテクチャ専用のスピンロック実装 今回用いた各マルチコアプロセッサ向けに, スピンロックを用いた実行時ライブラリを実装 SIMPLE_SPINSPIN を define 同期操作を簡略化 特に parallel ディレクティブの軽量化 ( 複数プロセスの場合に影響が出る可能性あり ) ロック変数をFalse sharingを防ぐためキャッシュラインサイズで align 37

同期性能の評価 NPTL でもスピンロックの方が MPCore で11 1.1 倍程度高速 EPCC マイクロベンチマーク 以後スピンロックのみを採用 Linuxthreadsではスピンロックの方が Edinburgh Parallel Computing CentreによるOpenMPのオーバヘッド測定のた M32700 で最大 482 倍 RP1 で最大 695 倍高速 Parallelディレクティブ関連ではめのベンチマークメモリアクセス速度の影響が大きい syncbench: 同期性能測定ベンチマーク 上段 :Mutex, 下段 : スピンロック, 単位 :μ 秒 paral for paral barri singl critic ii lock/ order atom redu lel lel er e al unloc ed ic ction for k M32700 392.22 18.5 399.7 14.11 50.8 273.5 273.1 864 8.64 241.0 401.9 376.8 13.6 383.6 10.7 9.87 3.15 2.51 7.08 0.501 387.1 MPCore 436.5 7.46 436.3 6.11 3.14 0.921 1.03 1.50 0.894 443.9 434.8 6.15 435.7 5.98 3.12 0.837 0.962 1.33 0.893 443.8 RP1 107.8 1.66 108.2 1.13 295.1 128.2 121.0 0.584 121.0 327.0 107.2 1.42 107.7 0.867 1.53 0.190 0.174 0.598 0.365 109.1 Q6600 2.80 0.364 3.71 0.301 4.54 1.31 1.41 0.191 0.474 6.13 225 2.25 0.372 247 2.47 0.316 0.859 0.129 0.131 0.168 0.307 335 3.35 38 38

NPB IS, CG の結果 3 M32700 MPCore RP1 Core2Quad 4 3 M32700 MPCore RP1 Core2Quad Speedup 2 Speedup 2 1 1 2 3 4 Number of PUs メモリインテンシブ メモリアクセス性能の影響が大きい 1 1 2 3 4 Number of PUs キャッシュにヒットしやすい計算インテンシブ 39

Mpeg2enc の結果 3 M32700 RP1 Core2Quad Speedu up 2 1 MPCore では実行エラー 1 2 3 4 ファイル入力を伴う NFS の影響 M32700では浮動小数点演算のソフトウェアエミュレーションが隠ぺい Number of PUs 40

Susan smoothing BlowFish (ECB モード ) の結果 4 M32700 MPCore RP1 Core2Quad 3 ばらつきが大きいため error bar で表 - error bar: 最大値と最小値 折れ線 : 平均値 4 M32700 MPCore 3.5 RP1 Core2Quad 3 Speedu up 2 Speedu up 2.5 2 1 15 1.5 1 1 2 3 4 Number of PUs 高い性能向上 1 2 3 4 Number of PUs ブロックの処理毎にファイル入出力を伴う Core2Quad 以外は NFS 環境 41

4 3 M32700 MPCore RP1 Core2Quad FFT の結果 Speed dup 2 1 1 2 3 4 Number of PUs Core2Quadは実行時間が極めて短い ( 数ミリ秒 ) オーバヘッドの方が大きい 42

OpenMP 化のコスト 方針 parallel ディレクティブ (fork-join) のコストが大きいので なるべくparallelリージョンをまとめて長くする アプリケーション susan smoothing Blowfish encoding FFT Mpeg2enc 変更行数 ディレクティブ 6 行追加 ディレクティブ9 行追加 12 行修正 ディレクティブ 4 行追加 ディレクティブ 5 行追加 7 行修正 43

RPC によるマルチコアプログラミング RPC (remote procedure call) 別のアドレス空間 ( 通常 共有ネットワーク上の別のコンピュータ上 ) にある手続きを実行することを可能にする技術 client-server(caller-callee) に抽象化し 通信の詳細を隠蔽 IDL (interface description language) でインタフェースを記述 通信を生成 いろいろな分野 実装 応用がある SUN RPC システムサービス CORBA (common object broker arch) GridRPC マルチコアでも使える 既存のルーチンを違うコアに割り当てる AMPの形態には自然な抽象化 ある機能を呼び出す もちろん SMP でも OK 通信を隠蔽してくれるので 分散メモリ 共有メモリどちらでもよいリどちら コア プログラム call return コア (or DSP) 手続き 44

RPC の仕組み client-server(caller-callee) に抽象化し 通信の詳細を隠蔽 IDL (interface description language) でインタフェースを記述 通信を生成 Stub - クライアント側のメソッド呼び出しをサーバにディスパッチ Skeleton - サーバ側でクライアントに代わってメソッドを呼び出す 手続きのインタフェース ( 引数および結果 ) の情報を記述したもの 手続きの IDL 記述 IDL コンパイラを使って Stub と skelton を生成 コア call 起動 引数を送る コア (or DSP) プログラム stub 結果を送る return skeleton 手続き 45

富士通 非同期 RPC(ARPC) によるマルチコアプログラミング 富士通が非同期 RPC(ARPC) によるマルチコアプログラミングを提案 非同期 = 複数のRPCを同時に実行 通常の逐次プログラムからの移行が簡単 通信を隠蔽することにより いろいろなコア (&DSP) に対して移植性の良いプログラムができる 開発コストの低減 46

RPC によるマルチコアプログラミングのこれから 逐次プログラムからの移行が容易, いろいろな形態 (AMP&SMP DSP) に対応 directive ベースのプログラミング環境も提案されている HMPP (hybrid multicore parallel programming)@inria StarSs @BSC 47

組み込みマルチコアプロセッサのプログラミングの課題 標準化 ( の不在 ) 組み込みプロセッサ システムは形態が多様 Chip 内のインターコネクトの通信ソフトウエア MCAPI (Multicore Communication API) は本命? 標準的な ( 高レベルな ) プログラミングモデル 簡便なプログラミング環境 ARPC? OpenMP? いずれにしろ 分散メモリになる? だから 実時間処理と並列処理 ( 特に共有メモリ SMP の場合 ) 並列のプロセスのスケジューリングが 実時間処理と相性が悪い?! 実時間処理の場合 必要な資源 ( コア ) がすぐに割り当てられないといけない コアを意識したスレッドの割り当て (core affinity) デバック Linux2.6 から sched_setaffinity があるが HPC には OK だが 組み込みには不十分 48