読者です 読者をやめる 読者になる 読者になる

ローグウェーブソフトウェアのブログ

開発をシンプルに 安全で高品質のコードを 素早くお客様のもとへ

並列デバッガ TotalViewの多様なインターフェースと使い方

ローグウェーブ ソフトウェアが開発、販売する並列デバッガTotalViewは、ステップ実行からメモリデバッグやリバースデバッグ、並列アプリケーションのデバッグなど多くの機能を備え、また多様な実行環境や開発環境に対応しています。それだけでなく、使いやすいGUIコマンドライン、バッチデバッグなど必要とされる場面に応じてさまざまな使用形態を用意しています。あまりに多いためマニュアルなどの説明で混乱することもあるかもしれません。この記事ではそれぞれの使用方法を紹介いたします。

www.roguewave.jp

0. TotalViewのGUICLIの関係

ユーザーズガイドでCLIを説明している章の冒頭に以下の図があります。 f:id:RWSJapan:20170313094457p:plain

About The CLI and TotalView

この図が示しているのは、TotalViewのGUIや(CLI)コマンドラインインターフェース、バッチデバッグといった様々なインターフェースは全てこの、本質的に単一のデバッグエンジンへのシェルとして機能しており、内部で行われていることは同一である、ということです。デバッグ対象のプログラムやプロセス、スレッドは全てこのデバッグエンジンによって制御、監視され、インターフェースの違いによって左右されることはありません。これを踏まえれば、以下の多様なインターフェースを用途に応じて自由に選ぶことができます。

1. GUI

基本的にユーザーがログインしているローカルのコンピュータ上で実行され、インタラクティブにコードや変数の状態を操作し観察することができます。デバッガに特化しているためIDE(統合開発環境)に比べて非常に少ないマウス操作で簡単に目的の機能を実現でき、また豊富に用意されているシングルキーショートカットでキーボードに手を置いたまま多くの機能を素早く利用することができます。 以下で説明する2種類のGUIが存在します。

1.1 従来のUI

f:id:RWSJapan:20170313104646p:plain 最も一般的なインターフェースです。おなじみのルートウィンドウとプロセスウィンドウを中心に、変数の内容を表示するVariable WindowやArray Viewer、MPIの通信や配列の内容をグラフ化する機能もあります。HPC向けに大量のプロセスやスレッドを柔軟に制御し監視できます。メモリデバッガMemoryScapeとも強く連携しており、様々なデバッグ機能を統一的に使うことができます。

1.2 次世代GUI (newUI)

f:id:RWSJapan:20170207121227p:plain

逐次実行あるいはそれほど大規模でない並列実行アプリケーションのデバッグに特化したGUIで、並列ステップ実行やリバースデバッグといったTotalViewの最も不可欠な機能を中心に、従来のUIから見やすさや使いやすさを大幅に向上させました。ドッキング可能なパネル、関数や変数の検索機能などが単一のウィンドウに収められ、ヘルプも製品に統合され、必要なときに必要な場所がすぐに参照できます。一連の動画でリバースデバッグやマルチスレッドデバッグなどの機能を紹介しています。

この新しいUIを使用する際には、TotalViewの新機能で紹介しているように、起動時に-newUIオプションをつけてください。

なお、この次世代UI部分だけ切り出したCodeDynamicsという製品名でも利用可能です。価格やライセンスの体系がTotalViewと異なります。ご興味のある方はご相談ください。

2. リモートディスプレイクライアント (RDC)

手元のWindowsMacLinuxのノートパソコンやデスクトップから、計算機サーバにSSHで接続し、GUI(上記の従来のGUI)でTotalViewを操作することができます。単純にX Windowsを転送するのに比べて高速で、また設定も容易かつ保存して再利用可能です。ローグウェーブのウェブサイトから自由にダウンロードして使うことができます。登録やライセンスは不要です。

3. CLI (コマンドラインインターフェース)

コマンドラインインタラクティブデバッグを行う方法です。

f:id:RWSJapan:20170313112114p:plain

