Thử nghiệm và đánh giá hiệu năng của treecode

Một phần của tài liệu Song song hoá thuật toán Bames hut với OpenMP (Trang 46)

3.2.1 Thử nghiệm chương trình treecode

Toàn bộ mã chương trình treecode do J. Barnes viết có thể được download tại trang web http://www.ifa.hawaii.edu/~barnes/treecode/treeguide.html

Treecode được viết bằng ngôn ngữ C (ANSI C). Giả sử chương trình được biên dịch bởi trình biên dịch của hệđiều hành LINUX.

Download file treecode.tar.gz tại trang web trên. Để thực hiện chương trình, copy file vào thư mục riêng, rồi thực hiện lệnh gunzip để giải nén tệp.

$ gunzip treecode.tar.gz $ tar xvf treecode.tar

Thư mục sau đó sẽ chứa các file .c , .h và Makefile

Trước khi biên dịch, có thể cần phải chỉnh sửa một số thông tin trong Makefile tùy theo kiến trúc máy tính và trình biên dịch hiện đang sử dụng. Ở đây, ta sửa lại thông tin trong Makefile bằng cách thêm tùy chọn –pg vào các cờ biên dịch: CCFLAGS và cờ

LDFLAGSđể khi thực hiện chương trình sẽ sinh ra file gmon.out

Tùy chọn biên dịch trong Makefile được sửa lại như dưới đây:

# Compiler options. # LINUX:

CCFLAGS = -pg -DLINUX LDFLAGS = -pg

OPTFLAG = -O3

Lê Thị Lan Phương 41

$ make treecode

Thực hiện chương trình bằng ./treecode [tham số]

Có thể xem các tham số bằng câu lệnh: ./treecode –help

treecode Hierarchical N-body code (theta scan) in= Input file with initial conditions out= Output file of N-body frames

dtime=1/32 Leapfrog integration timestep eps=0.025 Density smoothing length

theta=1.0 Force accuracy parameter usequad=false if true, use quad moments options= Various control options tstop=2.0 Time to stop integration dtout=1/4 Data output timestep

nbody=4096 Number of bodies for test run seed=123 Random number seed for test run save= Write state file as code runs restore= Continue run from state file VERSION=1.4 Joshua Barnes February 21 2001

Khi thực hiện chương trình, kết quả của quá trình tính toán sẽđược hiển thị ra màn hình, có dạng như sau:

Lê Thị Lan Phương 42

3.2.2 Đánh giá hiệu năng

Mặc dù treecode là một cải tiến của thuật toán Barnes-Hut, với tốc độ tính toán lực nhanh hơn và vấn đề kiểm soát lỗi tốt hơn so với các chương trình trước đó, song vấn

đề duyệt cây vẫn chiếm đa số thời gian thực hiện chương trình.

Có thể xem thời gian thực hiện các hàm trong toàn bộ chương trình thông qua profile của nó. Thực hiện lệnh gprof với chương trình treecode để xem thông tin profile về chương trình như sau:

gprof treecode gmon.out > treecode.out

Kết quả hiển thị trong file treecode.out có dạng:

Hierarchical N-body code (theta scan)

nbody dtime eps theta usequad dtout tstop 4096 0.03125 0.0250 1.00 false 0.25000 2.0000 rsize tdepth ftree actmax nbbtot nbctot CPUfc 64.0 13 3.050 1114 1051990 1417390 0.003 time |T+U| T -U -T/U |Vcom| |Jtot| CPUtot 0.000 0.24032 0.25082 0.49114 0.51069 0.00000 0.00576 0.004 rsize tdepth ftree actmax nbbtot nbctot CPUfc 64.0 12 3.108 1121 1054863 1419799 0.003 time |T+U| T -U -T/U |Vcom| |Jtot| CPUtot 0.031 0.24028 0.25075 0.49104 0.51066 0.00001 0.00576 0.007 rsize tdepth ftree actmax nbbtot nbctot CPUfc 64.0 13 3.057 1108 1040044 1422316 0.003 time |T+U| T -U -T/U |Vcom| |Jtot| CPUtot 0.062 0.24029 0.25069 0.49098 0.51059 0.00001 0.00576 0.011

Lê Thị Lan Phương 43 (adsbygoogle = window.adsbygoogle || []).push({});

