Numerical Algorithms Group Ltd.
CASTEPのベンチマーク結果
CASTEPコードのHECToR XTおよびX2におけるベンチマーク実行結果を以下に示します。
Benchmark | Nprocs | XT(bespoke FFTs) | X2(bespoke FFTs) | X2(libsci FFTs) | Speedup factor XT:X2bespoke FFTs |
al1x1(step 7) | 1 | 2042.44s | 1464.70s | 1446.66s | 1.39 |
8 | 437.81s | 243.85s | 307.55s | 1.80 | |
★16 | 231.92s | 157.28s | 188.83s | 1.47 | |
32 | 166.61s | 128.62s | 143.3s | 1.30 | |
al3x3(step 11) | ★16 | 10152s* | 4436s | 4648s | 2.29 |
32 | 6077.90s | 2162.73s | 2263.76s | 2.81 | |
64 | 3352.89s | 1225.48s | 1274.03s | 2.73 | |
112 | 2196.7s | 912.55s | 930.58s | 2.41 | |
TiN-mp(step 39) | 16 | 3327.63s | 1651.2s | 2107.37s | 2.02 |
32 | 1629.41s | 1256.22s | 1454.51s | 1.30 | |
64 | 832.52s | 2066.07s | 2227.79s | ** |
- 時間は、括弧で示すSCFステップにおけるCASTEPのアウトプットから採取しました。al3x3の16procのみは、CASTEPの内部時間関数が不正確なため(実際の4倍短い時間を出力していた) 、aprunコマンドの経過時間としました。
- *印のジョブはメモリー制限のためシングルコア・モードで計測しました。
- **印は、以下のSCFが未収束とのメッセージで終了したものです:"*Warning* max. SCF cycles performed but system has not reached the groundstate"
- CASTEP搭載のFFTはCRAYのlibsciのライブラリーより高速です。
- CASTEPのFFTに対しては、lotmax=128およびlvr=128 (ベクトルレジスター長)とし、FFTループにIVDEP(依存性を無視する)指示行を挿入しました。Lotmaxに対しては、1のような適切でない値をセットした場合以外では、性能に影響はありませんでした(以下の記述を参照)。
- ★印についてはCrayPATで計測しました(以下の記述を参照)。
パラメーターlotmaxの影響
パラメーターlotmax(多重1D FFTに対するブロッキングパラメーター)の様々な値について、X2条のal1x1ジョブの16プロセッサーにおける、内蔵FFTの性能を調べました。
lotmax=1 | lotmax=64 | lotmax=128 | lotmax=256 | lotmax=512 |
300.99s | 175.92 | 175.66 | 175.64 | 175.96 |
ベクトルレジスター要素数は128です。1より大きな値についてはCASTEPの性能に影響は与えませんでした。
CrayPATによる比較
コマンドpat_report- Oapaを用いてビルドすると、以下のような有益なトレース情報を生成します。さらにこの出力もまた、経過時間を計測する機能による基本的なプロファイリングにも役立ちます。最初に示す結果は、16プロセッサーを用いたal1x1のケースです。
XT,al1x1,16procケース
Samp % | Samp | Imb. | Imb. |Group | | Samp | Samp % | Function | | | | PE='HIDE' 100.0% | 16913 | -- | -- |Total |--------------------------------------------- | 54.5% | 9210 | -- | -- |ETC ||-------------------------------------------- || 15.0% | 2534 | 70.81 | 2.9% |zgemm_kernel_n || 8.0% | 1359 | 59.94 | 4.5% |zgemm_kernel_l || 4.1% | 700 | 46.50 | 6.6% |zgemm_otcopy || 2.7% | 462 | 26.94 | 5.9% |zcopy_k || 2.6% | 442 | 35.81 | 8.0% |zgemm_oncopy || 2.2% | 367 | 172.88 | 34.1% |PtlEQPeek || 2.2% | 364 | 35.31 | 9.4% |zlaset_ || 1.6% | 267 | 23.56 | 8.6% |zlasr_ || 1.4% | 244 | 16.69 | 6.8% |zdotu_ || 1.2% | 205 | 17.75 | 8.5% |zlacpy_ || 1.0% | 177 | 20.94 | 11.3% |zscal_k || 1.0% | 161 | 27.31 | 15.5% |zgemv_n ||============================================ | 24.3% | 4105 | -- | -- |MPI ||-------------------------------------------- || 17.5% | 2956 | 105.38 | 3.7% |mpi_alltoallv_ || 4.3% | 725 | 48.06 | 6.6% |mpi_recv_ || 2.2% | 365 | 20.62 | 5.7% |mpi_allreduce_ ||============================================ | 21.3% | 3598 | -- | -- |USER ||-------------------------------------------- || 5.3% | 904 | 58.31 | 6.5% |COMMS_TRANSPOSE_EXCHANGE.in.COMMS_TRANSPOSE_N.in.COMMS || 2.4% | 402 | 36.44 | 8.9% |RAD5I.in.FFT_GPFA || 2.3% | 397 | 35.25 | 8.7% |GPFA.in.FFT_GPFA || 1.3% | 225 | 25.88 | 11.0% |RAD4ITWID.in.GPFA2F.in.FFT_GPFA || 1.3% | 223 | 36.12 | 14.9% |RAD4II.in.GPFA2F.in.FFT_GPFA || 1.1% | 188 | 18.50 | 9.6% |ION_BETA_RECIP_INTERPOLATION.in.ION |=============================================
X2 内製FFT,al1x1,16procケース
Samp % | Samp | Imb. | Imb. |Group | | Samp | Samp % | Function | | | | PE='HIDE' 100.0% | 22552 | -- | -- |Total |---------------------------------------------- | 59.4% | 13386 | -- | -- |ETC ||--------------------------------------------- || 13.0% | 2933 | 246.88 | 8.3% |zgbmv_ || 9.8% | 2213 | 136.12 | 6.2% |zgemm_ || 8.1% | 1817 | 150.19 | 8.1% |MPIDI_CRAY_progress || 3.0% | 677 | 81.12 | 11.4% |MPIDI_CRAY_dmdev_progress || 2.4% | 530 | 67.69 | 12.1% |_F90_LEN_TRIM_ || 1.9% | 433 | 266.94 | 40.7% |getrusage || 1.9% | 433 | 53.81 | 11.8% |zcopy_ || 1.9% | 427 | 57.06 | 12.6% |zhbmv_ || 1.4% | 324 | 52.12 | 14.8% |MPIDI_CRAY_Progress_wait || 1.4% | 307 | 51.56 | 15.3% |_F90_FCD_CMP_EQ || 1.2% | 270 | 36.44 | 12.7% |MPIC_Wait || 1.0% | 218 | 25.75 | 11.3% |zdotu_ ||============================================= | 22.2% | 5007 | -- | -- |USER ||--------------------------------------------- || 4.1% | 920 | 110.56 | 11.4% |trace_entry$trace_ || 3.9% | 879 | 125.50 | 13.3% |ion_beta_recip_interpolation$ion_ || 2.6% | 592 | 566.81 | 52.2% |comms_transpose_exchange$comms_transpose_n$comms_ || 1.9% | 422 | 76.00 | 16.3% |gpfa2f$fft_gpfa_ || 1.1% | 258 | 46.50 | 16.3% |gpfa$fft_gpfa_ || 1.1% | 237 | 39.00 | 15.1% |gpfa5f$fft_gpfa_ ||============================================= | 18.4% | 4159 | -- | -- |MPI ||--------------------------------------------- || 13.7% | 3087 | 356.81 | 11.1% |mpi_alltoallv_ || 3.1% | 696 | 79.69 | 11.0% |mpi_allreduce_ || 1.1% | 250 | 37.50 | 13.9% |mpi_recv_ |==============================================
X2 libsci FFT,al1x1,16procケース
Samp % | Samp | Imb. | Imb. |Group | | Samp | Samp % | Function | | | | PE='HIDE' 100.0% | 26110 | -- | -- |Total |---------------------------------------------- | 68.6% | 17902 | -- | -- |ETC ||--------------------------------------------- || 11.2% | 2914 | 248.56 | 8.4% |zgbmv_ || 8.5% | 2216 | 165.06 | 7.4% |zgemm_ || 6.6% | 1718 | 244.31 | 13.3% |MPIDI_CRAY_progress || 6.0% | 1578 | 182.50 | 11.1% |zfftx32_ || 3.1% | 816 | 124.44 | 14.1% |MPIDI_CRAY_dmdev_progress || 2.0% | 511 | 130.75 | 21.7% |_F90_LEN_TRIM_ || 1.8% | 472 | 56.06 | 11.3% |zpassm1$32_ || 1.7% | 454 | 146.00 | 26.0% |getrusage || 1.7% | 436 | 36.69 | 8.3% |zcopy_ || 1.7% | 435 | 143.75 | 26.5% |zpass1$32_ || 1.7% | 432 | 51.06 | 11.3% |zpass$32_ || 1.6% | 419 | 32.88 | 7.8% |zhbmv_ || 1.2% | 306 | 53.69 | 15.9% |MPIDI_CRAY_Progress_wait || 1.2% | 302 | 70.19 | 20.1% |_F90_FCD_CMP_EQ || 1.1% | 279 | 64.31 | 20.0% |MPIC_Wait || 1.0% | 262 | 53.62 | 18.1% |zpass1f_r6$32_ ||============================================= | 16.2% | 4238 | -- | -- |MPI ||--------------------------------------------- || 12.0% | 3144 | 223.56 | 7.1% |mpi_alltoallv_ || 2.6% | 683 | 81.69 | 11.4% |mpi_allreduce_ || 1.1% | 281 | 24.56 | 8.6% |mpi_recv_ ||============================================= | 15.2% | 3970 | -- | -- |USER ||--------------------------------------------- || 3.5% | 908 | 115.81 | 12.1% |ion_beta_recip_interpolation$ion_ || 3.4% | 897 | 105.19 | 11.2% |trace_entry$trace_ || 2.1% | 538 | 67.31 | 11.9% |comms_transpose_exchange$comms_transpose_n$comms_ |==============================================
これらの表からBLASに最も時間が掛かっており、CASTEPはX2に最適化されたバージョンの恩恵に与っていると言えます。2つのバンド行列計算ルーチンzhbmvとzgbmvはX2のプロファイルに現れていますが、XTでは見えません(つまりXTでは重要ではない)。このことからこのバンド行列計算は、X2上でlibsci BLASにより最適化されていないと考えられます。NaHF3ベンチマークでの貧弱な性能はBLASに関して特に問題がある事を示しています。シングルプロセッサーでの実行から、以下の実行時間が得られました:
XT | X2 libsci BLAS |
467.2s | 544.8s |
プロファイリングから、この性能劣化がBLASルーチンzhbmv(複素エルミートバンド行列-ベクトル計算)のベクトル性能によるものであることが示されました。netlibよりこのルーチンをダウンロードして、ftn -cのみでコンパイルしてリンクしたところ、実行時間は361.25sに減少しました。ベクトル化されていなかったループは以下のものです:
DO 60 J = 1,N TEMP1 = ALPHA*X(J) TEMP2 = ZERO L = KPLUS1 - J DO 50 I = MAX(1,J-K),J - 1 Y(I) = Y(I) + TEMP1*A(L+I,J) TEMP2 = TEMP2 + DCONJG(A(L+I,J))*X(I) 50 CONTINUE Y(J) = Y(J) + TEMP1*DBLE(A(KPLUS1,J)) + ALPHA*TEMP2 60 CONTINUE
Y(I)とY(J)への参照は依存性を持ち、外側ループのベクトル化を阻害しています。しかしながらCASTEPのNaHF3でのこのルーチンの呼出しにおいては、変数K(super-diagonal数)はゼロであり、内側ループは実行されません。そこで内側ループをコメントアウトして再度コンパイルしたところ、実行時間が176.89sまで減少しました。4ケースでのzhbmvのこれらのルーチンの平均実行時間は以下の通りでした:
XT | XT libsci | XT netlib | XT netlib commented |
2.4*10^-3 | 3.66*10^-2 | 1.97*10^-2 | 7*10^-4 |
プロファイルはmpi_all_to_allが多くの時間を消費していることも示しています。しかしながら、このルーチンの性能は全実行時間比で見れば、X2よりもXTでの比率が大きくなっています。
CrayPATトレース情報
ここで述べた実験はトレース情報を生成するために、CrayPATの自動プロファイリング解析オプションを用いています。
XT al1x1 16procケース
===================================================================== USER / main --------------------------------------------------------------------- Time% 67.3% Time 183.270900 Imb.Time 12.549153 Imb.Time% 7.3% Calls 1 DATA_CACHE_MISSES 68.258M/sec 12368216931 misses PAPI_TLB_DM 0.250M/sec 45337321 misses PAPI_L1_DCA 1678.617M/sec 304161187441 refs PAPI_FP_OPS 2162.653M/sec 391867404523 ops User time (approx) 181.197 secs 471113500000 cycles Average Time per Call 0.000000 sec/call Overhead / Time 2267.3% Cycles 181.197 secs 471113500000 cycles User time (approx) 181.197 secs 471113500000 cycles Utilization rate 100.0% HW FP Ops / Cycles 0.83 ops/cycle HW FP Ops / User time 2162.653M/sec 391867404523 ops 41.6%peak HW FP Ops / WCT 2162.653M/sec Computation intensity 1.29 ops/ref MFLOPS 34602.46M/sec LD & ST per TLB miss 6708.85 refs/miss LD & ST per D1 miss 24.59 refs/miss D1 cache hit ratio 95.9% % TLB misses / cycle 0.0% =====================================================================
X2 内製FFT al1x1 16procケース
===================================================================== USER / castep_ --------------------------------------------------------------------- Time% 53.0% Time 179.718458 Imb.Time 5.246363 Imb.Time% 3.2% Calls 1 VOPS_VL 3728.603M/sec 457400583884 ops PAPI_VEC_INS 78.268M/sec 9601388532 instr DCACHE_HIT 29.006M/sec 3558224331 hits DCACHE_MISS 4.974M/sec 610157559 misses PAPI_TOT_INS 330.429M/sec 40534828013 instr PAPI_FP_OPS 2847.366M/sec 349296196196 ops PAPI_TOT_CYC 122.673 secs 98138767428 cycles User time (approx) 133.084 secs 106467465000 cycles Average Time per Call 0.000000 sec/call Overhead / Time 14929.7% Cycles 122.673 secs 98138767428 cycles User time (approx) 133.084 secs 106467465000 cycles Utilization rate 100.0% Instr per cycle 0.41 inst/cycle HW FP Ops / Cycles 3.56 ops/cycle HW FP Ops / User time 2847.366M/sec 349296196196 ops 11.1%peak HW FP Ops / WCT 2847.366M/sec HW FP Ops / Inst 861.7% Avg VL 47.64 ops Data cache refs 33.979M/sec 4168381890 refs D cache hit ratio 85.4% MIPS 5286.86M/sec MFLOPS 45557.85M/sec Instructions per LD ST 9.72 inst/ref LD & ST per D1 miss 6.83 refs/miss =====================================================================
X2 libsci FFTs al1x1 16procケース
===================================================================== USER / castep_ --------------------------------------------------------------------- --- Time% 63.6% Time 218.313417 Imb.Time 5.040330 Imb.Time% 2.6% Calls 1 VOPS_VL 3017.798M/sec 498497777267 ops PAPI_VEC_INS 81.736M/sec 13501616871 instr DCACHE_HIT 43.989M/sec 7266421874 hits DCACHE_MISS 3.619M/sec 597870529 misses PAPI_TOT_INS 416.228M/sec 68755074792 instr PAPI_FP_OPS 2270.404M/sec 375038916911 ops PAPI_TOT_CYC 165.186 secs 132148763363 cycles User time (approx) 173.750 secs 138999970000 cycles Average Time per Call 0.000000 sec/call Overhead / Time 12868.7% Cycles 165.186 secs 132148763363 cycles User time (approx) 173.750 secs 138999970000 cycles Utilization rate 100.0% Instr per cycle 0.52 inst/cycle HW FP Ops / Cycles 2.84 ops/cycle HW FP Ops / User time 2270.404M/sec 375038916911 ops 8.9%peak HW FP Ops / WCT 2270.404M/sec HW FP Ops / Inst 545.5% Avg VL 36.92 ops Data cache refs 47.609M/sec 7864292403 refs D cache hit ratio 92.4% MIPS 6659.65M/sec MFLOPS 36326.47M/sec Instructions per LD ST 8.74 inst/ref LD & ST per D1 miss 13.15 refs/miss =====================================================================
これらの表はlibsci FFTのようなCrayPATに隠れているライブラリー呼出しを含む全CASTEPの状態を示します。
XTとX2の表を比べると、すぐに解る違いはピーク性能比で、XTは41.6%、X2では11.1%と8.9%であることです。これはCASTEPが、X2よりもXTのハードウェア性能をより良く引き出していることを示しています。
内製およびlibsciのFFTルーチンの比較から、内製FFTを用いる実行形式がベクトルレジスターをうまく使っていることが解ります。
- 平均ベクトル長がより長い(47.6 vs. 36.2)
- サイクル毎の浮動小数点演算数がより大きい(3.56 vs. 2.84)。(X2は、例えばパイプラインが初期化された後に8乗算と8加算のような、サイクル毎に16浮動小数点演算が可能です)
- FLOPS比がより大きい(理論ピーク性能の11.1% vs. 8.9%)
内製FFTルーチンがユーザーサプライのため、PATレポートを生成できました。例えばルーチンgpfa5fのPATレポートは以下の通りです(rad51やrad5iiはgpfa5fから呼ばれます):
X2 内製FFT al1x1 16 procケース
===================================================================== USER / gpfa5f$fft_gpfa_ --------------------------------------------------------------------- Time% 1.1% Time 3.714851 Imb.Time 0.135285 Imb.Time% 4.0% Calls 251680 VOPS_VL 4155.213M/sec 15495551976 ops PAPI_VEC_INS 64.058M/sec 238883853 instr DCACHE_HIT 36.236M/sec 135130645 hits DCACHE_MISS 1.145M/sec 4271125 misses PAPI_TOT_INS 231.495M/sec 863289163 instr PAPI_FP_OPS 3062.210M/sec 11419543975 ops PAPI_TOT_CYC 3.729 secs 2983346812 cycles User time (approx) 0.403 secs 322450000 cycles Average Time per Call 0.000000 sec/call Overhead / Time 181781789943.4% Cycles 3.729 secs 2983346812 cycles User time (approx) 0.403 secs 322450000 cycles Utilization rate 100.0% Instr per cycle 0.29 inst/cycle HW FP Ops / Cycles 3.83 ops/cycle HW FP Ops / User time 3062.210M/sec 11419543975 ops12.0%peak HW FP Ops / WCT 3062.210M/sec HW FP Ops / Inst 1322.8% Avg VL 64.87 ops Data cache refs 37.381M/sec 139401770 refs D cache hit ratio 96.9% MIPS 3703.93M/sec MFLOPS 48995.36M/sec Instructions per LD ST 6.19 inst/ref LD & ST per D1 miss 32.64 refs/miss =====================================================================
この表を、XTでのrad5iルーチンに対する出力と比較します:
XT al1x1 16 procケース
===================================================================== USER / RAD5I.in.FFT_GPFA --------------------------------------------------------------------- Time% 2.4% Time 6.715598 Imb.Time 0.096200 Imb.Time% 1.6% Calls 188725 DATA_CACHE_MISSES 118.223M/sec 660403246 misses PAPI_TLB_DM 0.048M/sec 269989 misses PAPI_L1_DCA 1215.428M/sec 6789493566 refs PAPI_FP_OPS 2227.874M/sec 12445115211 ops User time (approx) 5.586 secs 14523843750 cycles Average Time per Call 0.000000 sec/call Overhead / Time 11505329430.4% Cycles 5.586 secs 14523843750 cycles User time (approx) 5.586 secs 14523843750 cycles Utilization rate 100.0% HW FP Ops / Cycles 0.86 ops/cycle HW FP Ops / User time 2227.874M/sec 12445115211 ops 42.8%peak HW FP Ops / WCT 2227.874M/sec Computation intensity 1.83 ops/ref MFLOPS 35645.99M/sec LD & ST per TLB miss 25147.33 refs/miss LD & ST per D1 miss 10.28 refs/miss D1 cache hit ratio 90.3% % TLB misses / cycle 0.0% =====================================================================
ベクトルマシンはより高いFLOPS(3.06 GFLOPS vs. 2.2 GFLOPS)ですが、この値はX2ピーク性能(25.6 GFLOPS)よりかなり低い値です。このXTにおける実行では、シングルOpteronプロセッサーのピーク性能(5.6 GFLOPS)に近い値となっています。 al1x1 16procケースの結果を、より大きな問題であるal3x3 16procケースと比較してみます。
X2 内製FFT al3x3 16 procケース
===================================================================== USER / castep_ --------------------------------------------------------------------- --- Time% 84.3% Time 3942.380814 Imb.Time 52.875652 Imb.Time% 1.5% Calls 1 VOPS_VL 10786.848M/sec 41787189905570 ops PAPI_VEC_INS 118.336M/sec 458423644048 instr DCACHE_HIT 24.275M/sec 94038801549 hits DCACHE_MISS 1.897M/sec 7349945411 misses PAPI_TOT_INS 312.953M/sec 1212349784141 instr PAPI_FP_OPS 9517.049M/sec 36868112621489 ops PAPI_TOT_CYC 3873.902 secs 3099121303275 cycles User time (approx) 3899.569 secs 3119655485000 cycles Average Time per Call 0.000005 sec/call Overhead / Time 669.8% Cycles 3873.902 secs 3099121303275 cycles User time (approx) 3899.569 secs 3119655485000 cycles Utilization rate 100.0% Instr per cycle 0.39 inst/cycle HW FP Ops / Cycles 11.90 ops/cycle HW FP Ops / User time 9517.049M/sec 36868112621489 ops37.2%peak HW FP Ops / WCT 9517.049M/sec HW FP Ops / Inst 3041.0% Avg VL 91.15 ops Data cache refs 26.172M/sec 101388746959 refs D cache hit ratio 92.8% MIPS 5007.25M/sec MFLOPS 152272.79M/sec Instructions per LD ST 11.96 inst/ref LD & ST per D1 miss 13.79 refs/miss =====================================================================
この表からal1x1ケースに対して大きな改善が確認できます。このより大きなケースではより大きなループ長を持つため(平均ベクトル長が64.87から91.15へ改善しています)、ベクトルユニットをより長く保持し、良好な11.9 FP ops per cycle値を示し、ピーク性能の37.2%の実行性能を導いています。
X2 内製FFT al3x3 16 procケース
===================================================================== USER / gpfa5f$fft_gpfa_ --------------------------------------------------------------------- --- Time% 1.1% Time 49.389664 Imb.Time 1.689171 Imb.Time% 3.8% Calls 1239018 VOPS_VL 5690.326M/sec 272427152070 ops PAPI_VEC_INS 46.389M/sec 2220891576 instr DCACHE_HIT 12.135M/sec 580972618 hits DCACHE_MISS 0.537M/sec 25687919 misses PAPI_TOT_INS 122.806M/sec 5879394154 instr PAPI_FP_OPS 4193.054M/sec 200744517417 ops PAPI_TOT_CYC 47.875 secs 38300393033 cycles User time (approx) 44.244 secs 35395230000 cycles Average Time per Call 0.000000 sec/call Overhead / Time 66245897039.1% Cycles 47.875 secs 38300393033 cycles User time (approx) 44.244 secs 35395230000 cycles Utilization rate 100.0% Instr per cycle 0.15 inst/cycle HW FP Ops / Cycles 5.24 ops/cycle HW FP Ops / User time 4193.054M/sec 200744517417 ops 16.4%peak HW FP Ops / WCT 4193.054M/sec HW FP Ops / Inst 3414.4% Avg VL 122.67 ops Data cache refs 12.672M/sec 606660536 refs D cache hit ratio 95.8% MIPS 1964.89M/sec MFLOPS 67088.86M/sec Instructions per LD ST 9.69 inst/ref LD & ST per D1 miss 23.62 refs/miss =====================================================================
同じく、FFTルーチンの性能改善は、ベクトルユニット保持期間を長くするループ長の伸長(平均ベクトル長122.67)により引き起こされています。しかしながらrad5i内のループは、加算と乗算ユニットを常に保持しているわけではないためにピークのops per cycle比は16には届かず、5.24という値となっています。
結論
X2上のCASTEPの性能は、BLASの性能に制限されており、特にNaHF3ケースで問題を生じていました。CASTEPの内製FFTの性能は、libsci FFTよりも良好でした。al3x3 16procケースは、ベクトルユニットの性能を最も有効に動作させていると考えられます。これはおそらく、プロセッサーへより多くの演算を割り振り、ベクトルユニット効率をより高く維持し、このことからベクトルパイプラインの立ち上がりのコストを最小化しているためと考えられます。すなわちCASTEPは、各プロセッサーにそのベクトルユニットをbusyにする十分な演算を供給する場合であれば、良好な活用が可能であると言えます。