主要内容

A\b

A*x = bx。最も一般的な方法は,行列の左除算(mldivideまたはバックスラッシュ演算子(\)とも呼ばれる)を使用してx()x = A\b) ? ? ? ? ?。

ベンチマークに関する最も重要な課題の1つは,システムの全体的なパフォーマンスを1つの数値で表そうとする誘惑に負けないようにすることです。性能曲線を確認すると,クラスターにおけるパフォーマンスのボトルネックを特定したり,作成したコードのベンチマークを実行してその結果から有意義な結論を導き出せるようにする方法について理解したりするためにも役立つ可能性があります。

你觉得怎么样?

函数results = paralleldemo_backslash_bench(memoryPerWorker)

。そのための方法として,各ワーカーで使用可能なシステムメモリの量をGB単位で引数としてこの例の関数に指定します。。

如果margin == 0 memoryPerWorker = 8.00;% (GB)%警告('pctexample:backslashbench:BackslashBenchUsingDefaultMemory',…%['每个工作线程可用的系统内存量是',…% '未指定。使用保守的默认值',…% 'of %。每个工作人员2gb。'], memoryPerWorker);结束

オーバーヘッドの回避

線形計算の求解の性能に関する正確な測定値を取得するため,オーバーヘッドの要因として考えられるすべてのものを排除する必要があります。。

P = gcp;如果isempty (p)错误(“pctexample: backslashbench: poolClosed”(“这个例子需要并行池。”使用parpool命令或set手动启动一个pool“你的并行偏好自动启动一个池。”]);结束poolSize = p.NumWorkers;pctRunOnAll“mpiSettings(“DeadlockDetection”、“关闭”);“
使用“bigMJS”配置文件启动并行池(parpool)…连接到12个工人。

ベンチマーク関数

ここでは,行列の左除算(\)のベンチマークを実行します。spmdブロックに入るときのコスト,行列作成時間,またはその他のパラメーターのベンチマークは実行しません。。。。中文:A*x = b★★★★★★★★★★★★★。

函数[A, b] = getData(n)'创建大小为%d × -%d.\n的矩阵', n, n);spmd使用通常能提供最佳性能的辅助分配器%用于求解线性系统。codistributor2dbc(codistributor2dbc. defaultlabgrid,codistributor2dbc.defaultBlockSize,“上校”);A =协分布。Rand (n, n, codistr);B =共分布。Rand (n, 1, codistr);结束结束函数time = timeSolve(A, b)spmd抽搐;x = A\b;%#ok我们不需要x的值。时间= gop(@max, toc);%全部完成的时间。结束Time = Time {1};结束

你知道吗