日本語ドキュメンテーションにあるスタートガイドはTotalViewの使い方がコンパクトにまとまったおすすめの資料ですが、27ページ付近に記載されている通り、GUIを使った機能の説明の多くには対応するCLIコマンドの説明も付属しています。この記事の冒頭でご説明した通り、機能的には結局内部のエンジンで実行されていることは同一で、GUI経由で行うかCLI経由で行うか、は使いやすさのみに影響するのです。

日本語ドキュメントのTotalView CLIコマンドガイドには利用できる全てのCLIが一覧表(チートシート)になっていますので、手元に置いてお使いください。

3.1 GUIから起動

GUICLIか、の2者択一でなく、両方同時に使うこともできます。このやり方はプログラムの状態の見やすさというGUIの特性と柔軟で高速なキーボード操作、というCLIの利点を同時に活かすことができます。また、CLIを学習する際にもおすすめの方法です。例えばCLIブレークポイントを作成すると即座にGUIの画面に反映されます。ステップ実行も同様です。

従来のGUIではProcessウィンドウのメニューバーから Tools > Command Lineを選びます。新しいGUIではウィンドウ下部に最初から統合されています。機能はどちらも変わりません。新しいGUIではTotalViewの一部の機能がまだ統合されておらず利用できないため、CLI経由で行います。

3.2 端末上でGNU gdbのように起動

GUIを一切利用しない使い方です。GUIがインストールされていない環境や、計算機サーバ等へsshアクセスをして画面転送の遅延が気になるような開発作業をする際に便利です。また、マウスを使うのが面倒という方にもおすすめです。端末のプロンプトからtotalviewcliと入力するとすぐに起動します。GUIの時と同様に、起動時に対象アプリケーションを引数として与えることもできます。

4. tvscript バッチデバッグ

これまではインタラクティブにデバッガと対話し、デバッガが表示する内容に応じてステップ実行や状態表示などを指示するというデバッグの方法をご紹介してきました。しかしTotalViewはそれだけでなく非対話的なバッチデバッグの使い方も提供しています。スーパーコンピューターのジョブ管理システムにキューを投げたり、夜間にバッチ実行したり、テスト工程に組み込んでcommitなどのイベントをフックとして実行させることもできます。メモリエラーや並列関連のバグなど滅多に再現しない問題を捉える際にも有効です。

tvscriptデバッガからのフィードバッグはテキスト形式のログファイルに出力されます。並列アプリケーションでも常に単一のファイルに出力されるため、後からプロセスごとのログファイルをかき集めて集計するような手間はかかりません。

print文デバッグの強化版としても使うことができるでしょう。もちろん対象の実行コードやソースコードには一切影響を与えず、デバッグ用のスクリプトを完全に切り離して管理することができるため、製品のリリースの際にうっかりソースコードからprint文を削除するのを忘れる、といった心配もありません。

tvscriptには独自のデバッグ構文のほか、上記TotalView CLIをそのまま組み込むことができます。スタートガイド、あるいはユーザーガイドで説明されているように、TotalView CLIスクリプト言語Tclインタープリタに内蔵されており、Tclのデータ構造や制御構造、プロシージャの作成などの機能を全て利用することができるため、デバッグ用のスクリプトを作成して、非常に柔軟なデバッグシナリオを作成することができます。

例えば、アクションポイント(TotalViewの強化版ブレークポイント)に到達したり何らかのメモリイベントが発生した時に、何らかのアクション(例えばログに記入したりリプレイファイルやメモリデバッグファイルを保存)を実行するようなコールバックルーチンを作成することができます。

4.1 オプション付き実行

tvscript、あるいはメモリデバッグ専用のmemscriptには豊富な実行時オプションがあり(リファレンスガイド)、ワンライナーでtvscriptにデバッグ内容を指示することができます。例えば以下のコマンド例は、メモリデバッグ(MemoryScape)をオンにし、ソースコードの33行目でヒープメモリのHTMLレポートを出力するように指示しています。

$ tvscript -memory_debugging -create_actionpoint “combined.cxx#33=>save_html_heap_status_source_view” ./combined.elf

4.2 外部スクリプトファイル使用

リファレンスガイドに記載されているように、tvscriptに-script_fileオプションをつけることで、スクリプトファイルに記載されたコマンドを実行することができます。基本的な使い方は、イベントやアクションポイントにコールバック関数(イベントハンドラ)を関連付け、その関数の中でファイルの保存や変数の値表示などの動作を指示したり、プログラムの状態に異常がないかどうかチェックを行うことができます。