Kết quả này có được khi biên dịch và thực hiện chương trình trên máy Intel với 1 CPU, Pentium 4 CPU 2.26GHz, 240MB RAM, hệ điều hành LINUX. Như vậy, qua kết quả trên ta thấy hàm walktree chiếm đến 96.02% tổng số thời gian thực hiện cả chương trình, trong khi phần trăm thời gian thực hiện các hàm khác là rất nhỏ.

Do vậy, tuy thời gian thực hiện treecode có nhanh hơn và vấn đề kiểm soát lỗi là tốt hơn so với các chương trình mô phỏng bài toán N-body trước đó, song để tối ưu hóa chương trình treecode, ta tiến hành thử nghiệm song song hóa chương trình với OpenMP trên máy Intel 4 CPU nhằm tăng hiệu năng tính toán.

3.3 Song song hóa treecode với OpenMP 3.3.1 Môi trường thực hiện song song 3.3.1 Môi trường thực hiện song song

Thực hiện song song hóa thuật toán treecode trên môi trường Intel (R) Xeon (TM) 4 CPU 2.40 GHz. Thông tin chi tiết về cấu hình 1 CPU trên máy Intel được cho dưới đây:

processor : 0

vendor_id : GenuineIntel cpu family : 15

model : 2

model name : Intel(R) Xeon(TM) CPU 2.40GHz stepping : 7

Flat profile:

Each sample counts as 0.01 seconds.

% cumulative self self total time seconds seconds calls s/call s/call name 96.02 129.09 129.09 65 1.99 1.99 walktree 0.96 130.37 1.29 2466730 0.00 0.00 subindex 0.95 131.65 1.28 65 0.02 0.02 diagnostics 0.76 132.68 1.03 266240 0.00 0.00 loadbody 0.57 133.44 0.76 65 0.01 0.01 hackcofm 0.21 133.72 0.28 65 0.00 0.00 threadtree 0.19 133.97 0.25 65 0.00 0.00 newtree 0.13 134.15 0.18 64 0.00 2.05 stepsystem 0.10 134.28 0.13 65 0.00 0.00 expandbox 0.05 134.35 0.07 130637 0.00 0.00 makecell 0.03 134.39 0.04 69477 0.00 0.00 xrandom 0.01 134.41 0.02 130637 0.00 0.00 setrcrit 0.01 134.43 0.02 8192 0.00 0.00 fpickshell 0.01 134.45 0.02 65 0.00 2.05 treeforce 0.01 134.46 0.01 1 0.01 0.07 testdata

Lê Thị Lan Phương 44

cpu MHz : 2394.914 cache size : 512 KB Physical processor ID: 0 Number of siblings : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm

bogomips : 4750.85

3.3.2 Thực hiện song song

Theo đánh giá hiệu năng của treecode ở mục 3.2.2, ta thấy phần lớn thời gian chương trình dành cho việc thực hiện hàm walktree. Để tăng hiệu năng tính toán của treecode, ta tiến hành song song hóa treecode bằng cách song song hóa các hàm trên.

Khó khăn gặp phải trong khi tiến hành song song hóa treecode đó là sự phụ thuộc vào chương trình dịch. Với các trình biên dịch của các kiến trúc máy tính khác nhau sẽ

cho thời gian thực hiện từng hàm con trong chương trình treecode là khác nhau.

Ví dụ với trình biên dịch của máy IBM eServer Cluster 1600, hệ điều hành AIX5.2 với cấu hình như sau:

• 5 node tính toán pSeries 655, mỗi node gồm 8 CPU Power 4+ 64 bit RISC 1.7 GHz của IBM; cache 5.6MB ECC L2, 128MB ECC L3, băng thông: 72.3 GBps; 32GB RAM, băng thông bộ nhớ 51.2 GBps; 6x36 GB HDD. Năng lực tính toán tổng cộng khoảng 240 GFlops (mở rộng tối đa 768 GFlops/16 node).

• 1 node quản lý CSM p630: Power4+ 64 bit 1.2 GHz; cache 1.5 MB ECC L2, 8MB ECC L3, băng thông: 12.8 GBps; 1GB RAM, băng thông: 6.4 GBps; 6x36 GB HDD, DVD ROM.

• 1 node điều khiển phần cứng HCM: Intel Xeon 3.06 GHz, 1GB RAM, 40 GB HDD, DVD RAM.

Lê Thị Lan Phương 45