他の多数の並列アルゴリズムと同様に,並列での線形計算の求解のパフォーマンスは行列のサイズによって大きく異なります。() () (“。

  • ★★★★★★★★★

  • 你说的对,你说的对

  • 行列がシステムメモリのサイズに対して大きすぎるため,オペレーティングシステムでディスクへのメモリのスワッピングが開始される場合は非効率的

したがって,サイズが異なる多数の行列の計算時間を測定し,この場合において行列が”小さい”、“大きい”、“大きすぎる”ということがそれぞれどのようなことを意味するか理解することが重要です。★★★★★★★★★★★★★★★★★★

  • “小さすぎる”行列のサイズは1000行1000列

  • “大きな”行列は各ワーカーで使用可能なメモリの45%弱を占有

  • “大きすぎる”行列は各ワーカーで使用可能なシステムメモリの50%以上を占有

これらは,経験則に基づく値であるため,正確な値はリリースによって異なる場合があります。したがって,この範囲全体にわたる行列サイズを使用して,予測されるパフォーマンスを確認することが重要です。

ここでは,ワーカーの数に応じて問題の規模を変更するので,ウィークスケーリングを使用します。ブラックジャックを使用したparforのシンプルなベンチマーククラスターにおける独立ジョブのベンチマーク。それらの例ではタスク並列計算のベンチマークを実行するので,反復の数がワーカー数に比例するようなウィークスケーリングとなっています。一方,この例では,データ並列計算のベンチマークを実行するので,行列の上限サイズとワーカー数の関連性を確認します。

声明矩阵大小范围从1000 × 1000到系统的45%每个工作线程可用的内存%。maxMemUsagePerWorker = 0.45*memoryPerWorker*1024^3;%单位为字节。maxMatSize = round(sqrt(maxMemUsagePerWorker*poolSize/8));matSize = round(linspace(1000, maxMatSize, 5));

パフォーマンスの比較:ギガフロップス

パフォーマンスを測定するための値として1秒当たりの浮動小数点演算の回数(フロップス)を使用します。そのようにすると,さまざまな行列サイズとさまざまなワーカー数についてアルゴリズムのパフォーマンスを比較できるようになります。十分に広い範囲の行列サイズについて行列の左除算のパフォーマンステストが正常に完了した場合,パフォーマンスのグラフは以下のようになります。

★★★★★★★★★★★★★★★★★★★★★

  • 最も小さい行列はパフォーマンスが低下するほど小さいものなのか

  • 行列が大きすぎて合計システムメモリの45%を占有する場合にパフォーマンスの低下が見られるか

  • ある数のワーカーについて実現できる最大パフォーマンスはどの程度か

  • ワーカー数を8ではなく16にした場合にはどの行列サイズでパフォーマンスが向上するか

  • システムメモリによってピークパフォーマンスが制限されるか

行列サイズを指定すると,ベンチマーク関数によって行列一个中文:b1、1、1、1、一个\ b(1)、(1)、(1)、(1)、(1)、(1)、(1)、(1)、(2)。ここでは,HPCチャレンジの浮動小数点演算の回数を使用します。したがってn行n列の行列の場合,浮動小数点演算の回数は2/3*n^3 + 3/2*n^2? ? ? ?

函数gflops = benchFcn(n) numReps = 3;[A, b] = getData(n);时间= inf;我们求解了线性系统几次,并计算了每秒千兆次的速度%基于最佳时间。itr = 1:numReps tcurr = timeolve (A, b);如果Itr == 1“执行时间:%f”, tcurr);其他的流(”,% f ', tcurr);结束Time = min(tcur, Time);结束流(' \ n ');Flop = 2/3*n^3 + 3/2*n^2;Gflops = flop/time/1e9;结束

ベンチマークの実行

。ただし,計算が完了するまでに時間がかかることがあるため,それぞれの行列サイズのベンチマークが完了するたびに中間ステータス情報を出力するものとします。

流([“开始使用%d不同矩阵大小的基准测试,范围为\n”'从%d-by-%d到%d-by-%d.\n'],length(matSize), matSize(1), matSize(1), matSize(end),matSize(结束));gflops = 0 (size(matSize));1:length(matSize) gflops(i) = benchFcn(matSize(i));流(“吉拍:% f \ n \ n”gflops(我));结束结果。matSize = matSize;结果。Gflops = Gflops;
启动5种不同矩阵大小的基准测试,范围从1000 × 1000到76146 × 76146。创建大小为1000 * 1000的矩阵。分析并将文件传送给工人…完成。执行时间:1.038931,0.592114,0.575135 Gigaflops: 1.161756创建大小为19787 × 19787的矩阵。执行次数:119.402579,118.087116,119.323904 Gigaflops: 43.741681创建大小为38573 * 38573的矩阵。执行次数:552.256063,549.088060,555.753578 Gigaflops: 69.685485创建大小为57360 × 57360的矩阵。执行次数:3580.232186、3726.588242、3113.261810 Gigaflops: 40.414533创建大小为76146 × 76146的矩阵。执行次数:9261.720799、9099.777287、7968.750495 Gigaflops: 36.937936

パフォーマンスのプロット

★★★★★★★★★★★★★★★★★★★

FIG =图;Ax = axes()“父”图);plot(ax, matSize/1000, gflops);lines = ax.Children;行。标志=“+”;ylabel (ax,“吉拍”)包含(ax,“以千为单位的矩阵大小”) titleStr = sprintf([求解不同矩阵大小的A\\b' % d工人), poolSize);标题(ax, titleStr,“翻译”“没有”);

  • 。したがって,アルゴリズムまたはライブラリが原因で効率性が低下する可能性は極めて低く,以下の項目で説明するように,どちらかというとその使用方法が原因であると考えられます。

  • CPU速度とネットワーク通信速度が両方とも非常に速いにもかかわらずメモリ量が限られている場合は,使用可能なCPUとネットワーク帯域幅を最大限に活用できるほど十分に大きい行列のベンチマークを実行できないことがあります。

  • 最大限のパフォーマンスを実現するには,ネットワークのセットアップに合わせて調整されたMPIのバージョンを使用し,共有メモリを介して可能な限り多くの通信が行われるような方法でワーカーが実行されるようにすることが重要です。“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”

さまざまな数のワーカーの比較

。具体的には,ワーカーの数を変更しながらこの例を実行して取得されたデータを確認します。。

クラスターにおける独立ジョブのベンチマークなどの他の例で,異なるワーカー数について並列アルゴリズムのベンチマークを実行する場合は一般的にウィークスケーリングが使用されることを説明しました。つまり,ワーカー数の増加に応じて問題の規模を大きくするということです。行列の左除算の場合,除算のパフォーマンスは行列のサイズによって大幅に異なるので,一層注意する必要があります。以下のコードを実行すると,さまざまなワーカー数でテストされたすべての行列サイズについてのパフォーマンス(単位:ギガフロップス)のグラフが作成され,“この特定のクラスター”における行列の左除算のパフォーマンス特性について詳しく確認することができます。

S =荷载“pctdemo_data_backslash.mat”“workers4”“workers8”“workers16”“workers32”“workers64”);FIG =图;Ax = axes()“父”图);情节(ax, s.workers4.matSize。s.workers4.gflops / 1000,s.workers8.matSize。s.workers8.gflops / 1000,s.workers16.matSize。s.workers16.gflops / 1000,s.workers32.matSize。s.workers32.gflops / 1000,s.workers64.matSize。/ 1000, s.workers64.gflops);lines = ax.Children;集(线,{“标记”}, {“+”;“o”;“v”;“。”;‘*’});ylabel (ax,“吉拍”)包含(ax,“以千为单位的矩阵大小”)标题(ax,“不同工人数量下求解A\\b的比较数据”);传奇(“4个工人“8工人的16个工人“32工人64年的工人“位置”“西北”);