下記スライドの66枚目付近にスクリプトの例を載せています。

www.slideshare.net

まとめ

これまで見てきたように、TotalViewには多様な利用方法があります。MemoryScapeやReplayEngineの使い方、特にファイル保存まで含めるとさらに可能性が広がります。「こんな使い方はできないか?」といった疑問があればお気軽にサポートリクエストトライアルリクエストをお寄せください。

ローグウェーブ セールスエンジニア 柄澤(からさわ)

AWS S3障害にも耐えたAkanaのAPI管理プラットフォーム - CodeBuzzから

先週、2月末に米国の一部の地域でAmazonAWS S3がダウンし、このクラウドストレージを利用していた多くの著名なサービスが一時利用不可になり、日本でも大きな話題になりました。

www.publickey1.jp

www.itmedia.co.jp

ローグウェーブソフトウェアでもこの地域でAPI管理サービスを展開していますが、影響はなかったようです。一体何故でしょうか?

blog.roguewave.jp

API管理プラットフォーム AkanaAPIセキュリティやマイクロサービス関連のプロダクトマネージャを担当している Ian Goldsmithがこの問題についてブログでコメントしているのでご紹介します。

We stayed up when AWS went down

blog.klocwork.com

Amazon Web Services (AWS) S3サービスの今週発生した米国東部地域におけるダウンはすでに広く報じられています。 S3停止の波及効果により、Amazonの他の多くのサービスも巻き込まれ、Quora、Trello、GitLabといった多くの有名なサービスに深刻で長期間にわたる停止を引き起こしました。全体としてアマゾンは優れたサービスを提供しています。誰もが知っているようにこうしたことは起こるものなのです。大切なのはこの種の障害に耐えられるようにソリューションを設計することです。

私たちのAkana API管理のSaaSプラットフォームはAWSホスティングされており、米国東部地域でも本格的に事業を展開しています。それなのに、一体どのようにして顧客にシームレスなサービスを提供できたのでしょうか?

多くのAPI管理ソリューションが提供している「SaaS」ソリューションは、真のマルチテナントプラットフォームではありません。多くの場合は結局のところ、特定のリージョン内で定義された可用性ゾーン内で稼働する専用サーバーに頼ることになります。このリージョンや可用性ゾーン、サーバーに問題が生じるとサービスはダウンしてしまいます。私たちローグウェーブが行なっていることは全く異なります。我々は、高度に復元力のあるアーキテクチャを備えた、大規模でスケーラブルで分散性の高いマルチテナントのSaaSプラットフォームを運用しています。

私たちは、シャーディングとレプリケーションを行なったNoSQLストアと、マスター/スレーブにレプリケートされたリレーショナルストアを組み合わせて使用​​し、データ・ストレージに障害に対する優れた復元力を提供します。高度なルーティングと負荷分散を備えた複数の可用性ゾーンやリージョンに分散した多数の小さなサーバーを使用して、どんなことが起こっても適切にAPIトラフィックを処理し続けるようにします。マスターリージョンで完全に障害が発生した場合でも、他のリージョンのサーバが数分でマスターの役割を引き継ぎます。つまり、顧客は1〜2分構成を更新できない可能性がありますが、その他の機能はすべて中断されません。私たちはお客様の中核サービスを中断することなく、個々のサーバー、可用性ゾーン全体、およびリージョン全体の障害から生き残ることができました。

APIをビジネスに活用しているみなさまは、インターネット上で何が起きていても、可能な限り最高のサービスを提供できるように、AkanaのAPI管理についてご覧ください。

編集後記

いかがだったでしょうか。情報の分散化、冗長化について考慮する良い機会である、とする意見が多く聞かれました。

www.geekwire.com

定評のあるクラウドサービスでもこのような問題が発生し、甚大な影響を与えることを改めて実感した方も多いのではないでしょうか?

ローグウェーブ セールスエンジニア 柄澤 (からさわ)

PV-WAVE の新しい Photo 関数 (Part 1) - CodeBuzzから

