チャネルの動的On/Off制御のための 先読みルータアーキテクチャ 松谷 宏紀 (慶大) 鯉渕 道紘 (NII) 王 代涵 (慶大) 天野 英晴 (慶大)
Network-on-Chip (NoC) タイルアーキテクチャ プロセッサコア Network-on-Chip (NoC) NoC アーキテクチャ ネットワークトポロジ パケットルーティング オンチップルータ Core Router タイルアーキテクチャ例 (16-core)
代表的な NoC アーキテクチャ システム名 トポロジ ルーティング スイッチング フロー制御 MIT RAW 2-D mesh (32bit) XY DOR WH, no VC Credit UPMC SPIN Fat Tree (32bit) Up*/down* QuickSilver ACM H-Tree (32bit) 1-flit, no VC UMass Amherst aSOC 2-D mesh Shortest-path Pipelined CS, no VC Timeslot Sun T1 Crossbar (128bit) - Handshake Cell BE EIB Ring (128bit) TRIPS (operand) 2-D mesh (109bit) YX DOR On/off TRIPS (on-chip) 2-D mesh (128bit) WH, 4 VCs Intel SCC 2-D torus (32bt) XY,YX DOR, odd-even TM Stall/go Intel Teraflops NoC Source routing WH, 2 lanes TILE64 iMesh
Network-on-Chip (NoC) タイルアーキテクチャ プロセッサコア Network-on-Chip (NoC) NoC アーキテクチャ ネットワークトポロジ パケットルーティング オンチップルータ NoC のリーク電力を 減らしたい Core Router タイルアーキテクチャ例 (16-core) ルータのリーク電力を減らすため,ルータにパワーゲーティングを施す
オンチップルータ: パワーゲーティング チャネル (FIFO) への電力供給を On/Off パケットが無ければ スリープ [松谷,ASPDAC’08] チャネル (FIFO) への電力供給を On/Off パケットが無ければ スリープ パケットが来たら ウェイクアップ [松谷,NOCS’08] ARBITER X+ X+ sleep X- X- sleep Y+ Y+ sleep Y- Y- sleep 5x5 XBAR CORE CORE sleep
オンチップルータ: パワーゲーティング チャネル (FIFO) への電力供給を On/Off パケットが無ければ スリープ [松谷,ASPDAC’08] チャネル (FIFO) への電力供給を On/Off パケットが無ければ スリープ パケットが来たら ウェイクアップ [松谷,NOCS’08] ARBITER X+ X+ sleep X- X- sleep Y+ Y+ Y- Y- sleep 5x5 XBAR CORE CORE sleep
ただし, 動的なスリープ制御によって性能のオーバヘッドが生じる オンチップルータ: パワーゲーティング [松谷,ASPDAC’08] チャネル (FIFO) への電力供給を On/Off パケットが無ければ スリープ パケットが来たら ウェイクアップ [松谷,NOCS’08] ARBITER X+ X+ sleep X- X- sleep sleep Y+ Y+ Y- Y- sleep 5x5 XBAR CORE CORE sleep ただし, 動的なスリープ制御によって性能のオーバヘッドが生じる
本研究では,様々な NoCに“先読みによるパワーゲーティング”を適用 パワーゲーティング: 性能オーバヘッド チャネルの動的 On/Off 履歴などに基づきチャネルの電源を On/Off バッファの部分的 PG 大きなバッファの一部を常にアクティブ Slow-silent VCs 仮想チャネル (VC) 単位の PG Look-ahead ルータ 2個前のルータがパケット到着を予め通知 Dimension-order routing(固定型) のみを対象 [松谷,ASPDAC’08] [松谷,NOCS’08] [Chen,ISLPED’03] [Soteriou,TPDS’07] ウェイクアップ遅延 スリープ中のチャネルにパケットが到達 手前のルータで待たされ, パイプラインストール発生 例) Intel’s 80-tile の FPMAC は 6-cycle [Vangal,ISSCC’07] ARBITER ウェイクアップするまで待たされる X+ X+ sleep X- X- sleep Y+ Y+ sleep Y- Y- sleep 5x5 XBAR CORE CORE sleep 本研究では,様々な NoCに“先読みによるパワーゲーティング”を適用
発表の流れ Network-on-Chip (NoC) 既存の NoC アーキテクチャ 先読み NoC アーキテクチャ 評価 ルータのパワーゲーティング 既存の NoC アーキテクチャ トポロジ, ルーティング ルータアーキテクチャ 先読み NoC アーキテクチャ 固定型ルーティングの場合 適応型ルーティングの場合 評価 制御信号の複雑さ 通信遅延とスループット性能 Wakeup!
既存の NoC アーキテクチャ 本発表では2次元メッシュを対象 システム名 トポロジ ルータ 計算コア ルーティング スイッチング フロー制御 MIT RAW 2-D mesh (32bit) XY DOR WH, no VC Credit UPMC SPIN Fat Tree (32bit) Up*/down* QuickSilver ACM H-Tree (32bit) 1-flit, no VC UMass Amherst aSOC 2-D mesh Shortest-path Pipelined CS, no VC Timeslot Sun T1 Crossbar (128bit) - Handshake Cell BE EIB Ring (128bit) TRIPS (operand) 2-D mesh (109bit) YX DOR On/off TRIPS (on-chip) 2-D mesh (128bit) WH, 4 VCs Intel SCC 2-D torus (32bt) XY,YX DOR, odd-even TM Stall/go Intel Teraflops NoC Source routing WH, 2 lanes TILE64 iMesh
既存の NoC : ルーティングの分類 固定型ルーティング ランダム型ルーティング 適応型ルーティング Source-destination 間の経路は1つに固定 ランダム型ルーティング Source-destination 間に複数の経路 ランダムに1つを選択 適応型ルーティング 混雑に応じて1つを選択 X方向 Y方向 例) 次元順ルーティング
既存の NoC : ルーティングの分類 固定型ルーティング ランダム型ルーティング 適応型ルーティング Source-destination 間の経路は1つに固定 ランダム型ルーティング Source-destination 間に複数の経路 ランダムに1つを選択 適応型ルーティング 混雑に応じて1つを選択 例) West-first, Negative-first, North-last, Odd-even, Opt-y, DP
既存の NoC : West-first routing 固定型ルーティング Source-destination 間の経路は1つに固定 ランダム型ルーティング Source-destination 間に複数の経路 ランダムに1つを選択 適応型ルーティング 混雑に応じて1つを選択 NW SW West-first の禁止ターン
既存の NoC : North-last routing 固定型ルーティング Source-destination 間の経路は1つに固定 ランダム型ルーティング Source-destination 間に複数の経路 ランダムに1つを選択 適応型ルーティング 混雑に応じて1つを選択 NW NE North-last の禁止ターン
既存の NoC : Negative-first routing 固定型ルーティング Source-destination 間の経路は1つに固定 ランダム型ルーティング Source-destination 間に複数の経路 ランダムに1つを選択 適応型ルーティング 混雑に応じて1つを選択 NW ES Negative-first の禁止ターン
既存の NoC : Odd-even turn-model 偶数列か奇数列かによって禁止ターン違う 固定型ルーティング Source-destination 間の経路は1つに固定 ランダム型ルーティング Source-destination 間に複数の経路 ランダムに1つを選択 適応型ルーティング 混雑に応じて1つを選択 ES EN Odd-even (偶数列) の禁止ターン NW SW Odd-even (奇数列) の禁止ターン
既存の NoC : Opt-y routing (1/3) 固定型ルーティング Source-destination 間の経路は1つに固定 ランダム型ルーティング Source-destination 間に複数の経路 ランダムに1つを選択 適応型ルーティング 混雑に応じて1つを選択 Fully adaptive routing 仮想チャネル (VC)を用い, 任意のターンを許可 NS方向に VC 2本 WS NW SW WN NS方向に仮想チャネル0を使う場合 (※) 点線のターンは「これ以上 West方向に進まないとき」のみ許可
既存の NoC : Opt-y routing (2/3) 固定型ルーティング Source-destination 間の経路は1つに固定 ランダム型ルーティング Source-destination 間に複数の経路 ランダムに1つを選択 適応型ルーティング 混雑に応じて1つを選択 Fully adaptive routing 仮想チャネル (VC)を用い, 任意のターンを許可 NS方向に VC 2本 NS方向に仮想チャネル1を使う場合 (※) 点線のターンは「これ以上 West方向に進まないとき」のみ許可
既存の NoC : Opt-y routing (3/3) 固定型ルーティング Source-destination 間の経路は1つに固定 ランダム型ルーティング Source-destination 間に複数の経路 ランダムに1つを選択 適応型ルーティング 混雑に応じて1つを選択 Fully adaptive routing 仮想チャネル (VC)を用い, 任意のターンを許可 NS方向に VC 2本 N1 N0 S1 S0 N0 N1 S0 S1 NS方向の仮想チャネル番号切替え (※) 点線のターンは「これ以上 West方向に進まないとき」のみ許可
既存の NoC : 固定型ルーティング・ルータ 衝突しなければ 3 cycle でヘッダがルータを通過 RC (Routing Computation) VSA (Virtual Channel / Switch Allocation) ST (Switch Traversal) 例) ルータ(a) からルータ(c) にパケットを転送 (1) 出力チャネルの候補は1つだけ @ROUTER A @ROUTER B @ROUTER C HEAD RC VSA ST RC VSA ST RC VSA ST DATA 1 SA ST SA ST SA ST (2) その出力チャネルに対してアービトレーション DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST 1 2 3 4 5 6 7 8 9 10 11 12 出力チャネルは1つに固定 2ホップ先のチャネルを正確に予測可能 ヘッダがルータ(a)に注入され, データ3がルータ(c)を通過するまで12サイクル ELAPSED TIME [CYCLE]
既存の NoC : 適応型ルーティング・ルータ 衝突しなければ 3 cycle でヘッダがルータを通過 RC (Routing Computation) VSA (Virtual Channel / Switch Allocation) ST (Switch Traversal) 例) ルータ(a) からルータ(c) にパケットを転送 (1) 出力チャネルの候補は複数個ある (2) Output selection function (OSF) @ROUTER A @ROUTER B @ROUTER C HEAD RC VSA ST RC VSA ST RC VSA ST DATA 1 SA ST SA ST SA ST (3) その出力チャネルに対してアービトレーション DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST 1 2 3 4 5 6 7 8 9 10 11 12 1ホップ先で動的に経路が変わる 2ホップ先を予測することは無理 ヘッダがルータ(a)に注入され, データ3がルータ(c)を通過するまで12サイクル ELAPSED TIME [CYCLE]
発表の流れ Network-on-Chip (NoC) 既存の NoC アーキテクチャ 先読み NoC アーキテクチャ 評価 ルータのパワーゲーティング 既存の NoC アーキテクチャ トポロジ, ルーティング ルータアーキテクチャ 先読み NoC アーキテクチャ 固定型ルーティングの場合 適応型ルーティングの場合 評価 制御信号の複雑さ 通信遅延とスループット性能 Wakeup!
先読み NoC : 固定型ルーティング (1/3) 先読み (look-ahead) 型ルータ NRC (Next routing computation) VSA (Virtual channel / switch allocation) ST (Switch traversal) NRC: 次ルータのRCを実行 (自ルータのRCは手前のルータに任せる) ルータ(b)の出力ポートはルータ(a)が決め,ルータ(c)の出力ポートはルータ(b)が… @ROUTER A @ROUTER B @ROUTER C HEAD NRC VSA ST NRC VSA ST NRC VSA ST DATA 1 SA ST SA ST SA ST DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST 1 2 3 4 5 6 7 8 9 10 11 12 1ホップ先の出力チャネルを計算 2ホップ先の入力チャネルが判明 ELAPSED TIME [CYCLE]
先読み NoC : 固定型ルーティング (2/3) Wakeup-0 型: 配線遅延が小さいとき ルータ i の NRC で, ルータ (i+2) を wakeup s段パイプラインのとき, (2s-1) サイクル前に wakeup 開始可 Wakeup-1 型: 配線遅延が大きいとき ルータ i の VSA で, ルータ (i+2) を wakeup s段パイプラインのとき, (2s-2) サイクル前に wakeup 開始可 Wakeup-0 @ROUTER A @ROUTER B @ROUTER C HEAD NRC VSA ST NRC VSA ST NRC VSA ST Wakeup-1 DATA 1 SA ST SA ST SA ST DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST 1 2 3 4 5 6 7 8 9 10 11 12 ELAPSED TIME [CYCLE]
先読み NoC : 固定型ルーティング (3/3) 2ホップ先にwakeup信号 Node degree d トポロジ 信号は何本必要か? ルータ当たり d(d-1)^2 本 [松谷,ASPDAC’08]
先読み NoC : 固定型ルーティング (3/3) 2ホップ先にwakeup信号 Node degree d トポロジ 次元順ルーティング 信号は何本必要か? Node degree d トポロジ チャネル当たり (d-1)^2本 ルータ当たり d(d-1)^2 本 次元順ルーティング 禁止ターンがたくさんある 実際には何本必要か? チャネル当たり 1本 (N/S) チャネル当たり 5本 (E/W) ルータ当たり 12本 [松谷,ASPDAC’08] E/W方向への移動 N/S方向への移動
先読み NoC : 適応型ルーティング (1/6) 先読み (look-ahead) 型ルータ NRC (Next routing computation) VSA (Virtual channel / switch allocation) ST (Switch traversal) NRC: 次ルータのRCを実行 (自ルータのRCは手前のルータに任せる) ルータ(b)の出力ポートはルータ(a)が決め,ルータ(c)の出力ポートはルータ(b)が… @ROUTER A @ROUTER B @ROUTER C HEAD NRC VSA ST NRC VSA ST NRC VSA ST DATA 1 SA ST SA ST SA ST DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST 1 2 3 4 5 6 7 8 9 10 11 12 1ホップ先の出力チャネルを計算 2ホップ先の入力チャネルが判明 ELAPSED TIME [CYCLE]
先読み NoC : 適応型ルーティング (2/6) Wakeup-0 型: 配線遅延が小さいとき ルータ i の NRC で, ルータ (i+2) を wakeup s段パイプラインのとき, (2s-1) サイクル前に wakeup 開始可 Wakeup-1 型: 配線遅延が大きいとき ルータ i の VSA で, ルータ (i+2) を wakeup s段パイプラインのとき, (2s-2) サイクル前に wakeup 開始可 Wakeup-0 @ROUTER A @ROUTER B @ROUTER C HEAD NRC VSA ST NRC VSA ST NRC VSA ST Wakeup-1 DATA 1 SA ST SA ST SA ST DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST 1 2 3 4 5 6 7 8 9 10 11 12 ELAPSED TIME [CYCLE]
先読み NoC : 適応型ルーティング (3/6) 適応型ルーティングにおける 2 ホップ先読み ルータ (i+1) がどの出力チャネルを選ぶか予測する Next output selection function (Next OSF) ルータ i がルータ (i+1) になったつもりで ルータ (i+1) の output selection function を実行 @ROUTER A @ROUTER B @ROUTER C HEAD NRC VSA ST NRC VSA ST NRC VSA ST DATA 1 SA ST SA ST SA ST (1) NRC: 次ルータになったつもりで出力チャネルを計算 候補は複数個出る DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST (2) Next OSF: 次ルータになったつもりで OSF を実行 1 2 3 4 5 6 7 8 9 10 11 12 ELAPSED TIME [CYCLE]
先読み NoC : 適応型ルーティング (3/6) Stateless 型: スループットが低い Stateful 型: スループットが高い ルータ (i+1) の出力チャネルの集合を O とする O のうち,宛先に最短で到達できるチャネル集合を O’ とする O’ の中からランダムに選択 Stateful 型: スループットが高い O’ のうち, 現在 busy でない出力チャネルの集合 O’’ とする O’’ の中からランダムに選択 @ROUTER A @ROUTER B @ROUTER C HEAD NRC VSA ST NRC VSA ST NRC VSA ST DATA 1 SA ST SA ST SA ST (1) NRC: 次ルータになったつもりで出力チャネルを計算 候補は複数個出る DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST (2) Next OSF: 次ルータになったつもりで OSF を実行 1 2 3 4 5 6 7 8 9 10 11 12 ELAPSED TIME [CYCLE]
先読み NoC : 適応型ルーティング (4/6) 適応型ルーティングにおける 2 ホップ先読み ルータ i がルータ (i+1) の出力チャネルを Next OSF する パケットがルータ i から (i+1) に移動するまでのタイムラグ ルータ i の Next OSF 結果が最良とは限らない パケットがルータ (i+1) に到達するまでに, busy になっているかもしれない @ROUTER A @ROUTER B @ROUTER C HEAD NRC VSA ST NRC VSA ST NRC VSA ST DATA 1 SA ST SA ST SA ST (1) NRC: 次ルータになったつもりで出力チャネルを計算 候補は複数個出る DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST (2) Next OSF: 次ルータになったつもりで OSF を実行 1 2 3 4 5 6 7 8 9 10 11 12 ELAPSED TIME [CYCLE]
先読み NoC : 適応型ルーティング (4/6) Inflexible 型: スループットが低い ルータ (i+1) はルータ i が選択した出力チャネルを必ず使う Flexible 型: スループットが高い ルータ (i+1) はルータ i が選択した出力チャネルが busy なら 別の出力チャネルを利用できる @ROUTER A @ROUTER B @ROUTER C HEAD NRC VSA ST NRC VSA ST NRC VSA ST DATA 1 SA ST SA ST SA ST DATA 2 SA ST SA ST SA ST DATA 3 SA ST SA ST SA ST 1 2 3 4 5 6 7 8 9 10 11 12 ELAPSED TIME [CYCLE]
先読み NoC : 適応型ルーティング (5/6) Inflexible 型: スループットが低い ルータ (i+1) はルータ i が選択した出力チャネルを必ず使う Flexible 型: スループットが高い ルータ (i+1) はルータ i が選択した出力チャネルが busy なら 別の出力チャネルを利用できる 予めウェイクアップしたチャネルとは別のチャネルを使うことになる ウェイクアップ遅延, パワースイッチ On/Off エネルギーの無駄では? 別チャネルをウェイクアップさせるオーバヘッドは小さい 予めウェイクアップしたチャネル CH0 が busy 他のパケットが占有中 CH0 が free になるのを待つより,別チャネルを起こしたほうが良い 予めウェイクアップさせるのに要した電力は無駄にならない 予めウェイクアップしたチャネル CH0 が busy 他のパケットが占有中 CH0は別パケットによって使われているので,起こしても無駄ではなかった
先読み NoC : 適応型ルーティング (6/6) 2ホップ先にwakeup信号 Node degree d トポロジ 信号は何本必要か? Node degree d トポロジ チャネル当たり (d-1)^2本 ルータ当たり d(d-1)^2 本 Opt-y ルーティング 禁止ターンがない 何本必要か? チャネル当たり 7本 (N/S) チャネル当たり 7本 (E/W) ルータ当たり 28本 [松谷,ASPDAC’08] E/W方向への移動 N/S方向への移動
先読み NoC : 適応型ルーティング (6/6) West-first ルーティング 実際には何本必要か? 禁止ターンがある ルータ当たり 20本 N方向への移動 S方向への移動 (※) 他の turn-model では wakeup 信号の配線パターンは異なるが,本数は同じ W方向への移動 E方向への移動
発表の流れ Network-on-Chip (NoC) 既存の NoC アーキテクチャ 先読み NoC アーキテクチャ 評価 ルータのパワーゲーティング 既存の NoC アーキテクチャ トポロジ, ルーティング ルータアーキテクチャ 先読み NoC アーキテクチャ 固定型ルーティングの場合 適応型ルーティングの場合 評価 制御信号の複雑さ 通信遅延とスループット性能 Wakeup!
評価: 制御信号の複雑さ (1/2) Wakeup 信号 2ホップ先に送信 ネットワークで全体で制御信号は何本必要か? E/W方向への移動 N/S方向への移動 表: 様々なネットワークサイズにおける wakeup 信号の数 k x k 4 x 4 8 x 8 16 x 16 Dimension-order 12k^2 100 580 2,692 West-first 20k^2 170 970 4,490 Opt-y 28k^2 240 1,360 6,288 (※) West-first, North-last, Negative-first, Odd-even はすべて一緒
評価: 制御信号の複雑さ (2/2) k x k メッシュの配線量 L = 4w * k (k-1) * l w: リンク幅 (例えば,データ幅 64-bit + 制御信号 4-bit) l: 隣接ルータ間距離 (例えば, 1mm) 先読み機構による配線量の増加量 (p はwakeup 信号の数) Stateless 型は (2p * l), Stateful 型は (4p * l) 増える 表: 先読み機構 (wakeup 信号, nbusy 信号) による配線量の増加量 Next OSF 4 x 4 8 x 8 16 x 16 Dimension-order stateless 6.1% 7.6% 8.2% West-first 10.4% 12.7% 13.8% Opt-y 14.7% 17.9% 19.3% stateful 20.8% 25.5% 27.5% 29.4% 35.7% 38.5% Stateful型でルーティングのadaptivityが高くなると配線量が多くなる (※) West-first, North-last, Negative-first, Odd-even はすべて一緒
評価: 制御信号の配線遅延 wakeup信号の配線遅延 パイプライン段の遅延 目標 2ホップ分の距離 配線遅延が問題 15 FO4 (ハイエンド向け) 60 FO4 (組込み向け) 目標 トータルで 60 FO4 未満 NRC と Next OSF に 30 FO4 を消費 配線距離[mm] vs. 配線遅延[FO4] 90nm CMOS process, semi-global interconnect コア間距離が2mmなら,wakeup信号は4mm
評価: スループット性能 評価項目 ネットワークシミュレーション ウェイクアップ遅延の影響 先読み固定型ルーティング 先読み適応型ルーティングにおける flexible 型 先読み適応型ルーティングにおける stateful 型 ネットワークシミュレーション 8 x 8 mesh Uniform traffic (16-flit packet) Wormhole (4-flit buffer) 各種ルーティングのスループット性能がどれだけ落ちるか? ウェイクアップ遅延の影響をどれだけ隠蔽できるか? inflexible 型と flexible 型では性能差はどのくらいか? stateless 型と stateful 型では性能差はどのくらいか?
スループット: ウェイクアップ遅延の影響 Dimension-order (DOR) West-first (WF) No PG No PG PG (wakeup 4-cycle) West-first (WF) No PG PG (wakeup 4-cycle) -20.0% -16.7% スループット vs. 通信遅延 スループット vs. 通信遅延 ウェイクアップ遅延によって, 9.7% ~ 20.0%スループット性能が低下
スループット: 先読み固定型ルーティング Dimension-order (DOR) West-first (WF) No PG PG (wakeup 4-cycle) PG (wakeup 4-cycle + look-ahead) West-first (WF) No PG PG (wakeup 4-cycle) -20.0% -16.7% スループット vs. 通信遅延 スループット vs. 通信遅延 DOR (固定型) では, 先読みによってスループットの劣化を完全隠蔽
スループット: 先読み適応型 flexible 型 West first (WF) routing Inflexible(wake 4-cycle) Flexible (wake 4-cycle) Opt-y routing Original (wake 4-cycle) Flexible (wake 4-cycle) スループット vs. 通信遅延 スループット vs. 通信遅延 Inflexible型は性能劣化. Flexible型はほぼウェイクアップ遅延を隠蔽
スループット: 先読み適応型 stateful 型 West first (WF) routing Stateless(wake 4-cycle) Stateful (wake 4-cycle) Opt-y routing Stateless(wake 4-cycle) Stateful (wake 4-cycle) スループット vs. 通信遅延 スループット vs. 通信遅延 Uniform trafficでは両者に大差無し. 局所性があればStateful型有利
まとめ: 先読みルータアーキテクチャ ルータのパワーゲーティング 先読み固定型ルーティング 先読み適応型ルーティング 今後の課題 チャネル単位 ウェイクアップ遅延の影響 先読み固定型ルーティング ウェイクアップ遅延を完全に隠蔽 先読み適応型ルーティング Flexible 型によりウェイクアップ遅延をほぼ隠蔽 Stateless 型 vs. Stateful 型 今後の課題 ハードウェア実装 面積オーバヘッドの見積り Look-ahead ルーティングを応用 Wakeup!
ご清聴ありがとうございました