36
( 公公公 ) T2C_ 1

Spmv9forpublic

  • Upload
    t2c

  • View
    118

  • Download
    1

Embed Size (px)

DESCRIPTION

This is it.

Citation preview

( 公開用 )T2C_

1

本日の流れ1. 実行環境2. METIS 導入3. METIS の使用テスト1,24. 分割後の可視化5. nd24k を用いた本番6. 並列化7. FX10 上での実行8. まとめ、課題

2

実行環境OS:Windows 7 Professional 64-bit Service Pack 1

CPU: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz (8 CPUs), ~3.7GHz

メモリ: 8192MB RAM

実行環境: Cygwin 、 FX10 (性能は後述)

3

環境導入 リベンジ

4

前回までmake デキナイ!!

5

今回

6

Cygwin 導入時に使用した setup-x86_64.exe を用いてパッケージの追加「 make 」や「 metis 」で検索して出てくる使いそうな物は全てぶちこむ

パッケージを追加→ done

•関係ありそうなものを片っ端から入れたので どれを入れたかは記憶無し。 10 分くらい。

7

METIS を利用したリオーダリング

8

テスト&概要

9

65000

00400

00032

01000

  という簡単な行列を 3 分割する。     col = {3,0,1,2,3,4}   index= {0,1,3,4,6}  である。

コード#include <stdio.h>

#include <stdlib.h>

#include <metis.h>

void main()

{

int nz = 6,i;

int col2[100] = {3,0,1,2,3,4};

int index2[100] = {0,1,3,4,6};

int val[100] = {1,2,3,4,5,6};

double objval2[100] ={0};

int part2[100] ={0};

idx_t *nvtxs, *ncon, *col, *index,*nparts, *objval, *part;

nvtxs = (int *) malloc(1000 * sizeof(int));

ncon = (int *) malloc(1000 * sizeof(int))    確保すべきcol = (int *) malloc(1000 * sizeof(int));    領域??index = (int *) malloc(1000 * sizeof(int));

nparts = (int *) malloc(1000 * sizeof(int));

objval = (int *) malloc(1000 * sizeof(int));

part = (int *) malloc(1000 * sizeof(int));

*nvtxs = (int)nz;  → M??*ncon = (int)1;

*col = *col2;

*index = *index2;

*nparts = (int)3;

10

printf("HelloMetis!\n");

METIS_PartGraphKway(nvtxs,ncon,col,index,NULL,NULL,NULL,nparts,NULL,NULL,NULL,objval,part);

for(i=0;i<nz;i++){printf("part[%d]=%d\n",i,part[i]);}

printf("objval= %d \n",objval);

free(nvtxs);free(ncon);free(col);free(index);free(nparts);free(objval);free(part);}

結果見事に分割、しかし objval…?

11

65000

00400

00032

01000

テスト 2 &概要MM 形式の .mtx ファイル( 今回は 494_bus.mtx を使用 )を CRS に変換→metis.h を使って分割

12

Size Type

494 x 494, 1080 entriesreal symmetric

indefinite symmetric positive definite

コードread_example.c に先程のコードを追加。

▫idx_t *nvtxs, *ncon, *col2, *index2, *nparts, *objval, *part;

▫ *nvtxs = (int)nz;▫ *ncon = (int)1;▫ *col2 = *col;▫ *index2 = *index;▫ *nparts = (int)20;  

13

結果出来てる( 20 分割)。

どんな風に分割されたか確認したいので可視化を目指す。

14

可視化目的:行・列・分割された番号を用いて   色付けするなどしてどの様に分割されたか

を確認する。(最初は自分で見易くするため改行)以下を追加。

15

//for 494_bus.mtxprintf("0\n");for(i=0,j=0;i<=nz;i++){if(col[i] > col[i+1]){printf("\n");j++;}printf("%d\n",j);}

printf("\n\n --------- above:line number below:col -------- \n\n");

for(i=0;i<nz;i++){printf("%d\n",col[i]);

if(col[i] > col[i+1]){printf("\n");}}

printf("\n\n --------- above:col below:part -------- \n\n");

for(i=0;i<nz;i++){printf("%d\n",part[i]);if(col[i] > col[i+1]){printf("\n");}}

可視化2$ ./a.exe 494_bus.mtx >result.txtで関数に mtx ファイルを渡し、リダイレクトでresult.txt に出力する。(勝手に作ってくれる)

16

出力結果メモ帳→ \n で改行されない サクラエディタ→ ٩( ❛๑ ᴗ❛๑)۶

17

しかし…

行番号が 307 までしか割り振られない(本来 497 )→ 全て非 0 の行はスキップ?→ index も使わねば→ 時間の都合上、一時断念

18

