IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Multicore acceleration  >

Fun with DaCS: 第 1 回 エラーハンドラを使ってみる

ユーザ定義のエラーハンドラを作成、登録する方法の一例

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 初級

Kane Scarlett, Editor, Multicore acceleration, IBM

2008年 08月 05日

この Cell Broadband Engine™ (Cell/B.E.) シリーズでは、Data Communication and Synchronization library (DaCS) におけるユーザ定義のエラーハンドラの作成方法および登録方法について学びます。この記事で紹介する内容は "Data Communication and Synchronization Library for Cell Broadband Engine Programmer's Guide and API Reference, Version 3.0" (参考文献参照) を情報源としています。
Fun with ALF シリーズ

もっとFun with ALF シリーズを探検しましょう:

そして Cell/B.E. プログラミングを簡単にしてくれる、BLAS およびその他の技術に注目した Fun with シリーズも見てみましょう。

はじめに

この記事では DaCS におけるユーザ定義のエラーハンドラの作成および登録方法を示す一例について説明します。

DaCS はユーザが独自に作成したエラーハンドラを登録する仕組みをサポートしています。 エラーハンドラは特定のエラー状況において呼び出され、また同期エラーもしくは非同期エラーに対して呼び出されます。

SDK 3.0 では、エラーハンドラに通知される如何なる同期エラーもプロセスを強制終了することがあります。 これは DaCS が復旧できないような致命的エラーを検知した際に発生します。 非同期エラーには、子プロセスの失敗 (ホストプロセスから) や親プロセスからの終了要求 (アクセラレータプロセスから) などが含まれます。 子プロセスの異常終了は登録された全てのエラーハンドラを呼び出した後に親プロセスを強制終了させることがあります。

0 以外のステータスを持って子プロセスが通常通り終了するような場合には、エラーハンドラに非同期的に通知されることになりますが、プロセスが異常終了するようなことにはなりません。 これは親プロセスが 0 以外の終了がエラー状態を意味するものかどうかを判断することを可能としています。

エラーハンドラが呼び出される際に、エラーの詳細を示すエラーオブジェクトが渡されますが、エラーの詳細については DaCS により提供されるサービスを利用して調べることができます。このエラーオブジェクトは失敗したプロセスの DE や PID といった情報を含んでいます。これらの情報は dacs_de_test() を呼びプロセスの状態などを取得するのに利用することができ、そのため状況に応じてエラーの発生した DE 上で他のプロセスを開始させることが可能となります。

DaCS ライブラリは非同期エラーや終了要求を処理するために SIGTERM シグナルを使っています。 この目的のために、専用のエラーハンドリングスレッドが dacs_runtime_init() 内部で生成されます。 DaCS ライブラリを使用しているアプリケーションは dacs_runtime_init() を呼び出す前に如何なるアプリケーションスレッドも生成すべきではありません。 また如何なるアプリケーションスレッドも、このシグナルをアンマスクすべきではありません。

エラーハンドラを作成する

my_errhandler という名前を持つユーザ定義のエラーハンドラを作成することから始めましょう。 リスト 1 に示すコードを使うことができます。


リスト 1. エラーハンドラ

