本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。プロフィールで選択した情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

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

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

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

概要: この 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" (参考文献参照) を情報源としています。

日付:  2008年 8月 05日
レベル:  初級 この記事の原文:  英語
アクティビティー: 2529 ビュー
お気軽にご意見・ご感想をお寄せください: 


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への記事の管理、編集、執筆を行っています。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Multicore acceleration
ArticleID=356317
ArticleTitle=Fun with DaCS: 第 1 回 エラーハンドラを使ってみる
publish-date=08052008
author1-email=kane@us.ibm.com
author1-email-cc=