情報ネットワーク特論 2011年11月22日 スーパーコンピュータの構造 スーパーコンピュータのネットワーク 最新のスーパーコンピュータ事情 多数(数千~数万)の"計算ノード"をネットワークで接続 した大規模並列計算機 CPU コア CPU コア メイン メモリ CPU コア CPU コア メイン メモリ CPU コア CPU コア メイン メモリ CPU コア CPU コア メイン メモリ ネットワーク ネットワーク 数台~数百台程度の、小~中規模な並列計算機より ネットワークに対する制約が厳しい "スーパー"な計算機 = その時点で、一般的な計算機の性能をはるかに 超える性能を持つ計算機 スーパーコンピュータの用途 = 主に科学技術計算 ◦ 例えば 分子構造のシミュレーションによる創薬 構造シミュレーション等による車の設計 熱力学シミュレーション等による気候予測 ... 稼動開始時点(2002年3月)時点で, 世界最高速のスーパーコンピュータ ◦ 日本の計算機メーカ(主に NEC)が開発 開発目標: 10km四方(赤道近辺)の精度で地球 全体の大気循環をシミュレート それまでは 100km四方 ◦ 例えば台風の発生過程: 100km四方だと台風が 台風に見えない 5 台風進路予測 台風発生予測 CO2の増加に伴う温暖化の予測 ◦ 5.5km四方で地球全体をシミュレート(日本近辺は 2.78km四方) ◦ 海底探査船「ちきゅう」に, 台風進路の予測結果を到達予定 の3日前に提供 ◦ 過去10年間についてシミュレーションによる台風発生回数 が実際の値とほぼ一致 ◦ 2040年には年間の真夏日日数が約20日増加, 平均気温が約2度上昇. 6 非常に高速なCPUを搭載した計算ノード: ベクトルプロセッサ 5120台の計算ノードによる並列計算 全ノードを接続する高速なネットワーク 命令読み出し → 解釈 → データ読み出し → 計算 → 結果の出力 処理装置(CPU) 入出力装置 磁気ディスク, キーボード, ディスプレイ等 制御装置 演算装置 メモリ プログラム 3 100 1 3 200 2 1 1 2 データ メモリからデータが届くまで計算できない 8 CPU:1回の演算時間: 0.25~0.5ns メモリ:1回の読み書き時間: 数ns~数十ns 約10~100倍の性能差: データを待つ間,CPUは仕事ができない ベクトルプロセッサ,スカラープロセッサ, それぞれ別の方法で解決 9 パイプラインによる連続アクセスの高速化 ◦ パイプライン(=バケツリレー) → データが届き始めてからはメモリ遅延の影響なし CPU メモリ a[8] a[7] a[6] a[5] さらに、 複数のデータの同時転送 a[4] a[3] a[2] a[1] a[0] CPU メモリ ベクトル命令で効率良く実行 ◦ 一つの命令で複数のデータに対する演算を一括指示 非ベクトル add a(1) b(1) add a(2) b(2) add a(3) ベクトル vadd a(1~100) b(1~100) b(3) 連続データに対する単純な演算の繰り返しに有効 10 利点: 簡単に高速化できる ◦ 強力な自動ベクトル化コンパイラにより, プログラムをほとんど書き換えずに高性能を達成 欠点 1): 用途が限定 ◦ 科学技術計算以外では,ほとんど効果が無い メモリをランダムに参照する処理: 探索、ソート等 欠点 2): 高価 ◦ 高速なパイプラインの実現には複雑な回路設計が必要 ⇒ 開発費が高価 ◦ 用途が限定されるため、販売台数が少ない ⇒ スケールメリットが得られにくい キャッシュメモリの利用 ◦ CPUとメモリの間に置く高速メモリ ◦ 高速だが小容量 速度に応じて階層化 階層 遅延時間 容量 1次キャッシュ 1クロック 32KB 2次キャッシュ 5クロック 256KB 3次キャッシュ 12クロック 3MB~9MB メモリ 数百クロック 数GB~数百GB CPU キャッシュメモリ 1次 2次 3次 メモリ ◦ アクセスされた領域をCPUの近くにコピー 小さい領域内での計算が非常に高速 様々な種類の計算を無難にこなす 12 スカラープロセッサ: ある程度の性能を安価に提供可能 ◦ 構造が比較的簡単 ⇒ 開発費が安価 ◦ PCやサーバ等にも搭載 ⇒ スケールメリット大 プログラムの工夫が重要 ◦ キャッシュメモリの有効利用: 一旦キャッシュにコピーしたデータの再利用等 1: プロセッサ単体の性能を上げる ◦ 1.1 クロック周波数(=計算機の基本的な処理速度)の向上 ◦ 1.2 プロセッサ内部の演算器を増やす 2: プロセッサの数を増やす = 並列計算機 14 物理的,経済的な限界 ◦ 物理的な限界 = 消費電力と熱 周波数に対して指数関数的に増加 例えば x86系 CPU は 2004年の 3.8GHz以降、 頭打ち状態 ◦ 経済的な限界 = 開発コスト 回路の微細化、複雑化 電流漏れ,熱等の問題が深刻化 今後も、大幅な周波数増は見込めない 15 やはり、物理的、経済的な限界 ◦ 集積度(チップに搭載可能な演算器数)の限界 ◦ 回路の複雑化にともなう開発コスト さらに、プログラム側の問題 ◦ 演算器の数が増えると、それらを活用できるプログラムは減少 ◦ 大幅なアルゴリズム変更が求められる場合もある 理想的な場合でも性能向上は2倍程度 仕事を複数のプロセッサに分担させて高速化 = 並列処理 普通の処理 仕事1 並列処理 仕事1 仕事2 仕事3 仕事2 仕事3 うまく分担できればプロセッサの数に応じて性能向上 並列処理をするには? ⇒ 並列プログラムが必要 並列処理に必要な事項を含むプログラム ◦ 各CPUコアへの仕事の分担のさせ方、 ◦ 相互の情報交換、 ◦ CPUコアの間の同期 等 普通のプログラム (=並列じゃないプログラム)とどう違う? 18 0番目から99番目までの要素を順に計算 0 ... 99 A = = = = = = = = = = = = = = = = = = = = B + + + + + + + + + + + + + + + + + + + + C プログラム double A[100], B[100], C[100]; ... for (i = 0; i < 100; i++) A[i] = B[i] + C[i]; 19 スレッド: 同じ記憶空間を共有しながら進行する流れ スレッド0 0 A ... スレッド1 24 25 ... スレッド2 49 50 ... スレッド3 74 75 ... 99 全スレッドが 同じ配列を 共有 = = = = = = = = = = = = = = = = = = = = B + + + + + + + + + + + + + + + + + + + + C double A[100],B[100],C[100]; double A[100],B[100],C[100]; ... double A[100],B[100],C[100]; ... double A[100],B[100],C[100]; for (i=0; i<25; i++) ... (i=25; i<50; i++) ... A[i] = B[i] + for C[i]; for (i=50; i<75; i++) A[i] = B[i] + C[i]; for (i=75; i<100; i++) A[i] = B[i] + C[i]; スレッド0 A[i] = B[i] + C[i]; スレッド1 スレッド2 スレッド3 20 1) コンパイラにおまかせ 2) OpenMP等のスレッド並列化手法 21 コンパイラの「自動並列化」機能を利用 = 「お任せコース」の最適化の一部 最近は、ほとんどのコンパイラで利用可能 簡単なプログラムでは、それなりの効果 複雑なプログラムの並列化は、人間の助けが必要 22 簡単にスレッド並列プログラムを 記述するための手法 基本的に「並列化指示行」を追加するだけ ◦ 例) 前出のスレッド並列処理をOpenMPで記述 #include "omp.h" double A[100], B[100], C[100]; ... #pragma omp parallel for for (i = 0; i < 100; i++) A[i] = B[i] + C[i]; 並列化指示行 23 利点: 簡単に並列化 ◦ コンパイラにお任せ、 もしくは OpenMPの指示行追加だけ 欠点: 基本的に「共有メモリ型並列計算機」向け ⇒ 「分散メモリ型並列計算機」では使えない = 大規模な計算機で利用できない 24 1つのメインメモリを複数のCPUコアで共有 ◦ マルチCPUコアのPC等 CPU コア CPU コア CPU コア CPU コア CPU コア CPU コア メインメモリ CPUコアからメインメモリへの経路が共有 ⇒ 規模(=CPUコア数)に限界 25 複数の独立したメインメモリで構成 CPU コア CPU コア メイン メモリ CPU コア CPU コア CPU コア メイン メモリ CPU コア メイン メモリ CPU コア CPU コア メイン メモリ ネットワーク 規模に応じて経路の数も増加 ⇒ 大規模化が比較的容易 26 分散メモリ型並列計算機における並列処理に必要 プロセス並列 独立した記憶空間をもつ「プロセス」を 単位とした並列処理 27 処理だけでなくデータも分割 プロセス0 A 0 ... プロセス1 24 A 0 ... プロセス2 24 A 24 B A ... 24 + + + + + C 0 B + + + + + + + + + + + + + + + C ... = = = = = B 0 プロセス3 = = = = = = = = = = = = = = = B C 各プロセスが 別の配列を 利用 C double A[25],B[25],C[25]; double A[25],B[25],C[25]; ... ... for (i=0;i<25;i++) double A[25],B[25],C[25]; double A[25],B[25],C[25]; (i=0;i<25;i++)... A[i] = B[i] +for C[i]; ... A[i] = B[i] + for C[i]; (i=0;i<25;i++) プロセス0 (i=0;i<25;i++) A[i] = B[i] +for C[i]; プロセス1 A[i] = B[i] + C[i]; プロセス2 プロセス3 28 他のプロセスのデータは直接参照できない 必要に応じてプロセス間通信 プロセス0 A 受信 プロセス1 A プロセス2 A プロセス3 A 送信 ネットワーク 29 並列プログラム用に用意された通信関数群の定義 例) プロセス0からプロセス1にデータを転送 MPI_Comm_rank(MPI_COMM_WORLD, &myid); ... if (myid == 0) MPI_Send(&(a[5]), 1, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); if (myid == 1) MPI_Recv(&(a[3]), 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); 自分のプロセス番号を取得 プロセス1に送信 プロセス0から受信 30 利用可能な並列化手段 共有メモリ型 分散メモリ型 自動並列化、 OpenMP MPI ○ × ○ ○ MPIプログラムは、 作るのに苦労するがどこでも実行できる 31 利点: 理論的な性能は、比較的容易に向上 ◦ 極端な話,単純に数を増やせば向上する 欠点: 実質的な性能向上には工夫が必要 ◦ 並列プログラムの作成 計算の分担 データの分割 計算結果の通信 ◦ 並列処理のための時間増加 他のCPUとの同期待ちや通信 スーパーコンピュータの構成は、 今のところ分散メモリ型並列計算機 32 スーパーコンピュータの構造 スーパーコンピュータのネットワーク 最新のスーパーコンピュータ事情 他の通信に邪魔されたくない ⇒ congestion (通信路の競合)が発生しにくい形状 数万~数十万ノードを接続したい ⇒ link や router がノード数に対して爆発的に 増えない形状 topology (= ネットワークの形状)が重要 一本の Busを全ノードで共有。両端をつなげたものが Ring ◦ CPU内のコア間接続等で使用。 構成が簡単なので bandwidth を大きく、latencyを 低くできる。 link と routerの数はノード数と同じなので理想的。 全ての通信が同じlinkを共有するのでcongestion が頻発。 大規模並列計算機では、まったく使い物にならない 全ノード間で、congestion 無し、低 latency の通信 を実現。 linkの数や、ノード毎の routerの規模が、ノード数に 応じて爆発的に増加。 大規模並列計算機では、まったく使い物にならない 行列上の switchを介して全ノードを接続 互いに独立した通信であれば congestion 無し ◦ 独立した通信 = 送信ノードも受信ノードも別である通信 ノード数 N の2乗に比例した link と router 多段の crossbar switch による木構造で構成 上位層の link と switch を増やすことにより 単純な木構造よりも congestion を低減 Crossbar に比べ、link数は削減できるが、 congestionは増加 多次元の格子状にノードを配置し、隣接ノード間を直 接接続 ノード数 N に比例した link数 通信のパターンによっては congestionが頻発 多段全対全結合 DragonFly 出典: http://www.unixer.de/publications/img/ibm-percs-network.pdf 出典: http://research.google.com/pubs/archive/35154.pdf スーパーコンピュータの構造 スーパーコンピュータのネットワーク 最新のスーパーコンピュータ事情 より高い性能のスーパーコンピュータを持つ 計算技術の向上 ◦ 汎用の計算機への応用 ◦ ソフトウェア効率化の推進 経済的な競争力の向上: ◦ ◦ ◦ ◦ 創薬 新素材の開発 気候予測 製品設計 etc. 「計算機の性能」とは? 一般に1秒間に実行できる演算の数 = OPS (Operations Per Second) 特に実数計算(Floating Operation)の性能の場合 = FLOPS (FLoating Operations Per Second) FLOPSの計算式: 理論演算性能 = システム全体のプロセッサコア数 x プロセッサコアの周波数 x コア内の同時実行可能実数演算数 ◦ 例えば 4演算同時実行可能な1GHzのコア 1000個のシステム ⇒ 4000GFLOPS = 4TFLOPS G: Giga, T: Tera(=1000G), P: Peta(=1000T), E: Exa(=1000P) 理論演算性能: 全ての演算器が休むことなく働き続けることが前提 実際のプログラム: 様々な要因で演算器が休止 ◦ メモリからのデータ到着待ち ◦ 他のプロセスの計算完了待ち プロセス間の負荷の不均衡 ◦ 通信の完了待ち ◦ ファイル入出力待ち 理論演算性能による比較は、ほとんど意味が無い プログラムによって傾向が変わる。 例えば。。。 ◦ 行列の連続した要素に対する計算: ベクトルプロセッサが圧倒的に高速 ◦ 不規則なメモリアクセスを行う計算: スカラープロセッサが高速 ◦ たくさんのプロセッサに分担させることができる計算: 大規模並列計算機の効果大 どのプログラムを使って比較するか? スーパーコンピュータの性能比較サイト http://www.top500.org ◦ 稼働中のスーパーコンピュータの上位500台を掲載。 ◦ 自己申告制 LINPACKベンチマークプログラムを使用 ◦ NxNの連立一次方程式の求解計算における実数演算数 2N3 を 所要時間で割った FLOPS値で比較。 ◦ Nは任意に決めてよい。 ◦ 十分大きな N では理論演算性能に比較的近い性能が出やすい。 キャッシュヒット率が高い、通信が少ない、負荷が均等 他の計算機との比較や傾向の分析などが容易 ◦ 1993年からほとんど同じ条件で更新を継続。 ◦ 世界中のほぼ全てのスーパーコンピュータが登録。 スーパーコンピュータ開発競争に利用 35 TFLOPS (Tera Floating Operations Per Second) = 1秒あたりの 35兆回の実数計算 ◦ 断トツの 1位 ◦ 2位から10位までの計算機の演算性能の合計を上回る性能(2002 年6月時点) “Computenik” = 「計算機分野でのスプートニクだ!」 (in New York Times) ◦ by Jack Dongarra教授 テネシー大学教授、Top500サイトの創始者 米国の開発意欲に火を付けた 47 IBM Blue Gene/L (2004年11月~) http://www.research.ibm.com/bluegene/ ◦ 70TFLOPS ちなみに地球シミュレータ(35TFLOPS)は3位に後退 ◦ 「まだ完成形ではない」: 2005年前半に、さらに4倍高速化する計画 日本のすべてのスーパーコンピュータを かき集めても追いつかない規模になる 48 IBM Blue Gene/L (2005年11月) ◦ 理論最高性能 280TFLOPS 世界で初めて 100TFLOPSを越えた計算機 地球シミュレータは7位に後退 ◦ 本当に日本のすべてのスーパーコンピュータを かき集めても追いつかない規模に 世界500位に入った計算機の性能の国別合計: 1位 米国 68.3% 2位 日本 5.68 % 3位 イギリス5.41% 4位 ドイツ 3.10% 5位 中国 2.59% 以下、 オーストラリア、スイス、オランダ、韓国、… 49 ~2010年6月 米国の時代 ◦ 2004~2007 IBM BlueGene/L 478 TFLOPS ◦ 2008 IBM RoadRunner 1.1 PFLOPS ◦ 2009~2010.6 Cray Jaguar 1.8 PFLOPS 2010年11月 中国の台頭 ◦ 2010.11 中国 Tianhe-1A 2.6 PFLOPS 日本勢は東京工業大学のTSUBAME2.0が 1.2 PFLOPSで4位 50 1位 K computer(日本) 2位 Tianhe-1A (中国) 3位 Jaguar(米国) 国別合計: 1位 2位 3位 4位 5位 米国 42.87% 日本 18.98% 中国 12.11% ドイツ 5.50% フランス 5.40% 8.2 PFLOPS 2.6 PFLOPS 1.8 PFLOPS (25.3 PFLOPS) (11.2 PFLOPS) ( 7.1 PFLOPS) ( 3.2 PFLOPS) ( 3.2 PFLOPS) ◦ 以下,英国,ロシア,韓国,カナダ,... 51 1位 K computer(日本) 2位 Tianhe-1A (中国) 3位 Jaguar(米国) 10.5 PFLOPS 2.6 PFLOPS 1.8 PFLOPS 国別合計: 1位 2位 3位 4位 5位 米国 42.8% (31.7 PFLOPS) 日本 19.2% (14.2 PFLOPS) 中国 14.2% (10.4 PFLOPS) フランス 5.1% ( 3.7 PFLOPS) ドイツ 4.9% ( 3.6 PFLOPS) ◦ 以下,英国,カナダ,ロシア,韓国,... 52 理化学研究所と富士通が開発 http://www.aics.riken.jp ◦ 当初の目標: 出典: http://www.nsc.riken.jp/K/diary.html 2012年までに毎秒1京回の計算(=10PFLOPS) が可能な計算機を開発する ◦ 例えば... 1km平方で分割したアジア域の雲解像モデル解析(24時間 分)を 1分で計算 地球シミュレータでは 12時間必要 53 世界最大規模 低消費電力 高信頼性 ◦ 約8万ノード x 8CPUコア=約64万CPUコア ◦ 128GFLOPS / 58W ◦ 水冷方式 ◦ エラー検出、訂正機能 SPARC64TM VIIIfxチップ 高速ネットワーク ◦ 6次元トーラス ◦ 少ない結線数で全体を 接続 ◦ 1台壊れても別ルートを 使って運転を継続 Tofu インターコネクトネットワーク 出典: http://www.ssken.gr.jp/MAINSITE/download/newsletter/2011/20110825-sci-1/lecture-5/ppt.pdf 54 階層構造: ◦ 小~中規模の共有メモリ型並列計算機か マルチコア計算機で分散メモリ型並列計算機を構成 CPU CPU ... CPU メモリ CPU CPU メモリ ... CPU CPU CPU ... CPU ... メモリ CPU CPU ... CPU メモリ 地球シミュレータ BlueGene/L 京 CPUあたりのコア数 1 1 8 ノード当たりCPU数 8 2 1 640 65,536 約8万 ノード数 55 地球シミュレータ: ベクトルプロセッサ BlueGene/L, 京: スカラープロセッサ 2011年11月時点で、ベクトルプロセッサは 地球シミュレータ2の1台のみ ベクトルからスカラーへ 56 特定の計算を高速化 特に最近はグラフィックプロセッサの 科学技術計算用途への流用に注目: GPGPU (General Purpose GPU) ◦ PC用のGPUカードを使用 ◦ 2位(中国)、4位(米国)、5位(日本 東工大)で NVIDIAのGPU搭載 安価かつ低消費電力で性能を大幅に向上 57 実は基本的なグラフィック計算の主要部分は 連続領域に対する演算の繰り返し ◦ ベクトルプロセッサの得意な計算と同じ 基本構造がベクトルプロセッサとほぼ同じ 58 グラフィック処理に特化した簡略化 ◦ メモリ量を制限 1〜2GB程度 ◦ 演算の種類を制限 主に加算,乗算の性能重視 除算,平方根等はソフトウェアで計算 複雑な処理は不可 スケールメリット ◦ ほとんどのPCに搭載 59 例) NVIDIA Tesla C2075 演算性能(単精度) 1.03 TFLOPS 演算性能(倍精度) 515 GFLOPS GPUメモリ容量 消費電力 価格 6GB 215W 22万円前後 地球シミュレータの 1/80 の性能 地球シミュレータの 1/30000 の電力 地球シミュレータの 1/200000 の価格 60 メモリからアクセラレータのメモリへのデータ転送が遅い ◦ Tesla C2015で 515GFLOPSに対して 8GB/sec アクセラレータ上のメモリへのアクセスは 144GB/sec ◦ NECのベクトルプロセッサは ◦ 京のスカラープロセッサは 100GFLOPSに対して 256GB/sec 128GFLOPSに対して 64GB/sec 性能に対するメモリ量が少ない ◦ Tesla C2015で 515GFLOPS に対して 6GB ◦ NECのベクトルプロセッサは 100GFLOPS に対して 64GB ◦ 京のスカラープロセッサは 128GFLOPSに対して 16GB プログラムが複雑 ◦ ホストPC側とアクセラレータ側双方のプログラム ◦ データの移動も全てプログラムに明記 性能を活かすためには高度なチューニングが必要 地球シミュレータ BlueGene/L 京 総理論演算性能 (TFLOPS) Linpack性能 (TFLOPS) 実効性能比 電力 電力対実効性能 TFLOPS/MW 導入コスト TSUBAME2.0 40 367 8773 2287 35.8 280.6 8162 1192 89.5% 6MW 76.5% 0.2MW 93.0% 10MW 52.1% 1MW 5.96 1400 816 1192 500億円 $1億 1200億円 32億円 電力あたりの性能は高いが、実効性能比が低い 62 プログラムの対応 計算の大規模化への対応 ◦ GPGPUは連続単純計算が得意 ◦ メモリが小さいので,複数のGPGPU間で 通信しながらの分散並列処理 科学技術計算向け拡張部分のビジネスモデル ◦ ゲームに必要ない部分(倍精度実数演算等)に どのくらい費用と時間をかけることが出来るか? 63 膨大な開発費: 京の場合,7年間で約1,200億円 ◦ 事業仕分けでの指摘 「2番じゃダメなんですか?」 次の目標: 2018年に 1 Exa FLOPS を達成 (1 Exa = 1,000 Peta) ◦ 予算は??? 64 富士通: 京の商用機発表 http://www.hpcwire.com/hpcwire/2011-1107/fujitsu_unveils_post-k_supercomputer.html NEC: SX-9後継のベクトル計算機開発計画を発表 http://www.perfect-abs.info/news/Vector-Processor.html IBM: BlueGene/Q で 100PFLOPSを狙う http://www.theregister.co.uk/2011/11/16/ibm_bluegene_q_po wer_775/ Cray: Blue Water http://wjbc.com/cray-replaces-ibm-on-u-of-illinoissupercomputer/ Barcelona Supercomputing Center: Tegra + GPGPUでスーパーコンピュータ開発 http://latimesblogs.latimes.com/technology/2011/11/nvidiasupercomputer.html 中国: 自国製CPU ShenWey SW1600 http://www.hpcwire.com/hpcwire/2011-1101/china_s_indigenous_supercomputing_strategy_bears_first_fru it.html PCAST (President’s Council of Advaisors on Science and Technology) の指摘 http://insidehpc.com/2010/12/22/pcast-report-supercomputing-arms-race-maybe-the-wrong-path-forward/ “an arms race that is very expensive and may not be a good use of funds.” ゲームのルールが変わる可能性 HPC Challenge http://icl.cs.utk.edu/hpcc/ ◦ 複数の部門でそれぞれ順位づけ Linpack, Matrix Multiply, Memory Bandwidth, Matrix Transpose, Random Access, Fast Fourier Trans, Communication Bandwidth and Latency Graph500 http://www.graph500.org ◦ 組み合わせ最適化問題の計算性能比較 Green500 http’//www.green500.org ◦ Top500の性能を消費電力で割った電力対性能比を比較 Gordon Bell賞 ◦ 実プログラムでの性能競争 ◦ 2011年: 京を用いたシリコンナノワイヤのシミュレーション で理化学研究所、筑波大、東大、富士通のチームが受賞 http://ajw.asahi.com/article/economy/biz_briefs/AJ 201111180034 東工大もTSUBAME2.0を用いた新素材形成のシミュレーション で特別賞を受賞 http://cloud.watch.impress.co.jp/docs/news/2011111 8_492092.html 米国 http://www.exascale.org ヨーロッパ http://www.prace-project.eu 日本 http://www.open-supercomputer.org/workshop/purpose.html 予算が問題 http://sankei.jp.msn.com/politics/news/111116/plc11111611240003-n1.htm
© Copyright 2024 ExpyDoc