 | レベル: 初級 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" (参考文献参照) を情報源としています。
はじめに
この記事では 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 は技術ジャーナリスト/アナリストとして20年の経験があり、National Geographic, Population Reference Bureau, Miller Freeman, IDGで記事を書いています。また、恐れ多くも各種のジャーナル誌、JavaWorld、LinuxWorld、そしてもちろんdeveloperWorksへの記事の管理、編集、執筆を行っています。 |
記事の評価
|  |