上記のグラフを見て最初に気づくのは,ワーカーの数が64個の場合はわずか4個のワーカーの場合に比べてはるかに大きいサイズの線形方程式の解を求めることが可能であるということです。また,60000行60000列の行列を4個のワーカーで処理できたとしてもパフォーマンスは10ギガフロップス程度にしかならないということもわかります。したがって4個のワーカーでそのような大きさの問題の解を求めるのに十分なメモリを使用できる場合でも,やはり,64個のワーカーを使用した方がはるかに優れたパフォーマンスが実現されることになります。

4個のワーカーの曲線の変化を見ると,3番目に大きいサイズから最大サイズまでの行列ではパフォーマンスは大幅には向上しないことがわかります。★★★★★★★★★★★★★★★★★★★★一个\ bの予測パフォーマンスを示す前掲のグラフと比較すると,4個のワーカーでは行列サイズが7772行7772列の場合にパフォーマンスがほぼピークに達することがわかります。

ワーカー数が8個の場合と16個の場合の曲線を見ると,行列サイズが最大のときにパフォーマンスが低下していることがわかります。これは,つまり,使用可能なシステムメモリがすべて消費されそうになっている状態または既に消費された状態であることを示します。一方,2番目と3番目に大きな行列の間ではパフォーマンスがごく緩やかに向上しており,ある程度安定していることがわかります。したがって8個または16個のワーカーについては,システムメモリを増設して比較的大きな行列サイズについてテストを実行した場合に,ギガフロップスの大幅な上昇は見込めないものと推測されます。

64年ワーカーが32個と個の場合の曲線を見ると,2番目と3番目に大きな行列サイズの間でパフォーマンスが大幅に向上しています。64年個のワーカーでは,2番目に大きいサイズから最大サイズの行列の間でもパフォーマンスが大幅に向上しています。したがって,ワーカーが32個と64個の場合にはピークパフォーマンスに達する前にシステムメモリがすべて消費されるものと推測されます。その推測が正しければ,コンピューターのメモリを増設することによって,より大きな問題が解決でき,また行列のサイズが比較的大きい場合のパフォーマンスを向上させることができます。

高速化

バックスラッシュなどの線形代数アルゴリズムによって実現される高速化を測定するために従来から使用されている方法は,ピークパフォーマンスの比較です。。

peakPerf = [max(s.w erers4 .gflops), max(s.w erers8 .gflops),马克斯(s.workers16.gflops)、马克斯(s.workers32.gflops),马克斯(s.workers64.gflops)];disp (“4-64名工人的峰值性能为每秒千兆次浮点运算:”)(峰值)(峰值)从4名工人增加到8、16、32和64名工人的速度加快;) disp (peakPerf(2:结束)/ peakPerf (1))
4-64个工人的峰值性能(Gigaflops): 10.9319 23.2508 40.7157 73.5109 147.0693从4个工人到8、16、32和64个工人的加速:2.1269 3.7245 6.7244 13.4532

その結果,ワーカー数を4から64へと16倍に増加させると約13.5倍の高速化が実現されることがわかります。既に述べたように,パフォーマンスのグラフから,64個のワーカーの場合にはクラスターコンピューターのシステムメモリを増設することによってパフォーマンスを向上(ひいては,さらなる高速化を実現)できるものと推測されます。

这是我最喜欢的

このデータの生成には,デュアルプロセッサとオクタコアを装備した,64 GBのメモリをもつコンピューター16台をギガビットイーサネットで接続して使用しました。4個のワーカーの場合,すべてのワーカーを1台のコンピューターで実行しました。また8個のワーカーの場合は2台のコンピューター,16個のワーカーの場合は4台のコンピューターというような設定で行いました。

デッドロック検出の再有効化

これでベンチマークが完了したので,現在の並列プールでデッドロック検出を再び有効にしても問題ありません。

pctRunOnAll“mpiSettings(“DeadlockDetection”、“on”);”
结束
ans = struct with fields: matSize: [1000 19787 38573 57360 76146] gflops: [1.1618 43.7417 69.6855 40.4145 36.9379]