/**************************************************************** 
Example of a user error handler 
This includes invocations of additional functions of 
the passed "dacs_error_t" error parameter 
****************************************************************/ 
int my_errhandler(dacs_error_t error){ 
        /*need local variables for passback of values */ 
        DACS_ERR_T dacs_rc=0; 
        DACS_ERR_T dacs_error_rc;//hold code for error 
        de_id_t de=0; 
        dacs_process_id_t pid=0; 
        uint32_t code = 0; 
        const char * error_string; 

        /* Get the DACS_ERR_T in the error to learn what happened */
printf("\n\n--in my_dacs_errhandler\n"); 
     dacs_error_rc=dacs_rc=dacs_error_num(error); 
     printf(" dacs_error_num indicates DACS_ERR_T=%d %s\n", 
            dacs_rc,dacs_strerror(dacs_rc)); 

     /* Get the exit code in the error to learn what happened */ 
     dacs_rc=dacs_error_code(error,&code); 
     if(dacs_rc){//if error invoking dacs_error_code 
       printf(" dacs_error_code call had error DACS_ERR_T=%d %s\n", 
              dacs_rc,dacs_strerror(dacs_rc)); 
     } 
     else { 
       if (DACS_STS_PROC_ABORTED==dacs_error_rc){ 
           printf(" dacs_error_code signal signal=%d ",code); 
       } 
       else if (DACS_STS_PROC_FAILED==dacs_error_rc){ 
          printf(" dacs_error_code exit code=%d\n",code); 
       } 
       else {//else reason is different than aborted or failed 
          printf(" dacs_error_code exit/signal code=%d\n",code); 
       } 
     } 

     /* Get the error string in the error to learn what happened */ 
     dacs_rc=dacs_error_str(error,&error_string); 
     if(dacs_rc){//if error invoking dacs_error_str 
       printf(" dacs_error_str call had error DACS_ERR_T=%d %s\n", 
              dacs_rc,dacs_strerror(dacs_rc)); 
     } 
     else { 
       printf(" dacs_error_str=%s\n",error_string); 
     } 

     /* Which DE had this error? */ 
     dacs_rc=dacs_error_de(error,&de); 
     if(dacs_rc){//if error invoking dacs_error_de 
       printf(" dacs_error_de call had error DACS_ERR_T=%d %s\n", 
              dacs_rc,dacs_strerror(dacs_rc)); 
     } 
     else { 
       printf(" dacs_error_de=%08x\n",de); 
     } 

     /* What was the dacs_process_id_t? */ 
     dacs_rc=dacs_error_pid(error,&pid); 
     if(dacs_rc){//if error invoking dacs_error_pid 
       printf(" dacs_error_pid call had error" 
              "DACS_ERR_T=%d %s\n",dacs_rc,dacs_strerror(dacs_rc)); 
     } 
     else { 
       printf(" dacs_error_pid=%ld\n",pid); 
     } 
     printf("exiting user error handler\n\n"); 
     return 0;//in SDK 3.0, return value is ignored 
}

エラーハンドラを作成したら登録します。




上に戻る


エラーハンドラを登録する

ユーザ定義のエラーハンドラは dacs_errhandler_reg API を使うことで登録することができます:

dacs_rc= dacs_errhandler_reg((dacs_error_handler_t)&my_errhandler,0);

my_errhandler のアドレスが渡されない場合や dacs_error_handler_t へのキャストが省略された場合には、 コンパイラが警告を出すでしょう。




上に戻る


エラーハンドラからの出力を読み解く

これはアクセラレータプログラムが戻り値 9 で終了した場合の出力例になります:

--in my_dacs_errhandler 
  dacs_error_num indicates DACS_ERR_T=4 DACS_STS_PROC_FAILED 
  dacs_error_code exit code=9 
  dacs_error_str=DACS_STS_PROC_FAILED 
  dacs_error_de=01020200 
  dacs_error_pid=5503 
exiting user error handler

これはアクセラレータプログラムが強制終了した場合の出力例です:

--in my_dacs_errhandler 
  dacs_error_num indicates DACS_ERR_T=5 DACS_STS_PROC_ABORTED 
  dacs_error_code signal signal=6 
  dacs_error_str=DACS_STS_PROC_ABORTED 
  dacs_error_de=01020200 
  dacs_error_pid=5894 
exiting user error handler




上に戻る


まとめ

この記事では DaCS におけるユーザ定義のエラーハンドラの作成および登録方法について説明しました。



参考文献

学ぶために

製品や技術を入手するために

議論するために


著者について

Kane Scarlett

Kane Scarlett は技術ジャーナリスト/アナリストとして20年の経験があり、National Geographic, Population Reference Bureau, Miller Freeman, IDGで記事を書いています。また、恐れ多くも各種のジャーナル誌、JavaWorldLinuxWorld、そしてもちろんdeveloperWorksへの記事の管理、編集、執筆を行っています。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


この記事は、梶 信也 (skaji@jp.ibm.com) (IBM Systems & Technology Group, AKD48) が翻訳しました。

IBM, developerWorks, および Power Architecture は、International Business Machines Corporation の米国およびその他の国における商標または登録商標です。 Cell Broadband Engine は Sony Computer Entertainment Inc. の商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。

    日本IBMについて プライバシー お問い合わせ