ãã®åé¡ã¯ãåçŽãªæ瀺çå·®åã¹ããŒã ã«ãã£ãŠ2次å ã®å Žåã«è§£æ±ºãããŸããã æé»ã®ã¹ããŒã ã¯å¥œãã§ã¯ãããŸããããããŠãããã¯å€ãã®ã¡ã¢ãªãå¿ èŠãšããŸãã éåžžã®ç²ŸåºŠã§ã®èšç®ã«ã¯ãå°ããªã¹ãããã°ãªãããå¿ èŠã§ã;åçŽãªæ¹æ³ãšæ¯èŒãããšãéåžžã«é·ãæéãããããŸãã ãããã£ãŠãããã©ãŒãã³ã¹ã«æ倧ã®éç¹ã眮ãããŸããã
Javaããã³C ++ã§ã®ã¢ã«ãŽãªãºã ã®å®è£ ã瀺ãããŠããŸãã

ãŸããã
çŽ6幎éãMatlabã¯èšç®ãããããªããšã®ããã®ç§ã®äž»èŠãªèšèªã§ããã ãã®çç±ã¯ãçµæã®èšè¿°ãšèŠèŠåã®å®¹æãã§ãã ãããŠãBorland C ++ 3.1ããåãæ¿ããŠä»¥æ¥ãæ©èœã®é²æ©ã¯æããã§ããã ïŒPythonã§ã¯ãç§ã¯æ±ºããŠææ¢ãããŸããã§ããããC ++ã§ã¯åŒ±ããªããŸããïŒã
ä¿¡é Œã§ããä¿¡é Œã§ããæ¹æ³ãšããŠãèšç®ã«FDTDãå¿ èŠã§ããã 圌ã¯2010-11幎ã«åé¡ã®ç 究ãå§ããŸããã å©çšå¯èœãªããã±ãŒãžã¯ã䜿çšæ¹æ³ãç解ããŠããªãããå¿ èŠãªãã®ãç¥ããŸããã§ããã ç§ã¯ãã¹ãŠãæ確ã«å¶åŸ¡ããããã°ã©ã ãæžãããšã«ããŸããã å€å žçãªèšäºã çæ¹æ§åªäœã§ã®ãã¯ã¹ãŠã§ã«æ¹çšåŒãå«ãåæå¢çå€åé¡ã®æ°å€è§£ ããèªãã åŸã圌ã¯3次å ã®ã±ãŒã¹ãæžããŸããããããã2次å ã®ã±ãŒã¹ã«åçŽåããŸããã 3Dãé£ããçç±ã¯ãåŸã§èª¬æããŸãã
次ã«ãMatlabã³ãŒããå¯èœãªéãæé©åããã³ç°¡çŽ åããŸããã ãã¹ãŠã®æ¹åã®åŸã2000x2000ã°ãªããã¯107åã§å®æã§ããããšãããããŸããã i5-3.8 GHzã§ã ãã®åŸããã®é床ã§ååã§ããã 䟿å©ãªã®ã¯ãMatlabã§ã¯ãè€éãªãã£ãŒã«ãã®èšç®ãããã«è¡ãããååžå³ãç°¡åã«è¡šç€ºã§ããããšã§ããã ãŸããMatlabã®é床ã¯å®è³ªçã«åœ±é¿ãåããªãã£ãããããã¹ãŠã2åãšèŠãªãããŸããã ã¯ããç§ã®æšæºçãªèšç®ã¯ããã©ãããã¯çµæ¶ãéãå ã®1ãã¹ã§ãã
2ã€ã®åé¡ããããŸããã é«ç²ŸåºŠã§ã¹ãã¯ãã«ãèšç®ããå¿ èŠãããããã®ããã«ã¯å€§ããªã°ãªããå¹ ã䜿çšããŸããã äž¡æ¹ã®åº§æšã®é¢ç©ã2åã«ãªããšãèšç®æéã8åã«ãªããŸãïŒçµæ¶ãµã€ãº*ééæéïŒã
ç§ã¯åŒãç¶ãMatlabã䜿çšããŸããããJavaããã°ã©ããŒã«ãªããŸããã ãããŠãç°ãªãã¢ã«ãŽãªãºã ã®ããã©ãŒãã³ã¹ãæ¯èŒããŠã圌ã¯äœããçãå§ããŸãã ã ããšãã°ãMatlabã®ããã«ãœãŒã-ã«ãŒããé åãæ¯èŒã®ã¿-ã¯ãC ++ãŸãã¯Javaã®6åé ããªããŸãã ãããŠãããã¯åœŒã«ãšã£ãŠãŸã è¯ãããšã§ãã Matlabã®ãªã€ã©ãŒä»®èª¬ã®5次å ãµã€ã¯ã«ã¯400åé·ããªããŸãã
æåã¯C ++ã§FDTDãæžãå§ããŸããã çµã¿èŸŒã¿ã®std :: complexããããŸããã ãããããã®åŸãç§ã¯ãã®èããæŸæ£ããŸããã ïŒMatlabã«ã¯ãã®ãããªæ¬åŒ§ããããŸãããã³ããŒããŒã¹ãã¯æ©èœããŸããã§ãããæéããããªããã°ãªããŸããã§ããïŒã ä»ãç§ã¯C ++ããã§ãã¯ããŸãã- è€éãªæ°åŠã¯5åã®é床ã®æ倱ãäžããŸãã ããã¯å€ãããã ãã®çµæãç§ã¯Javaã§æžããŸããã
ããªãJavaãªã®ãïŒããšãã質åã«ã€ããŠå°ãã ããã©ãŒãã³ã¹ã®è©³çŽ°ã«ã€ããŠã¯åŸã§èª¬æããŸãã èŠããã«-åçŽãªéOOPã³ãŒãã§ã¯ãç®è¡æŒç®ãšã«ãŒãã®ã¿-O3æé©åãŸãã¯åãé床ã®C ++ããŸãã¯æ倧+ 30ïŒ é«éã Javaãã€ã³ã¿ãŒãã§ãŒã¹ãã°ã©ãã£ãã¯ã¹ã®æäœã«ç²ŸéããŠãããšããã ãã§ãã
FDTD-詳现
ããã§ã¯ãã³ãŒãã«ç§»ããŸãããã ã¿ã¹ã¯ãšã¢ã«ãŽãªãºã ã®èª¬æãšãšãã«ããã¹ãŠã衚瀺ããããšããŸãã 2次å ã®å ŽåãMaxwellæ¹çšåŒã®ã·ã¹ãã ã¯ãTEæ³¢ãšTMæ³¢ã®2ã€ã®ç¬ç«ãããµãã·ã¹ãã ã«åå²ãããŸãã TEã®ã³ãŒãã 3ã€ã®ã³ã³ããŒãã³ãããããŸã-é»çEzãšç£æ°HxãHyã ç°¡åã«ããããã«ãæéã«ã¯ã¡ãŒãã«ã®æ¬¡å ããããŸãã
æåã¯ããã¹ãŠã®èšç®ãdoubleã«ãã£ã¹ãããããããfloatã«ãã€ã³ãã¯ãªããšèããŸããã ãããã£ãŠãç§ã¯ããã«ã®ã³ãŒããæäŸããŸã-ãããããå°ãªãã§ãã ãã¹ãŠã®é åã®ãµã€ãºã¯+1ã§ãããããã€ã³ããã¯ã¹ã¯Matlabãããªãã¯ã¹ãšäžèŽããŸãïŒ0ããã§ã¯ãªã1ããïŒã
ãœãŒã¹ã³ãŒãã®ã©ããã«ïŒ
public static int nx = 4096;// . 2 . public static int ny = 500;//
äž»ãªæ¹æ³ïŒ
åæå€æ°ã®åæå
public static double[][] callFDTD(int nx, int ny, String method) { int i, j;// double x; // final double lambd = 1064e-9; // final double dx = lambd / 15; // . λ/10. , . final double dy = dx; // . final double period = 2e-6; // final double Q = 1.0;// final double n = 1;// final double prodol = 2 * n * period * period / lambd / Q; // final double omega = 2 * PI / lambd; // final double dt = dx / 2; // . , final double tau = 2e-5 * 999;// . . , . final double s = dt / dx; // final double k3 = (1 - s) / (1 + s);// final double w = 19e-7;// final double alpha = sin(0.0 / 180 * PI);// . . double[][] Ez = new double[nx + 1][ny + 1]; double[][] Hx = new double[nx][ny]; // double[][] Hy = new double[nx][ny];
final int begin = 10; // , . . final double mod = 0.008 * 2;// = 2*În; final double ds = dt * dt / dx / dx;//
èªé»çã®åæåïŒçµæ¶æ ŒåïŒã ããæ£ç¢ºã«ã¯ãå®æ°ãšã®éæ°ã é¢æ£é¢æ°ïŒ0ãŸãã¯1ïŒã䜿çšãããŸãã å®éã®ãµã³ãã«ã«è¿ãããã§ãã ãã¡ãããããã«äœããæžãããšãã§ããŸãïŒ
double[][] e = new double[nx + 1][ny + 1]; for (i = 1; i < nx + 1; i++) { for (j = 1; j < ny + 1; j++) { e[i][j] = ds / (n + ((j < begin) ? 0 : (mod / 2) * (1 + signum(-0.1 + cos(2 * PI * (i - nx / 2.0 + 0.5) * dx / period) * sin(2 * PI * (j - begin) * dy / prodol))))); } }
çµæ¶æ Œåã¯æ¬¡ã®ããã«ãªããŸãã

å¢çæ¡ä»¶ã«äœ¿çšãããé åïŒ
double[][] end = new double[2][nx + 1]; double[][] top = new double[2][ny + 1]; double[][] bottom = new double[2][ny + 1];
ã¢ã«ãŠã³ãã®å¶éæéã ã¹ãããdt = dx / 2ããããããæšæºä¿æ°ã¯2ã§ããåªäœãå¯ã§ããå ŽåããŸãã¯è§åºŠãä»ããŠç§»åããå¿ èŠãããå Žåã¯ãããã«å€ããªããŸãã
final int tMax = (int) (ny * 2.2);
ã¡ã€ã³ãµã€ã¯ã«ãéå§ããŸãã
for (int t = 1; t <= tMax; t++) { double tt = Math.min(t * s + 10, ny - 1);
ããã§ã®å€æ°ttã¯ãããããªããŒãžã³ã§ãå ã®é床ã®å¶éãèæ ®ããŠããŸãã å ãå±ãå¯èœæ§ã®ããé åã®ã¿ãèæ ®ããŸãã
è€çŽ æ°ã®ä»£ããã«ããµã€ã³ãšã³ãµã€ã³ã®2ã€ã®ã³ã³ããŒãã³ããåå¥ã«æ€èšããŸãã ã«ãŒãå ã§éžæããããããé床ã®ããã«ããŒã¹ãã³ããŒããæ¹ãè¯ããšæããŸããã ãããããé¢æ°åŒã³åºããŸãã¯ã©ã ãã«çœ®ãæããŸãã
switch (method) { case "cos": for (i = 1; i <= nx - 1; i++) { x = dx * (i - (double) nx / 2 + 0.5); // Ez[i][1] = exp(-pow(x, 2) / w / w - (t - 1) * dt / tau) * cos((x * alpha + (t - 1) * dt) * omega); } break;
眪
case "sin": for (i = 1; i <= nx - 1; i++) { x = dx * (i - (double) nx / 2 + 0.5); Ez[i][1] = exp(-pow(x, 2) / w / w - (t - 1) * dt / tau) * sin((x * alpha + (t - 1) * dt) * omega); } break; }
ããã§ã¯ãé åã®å ¥ãå£ïŒå·Šç«¯ã®åº§æšïŒã«ãè§åºŠã¢ã«ãã¡ã§ãæéçã«æ¯åããåå€å¹ wã®ã¬ãŠã¹ããŒã ããããŸãã ããããæãŸããåšæ³¢æ°/æ³¢é·ã®ãã¬ãŒã¶ãŒãæŸå°ãçºçããæ¹æ³ã§ãã
次ã«ã ã ãŒã¢ã®åžåå¢çæ¡ä»¶ã®äžã§äžæé åãã³ããŒããŸã ã
for (i = 1; i <= nx; i++) { end[0][i] = Ez[i][ny - 1]; end[1][i] = Ez[i][ny]; } System.arraycopy(Ez[1], 0, top[0], 0, ny + 1); System.arraycopy(Ez[2], 0, top[1], 0, ny + 1); System.arraycopy(Ez[nx - 1], 0, bottom[0], 0, ny + 1); System.arraycopy(Ez[nx], 0, bottom[1], 0, ny + 1);
ããã§ãã¡ã€ã³ã®èšç®ãã€ãŸããã£ãŒã«ãã®æ¬¡ã®ã¹ãããã«é²ã¿ãŸãã Maxwellã®æ¹çšåŒã®ç¹åŸŽã¯ãç£å Žã®æéå€åãé»æ°ã®ã¿ã«äŸåããããšã§ãããéããŸãåæ§ã§ãã ããã«ãããç°¡åãªå·®åã¹ããŒã ãäœæã§ããŸãã åæã®åŒã¯æ¬¡ã®ãšããã§ãã

äºåã«ãã¹ãŠã®äœåãªå®æ°ãæ°ãã寞æ³Hã眮ãæããå°å ¥ããèªé»çãèæ ®ããŸããã ã°ãªããã®å ã®åŒã¯0.5ã·ããããŠãããããé åEãšNã®ã€ã³ããã¯ã¹ãšééããªãã§ãã ãããé·ãã¯ç°ãªããŸã-Eã¯ããã«1ã§ãã
Eã®ãšãªã¢ãµã€ã¯ã«ïŒ
for (i = 2; i <= nx - 1; i++) { for (j = 2; j <= tt; j++) {// ? Ez[i][j] += e[i][j] * ((Hx[i][j - 1] - Hx[i][j] + Hy[i][j] - Hy[i - 1][j])); } }
ãããŠãæåŸã«å¢çæ¡ä»¶ãé©çšããŸãã å·®åã¹ããŒã ã¯æ¥µç«¯ãªã»ã«ãã«ãŠã³ãããªããããããããå¿ èŠã§ã-ãããã®ããã®åŒã¯ãããŸããã äœãããªããã°ãå£ããå ãåå°ããŸãã ãããã£ãŠãæ³ç·å ¥å°ã§ã®åå°ãæå°éã«æããæ¹æ³ã䜿çšããŸãã äžãäžãå³ã®3ã€ã®åŽé¢ãåŠçããŸãã å¢çæ¡ä»¶ã§ã®çç£æ§ã®æ倱ã¯çŽ1ïŒ ã§ãïŒå°ããã»ã©ã¿ã¹ã¯ã倧ãããªããŸãïŒã
for (i = 1; i <= nx; i++) { Ez[i][ny] = end[0][i] + k3 * (end[1][i] - Ez[i][ny - 1]);//end } for (i = 1; i <= ny; i++) { Ez[1][i] = top[1][i] + k3 * (top[0][i] - Ez[2][i]);//verh kray Ez[nx][i] = bottom[0][i] + k3 * (bottom[1][i] - Ez[nx - 1][i]); }
å¢çç·ã¯å·ŠåŽãç¹å¥ã§ã-å ç·ãçæãããŸãã åååæ§ã ããã«1ã¹ãããå ã«é²ã¿ãŸãã
ã¬ãŒã¶ãŒ
switch (method) { case "cos": for (i = 1; i <= nx - 1; i++) { x = dx * (i - (double) nx / 2 + 0.5); Ez[i][1] = exp(-pow(x, 2) / w / w - (t - 1) * dt / tau) * cos((x * alpha + t * dt) * omega); } break; case "sin": for (i = 1; i <= nx - 1; i++) { x = dx * (i - (double) nx / 2 + 0.5); Ez[i][1] = exp(-pow(x, 2) / w / w - (t - 1) * dt / tau) * sin((x * alpha + t * dt) * omega); } break; }
ç£å Žãèšç®ããã ãã§ãã
for (i = 1; i <= nx - 1; i++) { // main Hx Hy for (j = 1; j <= tt; j++) { Hx[i][j] += Ez[i][j] - Ez[i][j + 1]; Hy[i][j] += Ez[i + 1][j] - Ez[i][j]; } } } // 3- .
ãããŠãã1ã€å°ããªããšïŒããŒãªãšå€æãèšç®ããããã®æçµã»ã°ã¡ã³ãã転éãã-é æ¹ãŸãŒã³ïŒæ¹åã®ç©ºéïŒã§ç»åãèŠã€ããïŒ
int pos = method.equals("cos") ? 0 : 1; // BasicEx.forFurier[pos] = new double[nx]; // int endF = (int) (ny * 0.95);// for (i = 1; i <= nx; i++) { BasicEx.forFurier[pos][i - 1] = Ez[i][endF]; for (j = 1; j <= ny; j++) { Ez[i][j] = abs(Ez[i][j]);// ABS } // , - } Hx = null; // , Hy = null; e = null; return Ez; }
次ã«ã2ã€ã®ã³ã³ããŒãã³ãã®æ£æ¹åœ¢ãè¿œå ãã匷床ã®å³ã衚瀺ããŸãã
for (int i = 0; i < nx + 1; i++) { for (int j = 0; j < ny + 1; j++) { co.E[i][j] = co.E[i][j] * co.E[i][j] + si.E[i][j] * si.E[i][j]; } }
å¥ã«ãããŒãªãšå€æã䜿çšããŸãã
fft.fft(forFurier[0], forFurier[1]);
é«éããŒãªãšãç解ããŠããªãããã æåã«ååŸãããã®ãååŸããŸãã ã ãã€ãã¹-å¹ ã¯2ã®çŽ¯ä¹ã®ã¿ã§ãã
ããã©ãŒãã³ã¹ã«ã€ããŠ
ç§ã«ãšã£ãŠæãèå³æ·±ãã®ã¯ãMatlabããJavaã«åãæ¿ããããšã§åŸããããã®ã§ãã Matlabã§ã¯ãã§ããéããã¹ãŠãæé©åããŸããã Javaã§ã¯ãåºæ¬çã«å éšã«ãŒãïŒè€éãn ^ 3ïŒã§ãã Matlabã¯ã2ã€ã®ã³ã³ããŒãã³ããäžåºŠã«èæ ®ãããšããäºå®ããã§ã«èæ ®ããŠããŸãã 第äžæ®µéã®é床ïŒå€ããã°å€ãã»ã©è¯ãïŒïŒ
Matlab | 1 |
Matlabã®è¡å | 3.4 / 5.1 ïŒãããŒãïŒ |
Javaããã« | 50 |
C ++ gcc double | 48 |
C ++ MSVSããã« | 55 |
C ++ gcc float | 73 |
C ++ MSVSãããŒã | 79 |
UPDã Matlabã®çµæãè¿œå ããŸããããã®å Žåã2ãµã€ã¯ã«ãè¡åã®æžç®ã«çœ®ãæããããŸããã
ã³ã³ãã¹ãã®äž»ãªåå è ã«ã€ããŠèª¬æããŸãã
- Matlab-2011bããã³2014ã32ãããã®æ°å€ã«åãæ¿ãããšãé床ããããã«åäžããŸãã
- Javaã¯æåã¯7u79ã§ãããã»ãšãã©ã¯8u102ã§ãã 8ã¯ãããã«åªããŠããããã«èŠããŸãããã詳现ã«æ¯èŒããŸããã§ããã
- Microsoft VisualStudio 2015ãªãªãŒã¹æ§æ
- MinGWãgcc 4.9.2 32ãããã2014幎12æãåžžã«O3æé©åã 3æ=ã³ã¢i7ãAVXãªãã ç§ã¯ã©ãããããã«AVXããããŸããããã²ã€ã³ããããŸããã
è©Šéšæ©ïŒ
- Pentium 2020m 2.4 GHzãddr3-1600 1ãã£ãã«
- Core i5-4670 3.6-3.8 GHzãddr3-1600 2ãã£ãã«
- Core i7-4771 3.7-3.9 GHzãddr3-1333 2ãã£ãã«
- Athlon x3 3.1 GHzãddr3-1333ãéåžžã«é ãã¡ã¢ãªã³ã³ãããŒã©ãŒã
2ã³ã¢ãã§ãŒãº
æåã¯ãTEãšTMã®ã³ã³ããŒãã³ããé çªã«ã«ãŠã³ãããŸããã ã¡ãªã¿ã«ãããã¯ã¡ã¢ãªäžè¶³ã®å¯äžã®ãªãã·ã§ã³ã§ãã ãããã圌ã¯2ã€ã®ã¹ã¬ãããæžãã-ã·ã³ãã«ãªRunnableã ããã¯ã»ãã®å°ãã®é²æ©ã§ãã 1è¡ããã20ã22ïŒ ã ãé«éã§ãã 圌ã¯çç±ãæ¢ãå§ããŸããã ã¹ã¬ããã¯æ£åžžã«æ©èœããŸããã 2ã€ã®ã³ã¢ã100ïŒ ã§å®å®ããŠããŒããããã©ãããããã®çåã劚ããããŸããã
次ã«ãããã©ãŒãã³ã¹ãææ¡ããŸããã RAMã®é床ã«äŸåããŠããããšãå€æããŸããã ã³ãŒãã¯ãã§ã«èªã¿åãã®å¶éã§æ©èœããŠããŸããã ç§ã¯ãããŒãã«åãæ¿ããå¿ èŠããããŸããã 粟床ã®æ€æ»ã«ãããèŽåœçãªãšã©ãŒããªãããšã瀺ãããŸããã èŠèŠçãªéãã¯ãŸã£ãããããŸããã åèšãšãã«ã®ãŒã¯8æ¡ç°ãªããŸããã ç©åå€æåŸãã¹ãã¯ãã«ã®æ倧å€ã¯0.7e-6ã§ãã ããããäºå®ã¯ãJavaããã¹ãŠã64ããã粟床ã§èæ ®ãããããã32ã«å€æããããšã§ãã
ããããæãéèŠãªã®ã¯ãããã©ãŒãã³ã¹ãæ¥äžæããããšã§ãã 2ã€ã®ã³ã¢ã®å šäœçãªå¹æãšãããŒããžã®ç§»è¡+ 87ã102ïŒ ã ïŒã¡ã¢ãªãé«éã§ã³ã¢ãå€ãã»ã©ãã²ã€ã³ãåäžããŸãïŒã Athlon x3ã¯å°ãå¢å ããŸããã
C ++ã§ã®å®è£ ã¯äŒŒãŠããŸã-std ::ã¹ã¬ããã䜿çšïŒæåŸãåç §ïŒã
çŸåšã®é床ïŒ2ã¹ã¬ããïŒïŒ
Javaããã« | 61 |
JavaãããŒã | 64-101 |
C ++ gcc float | 87-110 |
C ++ gcc 6.2 64ãã€ãã£ã | 99-122 |
ããžã¥ã¢ã«ã¹ã¿ãžãª | 112-149 |
ïŒæ°ããã³ã³ãã€ã©ãŒã¯ã16384ã®Javaãšæ¯èŒããŠéåžžã«é«ãããã©ãŒãã³ã¹ãæäŸããŸããJavaãšGCC-4.9 32ã¯åæã«å€±æããŸãïŒã
ãã¹ãŠã®èŠç©ããã¯ã1åã®èšç®ã§å®è¡ãããŸããã ãªããªããããã°ã©ã ãéããã«GUIããåå®è¡ãããšãããã«é床ãäžããããã§ãã ç§èŠãjit-optimizationãã©ã€ãã
4ã³ã¢ãã§ãŒãº
ãŸã å éã®äœå°ãããããã«æããŸããã 4è¡ããŒãžã§ã³ã«ã€ããŠèšå®ããŸããã äžçªäžã®è¡ã¯ãé åãååã«åå²ãããæåã«Eã次ã«Nã®2ã€ã®ã¹ããªãŒã ã«ã«ãŠã³ããããããšã§ãã
æåã«Runnableã«æžããŸããã ããã¯ã²ã©ãå€æããŸãã-å éã¯ãšãªã¢ã®éåžžã«åºãå¹ ã®ããã ãã§ããã æ°ããã¹ã¬ãããçæããã«ã¯ã³ã¹ããããããããŸãã ãã®åŸã圌ã¯java.util.concurrentãç¿åŸããŸããã ããã§ãã¿ã¹ã¯ãå²ãåœãŠãããã¹ã¬ããã®åºå®ããŒã«ãã§ããŸããã
public static ExecutorService service = Executors.newFixedThreadPool(4); //âŠâŠ cdl = new CountDownLatch(2); NewThreadE first = new NewThreadE(Ez, Hx, Hy, e, 2, nx / 2, tt, cdl); NewThreadE second = new NewThreadE(Ez, Hx, Hy, e, nx / 2 + 1, nx - 1, tt, cdl); service.execute(first); service.execute(second); try { cdl.await(); } catch (InterruptedException ex) { }
Hã®å ŽåïŒ
cdl = new CountDownLatch(2); NewThreadH firstH = new NewThreadH(Ez, Hx, Hy, 1, nx / 2, tt, cdl); NewThreadH secondH = new NewThreadH(Ez, Hx, Hy, nx/2+1, nx-1, tt, cdl); service.execute(firstH); service.execute(secondH); try { cdl.await(); } catch (InterruptedException ex) { }
ã¹ããªãŒã å ã§åãµã€ã¯ã«ãå®è¡ãããŸãã
ã¯ã©ã¹NewThreadE
public class NewThreadE implements Runnable { float[][] Ez; float[][] Hx; float[][] Hy; float[][] e; int iBegin; int iEnd; float tt; CountDownLatch cdl; public NewThreadE(float[][] E, float[][] H, float[][] H2, float[][] eps, int iBegi, int iEn, float ttt, CountDownLatch cdl) { this.cdl = cdl; Ez = E; Hx = H; Hy = H2; e = eps; iBegin = iBegi; iEnd = iEn; tt = ttt; } @Override public void run() { for (int i = iBegin; i <= iEnd; i++) { // main Ez for (int j = 2; j <= tt; j++) { Ez[i][j] += e[i][j] * ((Hx[i][j - 1] - Hx[i][j] + Hy[i][j] - Hy[i - 1][j])); } } cdl.countDown(); } }
Hã®åæ§ã®ã¯ã©ã¹ã¯ãç°ãªãå¢çãšç¬èªã®ãµã€ã¯ã«ã§ãã
çŸåšãåžžã«4ã¹ã¬ããã®å¢å ããããŸã-23ãã49ïŒ ïŒ.jarïŒã å¹ ãå°ããã»ã©è¯ã-é床ããå€æãããšããã£ãã·ã¥ã¡ã¢ãªã«å ¥ããŸãã æ倧ã®å©ç¹ã¯ãé·ããŠçãã¿ã¹ã¯ãæ°ããããšã§ãã
Java float 4ã¹ã¬ãã | 86â151 |
C ++ gcc float 4ã¹ããªãŒã | 122â162ïŒ128ã«è¿ãïŒ |
C ++ gcc 6.2 64ãã€ãã£ã | 124â173 |
ããžã¥ã¢ã«ã¹ã¿ãžãª | 139â183 |
ãããŸã§ã®C ++ã®å®è£ ã«ã¯ãåçŽãªstd ::ã¹ã¬ããã®ã¿ãå«ãŸããŠããŸãã ãããã£ãŠã圌女ã«ãšã£ãŠã¯ãå¹ ãåºãã»ã©è¯ãã 16384ã§1024ãã47ïŒ ã®å¹ ã§5ïŒ ã®C ++ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã
UPDã GCC 6.2-64ããã³VisualStudioã®çµæãè¿œå ããŸããã VSã¯å€ãGCCããã13ã43ïŒ é«éã§ãæ°ããGCCããã3ã11ïŒ é«éã§ãã 64ãããã³ã³ãã€ã©ã®äž»ãªæ©èœã¯ãå¹ åºãã¿ã¹ã¯ã§ã®äœæ¥ã®é«éåã§ãã ãŸããJavaã¯å°ããªã¿ã¹ã¯ïŒãã£ãã·ã¥ïŒã«å¯ŸããŠãã䞊ååãããŠãããC ++ã¯å¹ åºãã¿ã¹ã¯ã«å¯ŸããŠ-Visual Studioã¯Javaããã61ïŒ é«éã§ãã
ã芧ã®ãšãããæè¯ã®å ŽåãJavaã®ã²ã€ã³ã¯49ïŒ ââã§ãïŒã»ãŒ3ã³ã¢ã®ããã«ïŒã ãããã£ãŠãé¢çœãäºå®ããããŸã-å°ããªã¿ã¹ã¯ã®å ŽåãnewFixedThreadPoolïŒ3ïŒãèšå®ããã®ãæåã§ãã
倧èŠæš¡ãªå Žå-ããã»ããµã®ã¹ã¬ããæ°-4ãŸãã¯6-8ã å¥ã®é¢çœãäºå®ãææããŸãã Athlone x3ã§ã¯ããããŒãããã³2ã¹ã¬ãããžã®åãæ¿ãããã®é²æã¯ã»ãšãã©ãããŸããã§ãã-äž¡æ¹ã®æé©åã®32ïŒ ã C ++ã®ã4ãããŒãã³ãŒãããã®ã²ã€ã³ãå°ããã1ã4ã«ãŒãã«ã§67ïŒ ïŒäž¡æ¹ãšãfloatïŒã§ãã é ãã¡ã¢ãªã³ã³ãããŒã©ãŒãš32ãããWindowsã«æžãæ»ãããšãã§ããŸãã
ãããã4ã³ã¢ã®Javaã³ãŒãã¯åé¡ãªãæ©èœããŸããã 3ã€ã®ãšã°ãŒãã¥ãŒã¿ãŒã¹ã¬ãã+倧èŠæš¡ã¿ã¹ã¯çšã®2ã³ã¢ããŒãžã§ã³ã®50.2ïŒ ã äœããã®çç±ã§ãææªã®2ã³ã¢å®è£ ã¯ãå¯èœãªéãæé«ã®ãã«ãã³ã¢å®è£ ã«ãã£ãŠå¢å¹ ãããŸããã
Javaã®4ã³ã¢ã³ãŒãã«é¢ããæåŸã®ã¡ã¢ã çŸåšã®æéïŒ
åºæ¬çãª2次å ãµã€ã¯ã«Eããã³H | 83ïŒ |
ãã®ä»ããã¹ãŠã®åæåæåãèæ ® | 16ïŒ |
ã¹ããŒã³ïŒ4ïŒã¹ã¬ãã | çŽ1ïŒ ïŒãããã¡ã€ã©ãŒã§0.86ïŒ |
æ®ãã¯ã»ãšãã©æéãç¡é§ã«ããªããšèããŠãã¡ã€ã³ãµã€ã¯ã«ãå¯èœãªéãæé©åããããšããŸããã
ãŸããC ++ã®4ã³ã¢ã±ãŒã¹ã®å®å šãªã³ãŒããæçš¿ããŸãã
.cpp
ãŸã []ãåé€ããŸããçµæãã©ããã§äœ¿çšããå¿ èŠãããããã§ã:)
#include <iostream> #include <complex> #include <stdio.h> #include <sys/time.h> #include <thread> using namespace std; void thE (float** &Ez, float** &Hx, float** &Hy, float** &e, int iBegin, int iEnd, int tt) { for (int i = iBegin; i <= iEnd; i++) // main Ez { for (int j = 2; j <= tt; j++) { Ez[i][j] += e[i][j] * ((Hx[i][j - 1] - Hx[i][j] + Hy[i][j] - Hy[i - 1][j])); } } } void thH (float** &Ez, float** &Hx, float** &Hy, int iBegin, int iEnd, int tt) { for (int i = iBegin; i <= iEnd; i++) { for (int j = 1; j <= tt; j++) { Hx[i][j] += Ez[i][j] - Ez[i][j + 1]; Hy[i][j] += Ez[i + 1][j] - Ez[i][j]; } } } void FDTDmainFunction (char m) { //m=c: cos, else sin int i,j; float x; const float dx=0.5*1e-7/1.4; const float dy=dx; const float period=1.2e-6; const float Q=1.5; const float n=1;//ne =1 const float lambd=1064e-9; const float prodol=2*n*period*period/lambd/Q; const int nx=1024; const int ny=700; float **Ez = new float *[nx+1]; for (i = 0; i < nx+1; i++) { Ez[i] = new float [ny+1]; for (j=0; j<ny+1; j++) { Ez[i][j]=0; } } float **Hx = new float *[nx]; for (i = 0; i < nx; i++) { Hx[i] = new float [ny]; for (j=0; j<ny; j++) { Hx[i][j]=0; } } float **Hy = new float *[nx]; for (i = 0; i < nx; i++) { Hy[i] = new float [ny]; for (j=0; j<ny; j++) { Hy[i][j]=0; } } const float omega=2*3.14159265359/lambd; const float dt=dx/2; const float s=dt/dx;//for MUR const float w=40e-7; const float alpha =tan(15.0/180*3.1416); float** e = new float *[nx+1]; for (i = 0; i < nx+1; i++) { e[i] = new float [ny+1]; for (j=0; j<ny+1; j++) { e[i][j]=dt*dt / dx/dx/1; } } const int tmax= (int) ny*1.9; for (int t=1; t<=tmax; t++) { int tt=min( (int) (t*s+10), (ny-1)); if (m == 'c') { for (i=1; i<=nx-1; i++) { x = dx*(i-(float)nx/2+0.5); Ez[i][1]=exp(-pow(x,2)/w/w)*cos((x*alpha+(t-1)*dt)*omega); } } else { for (i=1; i<=nx-1; i++) { x = dx*(i-(float)nx/2+0.5); Ez[i][1]=exp(-pow(x,2)/w/w)*sin((x*alpha+(t-1)*dt)*omega); } } std::thread thr01(thE, std::ref(Ez), std::ref(Hx), std::ref(Hy), std::ref(e), 2, nx / 2, tt); std::thread thr02(thE, std::ref(Ez), std::ref(Hx), std::ref(Hy), std::ref(e), nx / 2 + 1, nx - 1, tt); thr01.join(); thr02.join(); // H for (i=1; i<=nx-1; i++) { x = dx*(i-(float)nx/2+0.5); Ez[i][1]=exp(-pow(x,2)/w/w)*cos((x*alpha+t*dt)*omega); } std::thread thr03(thH, std::ref(Ez), std::ref(Hx), std::ref(Hy), 1, nx / 2, tt); std::thread thr04(thH, std::ref(Ez), std::ref(Hx), std::ref(Hy), nx / 2 + 1, nx - 1, tt); thr03.join(); thr04.join(); } } int main() { struct timeval tp; gettimeofday(&tp, NULL); double ms = tp.tv_sec * 1000 + (double)tp.tv_usec / 1000; std::thread thr1(FDTDmainFunction, 'c'); std::thread thr2(FDTDmainFunction, 's'); thr1.join(); thr2.join(); gettimeofday(&tp, NULL); double ms2 = tp.tv_sec * 1000 + (double)tp.tv_usec / 1000; cout << ms2-ms << endl; return 0; }
ãŸã []ãåé€ããŸããçµæãã©ããã§äœ¿çšããå¿ èŠãããããã§ã:)
ããã¯æãåçŽãªã³ãŒãã§ãéåžžã®ã©ãã£ã¹ãšå¢çæ¡ä»¶ã¯ãããŸããã C ++ã§ã¯ã2次å é åã宣èšããŠã¹ã¬ãããåŒã³åºãæ¹ãå¹ççã§ããïŒ
8ã³ã¢
ãããŠãã³ã¢ã¯ãããããŸããã ã¿ã¹ã¯ãã¡ã¢ãªäžã«ãªãå Žåãããã«åå²ããŸãã ThreadPoolã¯äœã³ã¹ããæäŸããããã§ãã ãŸãã¯ãFork-Join Frameworkã«åãæ¿ããŸãã
ç§ã¯ãã§ãã¯ããããšãã§ããŸãã-æåã®2ã€ã®ã¹ã¬ãããæŸæ£ãã1ã€ã®ã¿ã¹ã¯ãi7ã§4ã8åã«åå²ããŸãã ããããDDR-4ãŸãã¯4ãã£ãã«ã®é«éã¡ã¢ãªãæèŒãããã·ã³ã§ãã¹ãããŠããå Žåã«ã®ã¿æå³ããããŸãã
ã¡ã¢ãªé床ã®äžè¶³ãåãé€ãæè¯ã®æ¹æ³ã¯ããããªã«ãŒãã䜿çšããããšã§ãã Cudaãžã®åãæ¿ãã¯ããããªãã©ã€ããŒã®æŽæ°ãçŠæ¢ããŠããå ã«ãã£ãŠçŠæ¢ãããŠããŸãïŒCãšCudaãç¡èŠïŒã
ãŸãšããšããšãã
å¿ èŠãª2次å ã®åé¡ãæ£ç¢ºã«ãã°ãã解決ã§ããŸãã 4096x2000ã°ãªããã¯ã106ç§ã§4ã³ã¢ã§æž¡ãããŸãã 300ãã¯ãã³x 40å±€ã«ãªããŸã-æ倧ãµã³ãã«æ°ã§ãã
2Dã§ã¯ã32ããã粟床ã§ãããããªã¡ã¢ãªãå¿ èŠã§ã-ææªã®å Žåã4ãã€ã* 4é å* 2è€éãªã³ã³ããŒãã³ã= 32ãã€ã/ãã¯ã»ã«ã
3Dã§ã¯ããã¹ãŠãããã«æªåããŠããŸãã ã³ã³ããŒãã³ãã¯ãã§ã«6ã§ãã 2ã€ã®ã¹ããªãŒã ãæåŠã§ããŸããã³ã³ããŒãã³ããé çªã«èªã¿åããããžã«æžã蟌ã¿ãŸãã èªé»çã®é åãä¿åããããšã¯ã§ããŸãããã1ãµã€ã¯ã«ã§æ€èšããããéåžžã«å°ããªåšæã»ã¯ã·ã§ã³ã«æ²¿ã£ãŠèª¿æŽããŠãã ããã 次ã«ã16 GBã®RAMïŒç§ã®äœæ¥ã§ã¯æ倧ïŒã895x895x895ã®é åã«åãŸããŸãã ãèŠããã®ã¯æ®éã§ãã ãã ãã1åã®ãã¹ã§6ã7æéã®ã¿ãšèŠãªãããŸãã ã¿ã¹ã¯ã4ã€ã®äžŠåã¹ã¬ããã«ããŸãåå²ãããŠããå Žåã ãããŠãεã®èšç®ãç¡èŠããå Žåã
ã¹ãã¯ãã«ã ãã§ã¯ååã§ã¯ãããŸããã å¹ ã1024ã®å Žåãå¿ èŠãªè©³çŽ°ã衚瀺ãããŸããã 2048ãå¿ èŠã§ããããã¯200 GB以äžã®ã¡ã¢ãªã§ãã ãããã£ãŠã3次å ã®å Žåã¯å°é£ã§ãã ãã£ãã·ã¥SSDã䜿çšããŠã³ãŒããéçºããªãå Žåã
PS Speedã®èŠç©ããã¯ããªãèããã®ã§ããã Matlabã¯å°ããªã¿ã¹ã¯ã§ã®ã¿ãã§ãã¯ããŸããã 次ã«ã4ã³ã¢ã§ã¿ã¹ã¯2048 * 1976ïŒã¢ããã°2000 * 2000ïŒã®Javaããã§ãã¯ããŸããã èšç®æé45.5ç§ã Matlabããã®å é141å ïŒç¢ºãã«ïŒã
å¯èœãªå°æ¥ã®èšç»ïŒ
*ïŒçŽç²ãªCïŒ++ã§ã¯ãªãïŒã®é床ã確èªããŸãã ãã³ãããŒã¯ã²ãŒã ã«ãããšãåžžã«é«éã§ãã
1ïŒCããã³Javaã®è€éãªã¯ã©ã¹ã確èªããŸãã ãã¶ãCã§ã¯ååã«æ©ãå®è£ ãããŸãã 確ãã«ããããã¯ãã¹ãŠ8ãã€ã以äžã«ãªããšæããŸãã
2ïŒMSVSã§ãã¹ãŠã®2ã³ã¢ããŒãžã§ã³ãš4ã³ã¢ããŒãžã§ã³ãããããããæé©åèšå®ãèŠã€ããŸãã
3ïŒã©ã ã/ã¹ããªãŒã ãã¡ã€ã³ãµã€ã¯ã«ãŸãã¯è¿œå ã®ãµã€ã¯ã«ãé«éåã§ãããã©ããã確èªããŸãã
4ïŒéåžžã®GUIãäœæããŠãã¹ãŠãéžæããçµæãèŠèŠåããŸãã
99ïŒCudaããŒãžã§ã³ãæžããŸãã
èå³ã®ããæ¹ã¯ãFDTDããã®ä»ã®èšç®æ¹æ³ããã©ãããã¯çµæ¶ã«ã€ããŠèª¬æããŸãã
Githubã«2ã€ã®ããŒãžã§ã³ãæçš¿ããŸããã
1ïŒãã©ã¡ãŒã¿ãŒéžæã€ã³ã¿ãŒãã§ãŒã¹ã®åºæ¬çãª2è¡
2ïŒ 4è¡
ã©ã¡ããçµµãšã¹ãã¯ãã«ãæããŸãã ãã¯ã»ã«åäœã§-2048ãè¶ ããå¹ ã¯äœ¿çšããªãã§ãã ãããã³ã³ãœãŒã«ããé åã®ãµã€ãºãååŸããæ¹æ³ãç¥ã£ãŠããŸãã