• Các node được kết nối với nhau thông qua HPS (High Performance Switch – Switch hiệu năng cao), băng thông 2GBps và GEthernet.

• Hệ thống lưu trữ chung: IBM DS4400 và EXP700 kết nối với cụm IBM 1600 thông qua cáp quang với băng thông 2Gbps.

• Các node chạy HĐH AIX 5L phiên bản 5.2 Kết quả profile của treecode trên IBM AIX sẽ là:

Với trình biên dịch của Intel (R) Xeon (TM) 4 CPU 2.40 GHz, thì phần trăm thời gian thực hiện các hàm của treecode là:

% cumulative self self total time seconds seconds calls ms/call ms/call name 42.3 13.85 13.85 .sqrt [8] 34.8 25.23 11.38 532480 0.02 0.02 .sumnode [9] 7.6 27.73 2.50 .__mcount [11] 5.4 29.50 1.77 161645903 0.00 0.00 .sqrtf [12] 4.0 30.81 1.31 16072949 0.00 0.00 .accept [13] 2.6 31.65 0.84 570149 0.00 0.03 .walktree_13_6 <cycle 1> [7] 0.8 31.91 0.26 .qincrement [15] 0.5 32.09 0.18 65 2.77 2.77 .diagnostics [18] 0.4 32.22 0.13 2480994 0.00 0.00 .subindex [19] 0.4 32.34 0.12 .__stack_pointer [20] 0.4 32.46 0.12 .qincrement1 [21] 0.3 32.55 0.09 266240 0.00 0.00 .loadbody [16] 0.2 32.61 0.06 65 0.92 1.25 .hackcofm [22] 0.1 32.64 0.03 65 0.46 0.46 .threadtree [25]

Lê Thị Lan Phương 46 (adsbygoogle = window.adsbygoogle || []).push({});

Như vậy, với các trình biên dịch khác nhau, thời gian thực hiện các hàm của treecode là hoàn toàn khác. Vì vậy, việc đánh giá hàm nào tốn nhiều thời gian nhất cũng như cần phải tiến hành song song hóa như thế nào là vấn đề gặp nhiều khó khăn.

3.3.2.1 Phân tích hàm walktree

Hàm walktree là hàm đệ quy chính dùng trong khi tính lực. Nguyên mẫu của nó có dạng

void walktree(nodeptr *aptr, nodeptr *nptr, cellptr cptr, cellptr bptr,nodeptr p, real psize, vector pmid);

Hàm walktree tính lực hấp dẫn lên tất cả các hạt có trong node p thông qua việc duyệt đệ quy p và các con của nó. Tại mỗi thời điểm trong lượt duyệt đệ quy, thông tin của các node từ gốc tới p được lưu trữ trong một tập các node. Tập đó chính là tập các tương tác. Tập này được chia thành 2 tập cell và body riêng biệt, được trỏ bởi các con trỏ

tương ứng là cptr và bptr. Phần còn lại của cây được biểu diễn bởi một tập các active node, bao gồm node p và các node xung quanh nó trong không gian. Con trỏ trỏ tới các node này được lưu vào mảng nằm giữa aptr và nptr. Node p có kích thước là psize và vị

trí là pmid.

Trong vòng lặp chính, walktree duyệt qua tất cả các active node của p, kiểm tra xem node nào sẽđược thêm vào danh sách tương tác, và node nào gần với p đến mức phải kiểm tra các con của nó ở mức tiếp theo của quá trình duyệt đệ quy. Các cell được kiểm

Flat profile:

Each sample counts as 0.00195312 seconds.

% cumulative self self total time seconds seconds calls ms/call ms/call name 73.87 9.13 9.13 532480 0.02 0.02 sumnode 12.84 10.71 1.59 16013212 0.00 0.00 accept 10.21 11.97 1.26 569962 0.00 0.02 walktree 0.84 12.08 0.10 2466729 0.00 0.00 subindex 0.47 12.14 0.06 266240 0.00 0.00 loadbody 0.46 12.19 0.06 303722 0.00 0.00 walksub 0.27 12.23 0.03 65 0.51 0.51 diagnostics 0.25 12.26 0.03 520 0.06 0.07 hackcofm 0.22 12.28 0.03 520 0.05 0.05 threadtree 0.19 12.31 0.02 266240 0.00 0.03 gravsum 0.14 12.33 0.02 64 0.27 189.50 stepsystem