本番&概要(目標)•Matrix Market より MM 形式の行列ファイル である nd24k を DL•nd24k の分割•時間の計測( & 理論時間の算出)•並列化•その他高速化

19

nd24k•COOL

Matrix properties number of rows 72,000 number of columns   72,000 nonzeros 28,715,634 structure symmetric

20

追加したコード• #include <omp.h>

• double time1=0,time2=0;

• time1,2 = omp_get_wtime();

• printf("time = %lf\n\n",(time2-time1));

• $ gcc newread.c mmio.c -lm -lmetis -fopenmp

•図は 494_bus でテストしたもの

21

実行•長い。•図は実行中の タスクマネージャ•CPU13%•メモリ 267MB  使用

22

結果•無事分割( 20 分割)•グラフ分割に時間を 割いている訳ではない•リオーダリング無しで 総時間約 40 分•235MB

23

理論時間•FLOPS 理論値 =   ( クロック ) × ( コア数 ) × 大体一致。

( コア・クロックあたりの浮動小数点演算回数 )= (3.40 * 10^9) * (4) * (8) = 110.8 * 10^9 FLOPS=110.8GFLOPS∴nz(= 28,715,634) / 110.8G ≒ 260000 * 10^-9 = 0.00026sec / nz1 周の処理∴readtime = 0.00026sec  sorttime = (nz * M) 回 = nz1 * 72,000 = 18.72sec  metistime = (nz * objval?) 回 = 取り忘れ alltime = SUM(read,sort,metis) = ?

24

比較理論値 実際

Read 0.00026sec 9.138236 sec

Sort 18.72sec 2479.721206 sec

Metis ? 20.328463 sec

all ? 2515.525911 sec

25

顕著なズレ(ハードを扱いきれていない?)

リオーダリング?•色々試行錯誤したものの出来ず•多分認識が違う•自分の認識では ordering[i][j] = k で 分割番号 i 、そこに入る順の j 、 k が通し番号→C で二次元配列(仮)を作ろうとすると ・ ordering[ 分割数 ][nz/ 非ゼロ数 ] で  大き過ぎて作れない ・ **ordering , *ordering でコンパイルは通るが  実行時即時に落とされる(原因わからず)

26

メモリの確保方法もわからず仮にポインタのポインタが実装出来たとして

ordering = (int **)malloc(DIVNUM * sizeof(int));

for(i=0; i<DIVNUM; i++){

ordering[i] = (int *)malloc( (nz/DIVNUM)*3 *sizeof(int) );}

だろうか?

27

並列化(読み込み部) for (i=0; i<nz; i++) { fscanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i]); I[i]--;

J[i]--; }

28

#pragma omp parallel for private(i) for (i=0; i<nz; i++) { fscanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i]); I[i]--;

J[i]--; }

(結局ソートするので同じ所の情報が取り出せれば 順番はどうでも良い(?))

並列化(ソート部)index[0]=0;

for(i=1; i<=M; i++){for(j=0; j<nz; j++){if(I[j]==i){// ソート部val2[count] = val[j];col[count] = J[j];count++;}}//index 作成部index[i] = count;}

29

count の数に依存するので別の設計が必要(先週参照)

並列化(出力部)

for(i=0;i<nz;i++){printf("part[%d]=%d\n",i,part[i]);}

不可。

30

FX10 でも実行•FX10

31

項目仕様

Oakleaf-FX Oakbridge-FX

システム全体( 計算ノード )

総理論演算性能 1.135 PFlops 136.2 TFlops

総主記憶容量 150 TByte 18 TByte

総ノード数 4,800 576

インターコネクト

6 次元メッシュ / トーラス

6 次元メッシュ / トーラス

ローカルファイルシステム

1.1 PByte 147 TByte

共有ファイルシステム

2.1 PByte 295 TByte

FX10 上での METIS の導入

• module load METIS  をする

• $ fccpx ~~ でコンパイル  ( 並列の場合は – Kopenmp も付加する)

• (ドキュメント閲覧時表示の遵守事項)  核兵器又は生物化学兵器及びこれらを  運搬するためのミサイル等の大量破壊兵器の 開発、設計、製造、保管及び使用等の目的に 利用しない ←すごい

Oakleaf-FX 利用手引書(ログイン後表示)

32

結果

33

まとめ•METIS の導入成功•グラフ分割の成功•MM→CSR→ 分割の成功•時間計測の成功•(正誤はともかく)理論値の算出•可視化の失敗•リオーダリングの不理解

34

課題•リファクタリング(関数化など)や そもそもの設計•レベル的におそらく可能なので可視化•バージョン管理•理論値の算出(並列化後・ FX10 上のものも)•ordering の宣言、初期化領域(メモリ確保数)•FX10 上での実行、•時間の確保

35

ありがとうございました

36