Rogue Wave Softwareのセールスエンジニアである Ed Stewart がCodeBuzz に 2016年12月にリリースされたPV-WAVE 2016.1 の新しい関数PHOTOについての記事を投稿しました。Ed は現在セールスエンジニアとして活躍していますが、以前はPV-WAVEの製品マネージャとして製品の開発を統括していたことがあります。 このPHOTO関数は、一般的なイメージ形式であるBMP,GIF.JPEG,PNG,TIFFなどのイメージデータを読み込み、表示し、PV-WAVEの機能を使って解析、作成したデータを同様に保存することができます。また、PV-WAVEバージョン2016.1リリースでご紹介しました様に、医療画像形式であるDICOMも他のイメージ形式同様にとり扱う事ができます。 今回 Ed は、自身のモバイルフォンで撮影した写真を例に、新しいPHOTO関数の使い方や機能拡張の例等をご紹介しています。PV-WAVEの関数は極めて簡単に機能の拡張ができ、それを新しい関数として登録・利用することができます。本投稿記事中にある表現で “ラップする” とはこの拡張作業を意味し、"ラッパー関数" とはPHOTO関数をベースにした新しい関数を意味します。 今回記事内で Ed が作成した新しい関数はすべてGitHub から入手することができます。

RogueWave CodeBuzz

PV-WAVE の新しい Photo 関数 (Part 1) Ed Stewart

私は現在 PV-WAVE チームと近い所で仕事をしているわけではありませんが、いまでも製品をインストールしておいて定期的に利用し、手軽にデータ分析等の処理を行っています。過去にはImage関数もいくつか使用しましたが、頻度はそんなに多くありませんでした。しかし、最新のリリース2016.1にPhoto関数が追加されたのを見て、私は興奮しそれらを試してみることにました。私はプライベートな生活の中で写真の編集をよく行う為、そのツールを試してみたくなりました。

まず最近のお気に入りの写真をモバイルフォンから選び、ファイル共有アプリを使ってファイルをコピーし、ラップトップマシンにダウンロードしました。PV-WAVEの新しい PHOTO_READ 関数を使って、きわめて簡単に素早く、何の問題もなく読み込むことができました:

 WAVE> t = PHOTO_READ(‘c:\dev\data\trees.jpg’)

それをスクリーン上で確認したければ、 PHOTO_DISPLAY を使いこのように使います。

 WAVE> PHOTO_DISPLAY, t

ところが、私が期待した表示ではありませんでした。下記をご覧ください。

f:id:RWSJapan:20170224155857j:plain

とりあえず、写真は表示されましたが横向きに回転していました。しかしそれはPV-WAVEのせいではなくモバイルのメタデータに責任があります。このファイルのプロパティは、ポートレートモードであるにも関わらず 4032 x 3024 ピクセルとなっています、つまり正常に表示するにはこの写真を回転させる必要があります。さらに、この写真のサイズでは私のスクリーンにはいりきりません。4K革命に乗り遅れている為、私のモニターの解像度は最高でも1920 x 1080 にすぎないのです。解析のツールであるPV-WAVE は簡便の為に勝手にデータを省略・変更することはありません; むしろ、可能な限り正確に表示しようとする為、私のスクリーンでははみ出してしまうのです。そう、つまりリサイズが必要です。

PV-WAVE には、写真のデータだけでなく、任意のn次元配列データに対してこのような操作を行うための関数がいくつもあります。私(望むらくはあなたも)のプライベートを充実させるために、これらの関数を新しいphoto用連想配列データ(associative array)の作成に利用したいとおもっていました。まず、 ROTATE と RESAMP 関数から始め、新しいヘルパー関数 PHOTO_ROTATE と PHOTO_RESAMP を作ってみました。 ROTATE関数はデータ配列と回転方向のパラメータを受け取ります、そこで私はphoto関数のassociative array が第一引数となるようにAPIをラップして新しい関数を作ってみました。その関数内部では、ピクセル配列が取り出されROTATE関数に方向を示すパラメータが渡されます。同様にphotoに必要な幅(width)と高さ(height)には、SIZE 関数によって取得したピクセル配列の値が設定されます。この新しい関数(PHOTO_ROTATE)により、写真は正しい方向に表示できます:

  WAVE> tr = PHOTO_ROTATE(t, 3)