Lê Thị Lan Phương 47

tra thông qua hàm accept. Nếu cell cách khá xa p, nghĩa là tỉ số D/r là đủ nhỏ, cell được thêm vào danh sách tương tác của p. Ngược lại, kiểm tra tất cả các con của nó, và thêm vào danh sách các active node.

Nếu có danh sách active mới được tạo ra, thì tiếp tục duyệt cây đệ quy ở mức tiếp theo thông qua lời gọi hàm walksub. Hàm walksub thực hiện việc gọi hàm walktree tại các con của p. Ngược lại, nếu không có danh sách active mới nào, tiến hành kiểm tra p. Nếu p là body, thực hiện tính toán lực tại p bằng lời gọi hàm gravsum.

Nguyên mẫu của hàm walksub có dạng như sau:

void walksub(nodeptr *nptr, nodeptr *np, cellptr cptr, cellptr bptr,nodeptr p, real psize, vector pmid);

Các tham số trong hàm walksub có giá trị giống với các tham số trong hàm walktree tại lời gọi hàm. Có 2 trường hợp xảy ra:

• Nếu p là cell, khi đó walksub sẽ duyệt qua tất cả các con của p, và gọi hàm walktree tại mỗi nút con đó.

• Nếu p là body, walksub sẽ gọi hàm walktree đúng một lần duy nhất, để duyệt nốt danh sách active của nó.

Lê Thị Lan Phương 48

local void walktree(nodeptr *aptr, nodeptr *nptr, cellptr cptr, cellptr bptr, nodeptr p, real psize, vector pmid)

{

nodeptr *np, *ap, q; int actsafe;

if (Update(p)) { /* are new forces needed? */ np = nptr; /* start new active list */

actsafe = actlen - NSUB;/* leave room for NSUB more */

for (ap = aptr; ap < nptr; ap++)/* loop over active nodes */ if (Type(*ap) == CELL) { /* is this node a cell? */

if (accept(*ap, psize, pmid)) {/* does it pass the test?*/ Mass(cptr) = Mass(*ap); /* copy to interaction list */ SETV(Pos(cptr), Pos(*ap));

SETM(Quad(cptr), Quad(*ap));

cptr++; /* and bump cell array ptr */ } else { /* else it fails the test */

if (np - active >= actsafe) /* check list has room */ error("walktree: active list overflow\n"); (adsbygoogle = window.adsbygoogle || []).push({});

for (q = More(*ap); q != Next(*ap); q = Next(q)) /* loop over all subcells */ *np++= q; /* put on new active list */ }

} else /* else this node is a body */ if (*ap != p) { /* if not self-interaction */ --bptr; /* bump body array ptr */ Mass(bptr) = Mass(*ap);/* and copy data to array */ SETV(Pos(bptr), Pos(*ap));

}

actmax = MAX(actmax, np - active); /* keep track of max active */ if (np != nptr) /* if new actives listed */ walksub(nptr, np, cptr, bptr, p, psize, pmid);

/* then visit next level */ else { /* else no actives left, so */ if (Type(p) != BODY) /* must have found a body */ error("walktree: recursion terminated with cell\n"); gravsum((bodyptr) p, cptr, bptr); /* sum force on the body */ }

} }

Lê Thị Lan Phương 49

3.3.2.2 Song song hóa treecode

Ý tưởng song song hóa treecode như sau:

• Sử dụng chỉ thị taskq được hỗ trợ bởi trình dịch của máy Intel, để song song hóa hàm đệ quy walktree.

• Với các hàm khác, sử dụng các chỉ thị Do/for để song song hóa vòng lặp.

Chỉ thị taskq thiết lập môi trường thực hiện các công việc (task). Khi gặp chỉ thị

taskq, một trong số các thread sẽ được chọn để thực hiện chỉ thị đó. Một hàng đợi rỗng

được tạo ra bởi thread đã chọn. Sau đó, đoạn chương trình nằm trong khối taskq sẽ được thực hiện bởi một thread đơn. Các thread còn lại chờ thực hiện khối công việc sẽ được thêm vào hàng đợi. Các chỉ thị task xác định một khối công việc có thể được thực hiện bởi nhiều thread khác nhau. Khi gặp chỉ thị task trong khai báo taskq, đoạn chương trình

local void walksub(nodeptr *nptr, nodeptr *np, cellptr cptr, cellptr bptr, nodeptr p, real psize, vector pmid)

{

real poff; nodeptr q; int k;

vector nmid;

poff = psize / 4; /* precompute mid. offset */ if (Type(p) == CELL) { /* fanout over descendents */ for (q = More(p); q != Next(p); q = Next(q)) {

/* loop over all subcells */ for (k = 0; k < NDIM; k++)

/* locate each's midpoint */

nmid[k] = pmid[k] + (Pos(q)[k] < pmid[k] ? - poff : poff); walktree(nptr, np, cptr, bptr, q, psize / 2, nmid);

/* recurse on subcell */ }

} else { /* extend virtual tree */ for (k = 0; k < NDIM; k++)

/* locate next midpoint */

nmid[k] = pmid[k] + (Pos(p)[k] < pmid[k] ? - poff : poff); walktree(nptr, np, cptr, bptr, p, psize / 2, nmid);

/* and search next level */ }

Lê Thị Lan Phương 50

nằm trong khai báo task về mặt lý thuyết sẽđược xếp vào hàng đợi. Hàng đợi sẽ kết thúc khi tất cả các công việc trên đó đã được hoàn thành.

Như vậy, với việc sử dụng hàng đợi, hàm walktree có thể được chỉnh sửa lại như (adsbygoogle = window.adsbygoogle || []).push({});

sau:

Trong hàm gravcal(), lời gọi hàm walktree sẽđược thêm các chỉ thị taskq và task của OpenMP.

Trong hàm walksub gọi đệ quy hàm walktree, do vậy sẽ thêm các chỉ thị của OpenMP vào hàm walksub như sau:

void gravcalc(void) {

………. ……….

active[0] = (nodeptr) root; /* initialize active list */ CLRV(rmid); /* set center of root cell */

/* Add parallel region */ #pragma omp parallel {

#pragma intel omp taskq

{

#pragma intel omp task {

walktree(active, active + 1, interact, interact + actlen, (nodeptr) root, rsize, rmid);

/* scan tree, update forces */ }

}

} /* end of parallel region */

cpuforce = cputime() - cpustart; /* store CPU time w/o alloc */ free(active);

free(interact); }

Lê Thị Lan Phương 51

Khi biên dịch chương trình, các chỉ thị của OpenMP sẽđược thực hiện song song. Kết quả thực nghiệm được cho dưới đây.

3.4 Kết quả thực nghiệm

Phụ thuộc vào trình biên dịch và cấu hình máy Intel (R) Xeon (TM) với 4 CPU 2.40 GHz, chương trình treecode sau khi thử nghiệm song song với một số chỉ thị của OpenMP sẽ cho thời gian thực hiện các hàm như dưới đây:

local void walksub(nodeptr *nptr, nodeptr *np, cellptr cptr, cellptr bptr, nodeptr p, real psize, vector pmid)

{ ………

if (Type(p) == CELL) { /* fanout over descendents */ /* add parallel region */

#pragma intel omp parallel taskq shared(q) {

for (q = More(p); q != Next(p); q = Next(q)) { #pragma intel omp task captureprivate(q) {

for (k = 0; k < NDIM; k++)

nmid[k] = pmid[k] + (Pos(q)[k] < pmid[k] ? - poff : poff); walktree(nptr, np, cptr, bptr, q, psize / 2, nmid);

} }

} /* end of parallel region */

} else { for (k = 0; k < NDIM; k++) (adsbygoogle = window.adsbygoogle || []).push({});

nmid[k] = pmid[k] + (Pos(p)[k] < pmid[k] ? - poff : poff); walktree(nptr, np, cptr, bptr, p, psize / 2, nmid);

} }

Lê Thị Lan Phương 52

Như vậy, tùy thuộc vào từng trình biên dịch trên các máy tính có cấu hình khác nhau, kết quả thử nghiệm thu được trên máy đa xử lý Intel chỉ mang tính chất tương đối.

Flat profile:

Each sample counts as 0.00195312 seconds.

% cumulative self self total time seconds seconds calls ms/call ms/call name 74.84 10.43 10.43 532480 0.02 0.02 sumnode 11.18 11.99 1.56 569962 0.00 0.02 walktree 10.83 13.50 1.51 16013212 0.00 0.00 accept

Một phần của tài liệu Song song hoá thuật toán Bames hut với OpenMP (Trang 46)