次に、イメージのサイズを変更するために、RESAMP関数をラップしてもう一つの新しい関数をつくりました。RESAMPには変更するイメージの幅(width)と高さ(height)を入力します、また最近傍近似(nearest-neighbor)補間の代わりに双一次(bilinear)補間を行うためのオプションキーワードInterpも使えるようにします。一般的に、特にイメージデータの場合、NN(最近傍近似) 補間はあまりよくないと思いますので、/Interpオプションを必ず使うようにします。しかしながら、NNは極めて高速に処理ができるため需要があるかもしれません、またオリジナル関数のインターフェイスと一貫性を持たせるためにこの補間方法もPHOTO_RESAMP関数に渡せるように実装しました。幅と高さも調整されますが、解像度(resolution)がどのように修正されるかよくわからない(私はデジタル写真の専門家ではないので)ところがあり、未変更の部分が下部に少し残ってしまいます。ともかく、スクリーン上に写真全体を表示することができるようになりました:

  WAVE> ts = PHOTO_RESAMP(tr, 750, 1000, /Interp)

  WAVE> PHOTO_DISPLAY, ts

ついに、私の写真がPV-WAVEの表示ウインドウに現れました、素晴らしい景色です。

f:id:RWSJapan:20170224155905j:plain

ここまでの作業を終えて、私は更に2つの作業を追加する事にしました。 まずは、ROTATE関数より便利で、実際私も良く利用する ROT 関数を使う事、二つ目は画像サイズを適切に変更しつつアスペクト比を変えないPHOTO_RESIZE関数をつくる事、画像サイズを適切に変更するにはイメージを適切にリサイズする方法について更に知る必要があります。この為、更に以下の2つの短いラッパーユーティリティーを追加しました。 はじめに, PHOTO_ROT にはROT関数が持つすべてのインターフェイス、任意回転角、倍率、回転中心x,y、及びInterpやMissingキーワードを含むすべてのパラメータをラップします。ROT関数を使うと、出力される配列のサイズは入力と同じになる為、dimensionキーは変更されません。このラッパーの複雑な操作により様々な結果を楽しむことができます。 アスペクト比に関するジレンマを解決する為、PHOTO_RESAMPを更にラップしてPHOTO_RESIZE を新たに作成しました。この関数は既存のPV-WAVE関数にはマップされません。代わりに、ユーザが一つのキーワード:倍率(Magnification)と幅(Width)又は高さ(Height)を指定するだけでイメージをリサイズします。アスペクト比 (AR = W/H) を保ちながら、他の2つの値は自動的に計算されます。 Magnification キーワードを設定するには元の画像サイズを知っておく必要がありますが、WidthとHeightはそのどちらかを指定するだけです。

この時点でついに、モバイルフォンからロードした写真を回転させ、サイズを変え私の小さなモニターに表示できるようになりました。コマンドの手順は以下の通りです:

  WAVE> t = PHOTO_READ(‘c:\dev\data\trees.jpg’)

  WAVE> r = PHOTO_ROTATE(t, 3)

  WAVE> s = PHOTO_RESIZE(r, Height=1000)

  WAVE> PHOTO_DISPLAY, s

ここで紹介したヘルパー関数はすべて GitHubから入手できます。できれば他のユーザもPV-WAVE2016.1に含まれる新しいPHOTO関数、これらの役に立つ機能を使ってみたいと思って頂ければと思います。尚、Part2では新しい機能をもっと探求し、追加されたツールやユーティリティについて紹介したいと思います。

f:id:RWSJapan:20170224160520j:plainEd Stewart はソフトウェア業界で15年の経験をもつセールスエンジニアです。Edは実験流体力学を専攻し、研究論文を発表し、米国デラウエア大学の博士課程(Ph.D)を取得しています。現在彼は、開発者の仕事を簡単にするための役割を担っています。

編集後記

いかがでしたか? これまでPV-WAVEにあったImage関数(Image_Read,Image_Display)を使ったことのある方であれば、なるほどと思われたのではないでしょうか? 近々投稿されるEdによるPart2も楽しみに! 

PV-WAVEに関する過去の投稿もご覧ください。

PV-WAVEの新機能についてはこちらをご覧ください。

By M.S