この記事では 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 におけるユーザ定義のエラーハンドラの作成および登録方法について説明しました。
学ぶために
- RSS feed を使って、このシリーズの更新をチェックしましょう。 (developerWorks Japan RSS フィードについてはこちら。)
- この記事で解説されている内容の原資料である Data Communication and Synchronization Library for Cell Broadband Engine Programmer's Guide and API Reference を参照しましょう。
- 手軽に読める他の DaCS 関連ガイドも見てみましょう:
- "Intro to DaCS."
- "APIs, apps, versions, and PDT."
- "Reservation services."
- "Process management."
- "Group functions."
- "Intro to data communications."
- "Datacomm details: rDMA."
- "Datacomm details: rDMA block transfers."
- "Datacomm details: rDMA list transfers."
- "Datacomm details: Message-passing services."
- "Datacomm details: Mailbox services."
- "Wait identifier management."
- "Transfer completion routines."
- "Locking primitives."
- "Element types."
- "Error handling."
- "Error codes glossary."
- "Trace events glossary."
- "DaCS and hybrid x86."
-
add large matrices together,
convert I/O data,
find minimum and maximum values,
overcome memory limits with multiple vector dot products,
perform matrix math using overlapped I/O buffers,
そして
use task dependency in a two-stage pipeline application
(developerWorks, March-July 2008) といった方法について解説している "Fun with ALF" シリーズの記事からソースコードの一例を見つけましょう。
- 手軽に読める他の ALF 関連ガイドも見てみましょう:
- "Introducing ALF."
- "10 major ALF concepts."
- "Programming with ALF: Basic ALF application structure."
- "Programming with ALF: Double buffering."
- "Programming with ALF: Handling ALF constraints."
- "Programming with ALF: Optimizing ALF applications."
- "Programming with ALF: Accelerator buffer management."
- "ALF and hybrid x86."
- developerWorks で公開されている次のシリーズで Cell/B.E. のプログラミングについてより深く学びましょう:
- "Programming high-performance applications on the Cell/B.E. processor"
- "PS3 fab-to-lab"
- "The little broadband engine that could"
- IBM Semiconductor Solutions Technical Library の Cell Broadband Engine documentation セクションをご覧ください。ダウンロード可能なマニュアルや仕様書、その他の有益な情報が得られます。
- developerWorks のニュースレターにサインアップしてください。開発者のための最新のニュースと Cell/B.E. に関する出来事が毎週メールで配信されます。サインアップの際には Power Architecture にもチェックを入れ、ニュースレターの中で Cell/B.E. に関するニュースも受信できるようにしてください。
製品や技術を入手するために
- IBM SDK for Multicore Acceleration 3.0 のコピーを入手してください。あるいは Cell/B.E. のドキュメンテーション・ライブラリーをご覧ください。
- IBM developerWorks の Cell Broadband Engine resource center は Cell/B.E. に関するすべてのリソースの決定版として、Cell/B.E. 関連の記事やディスカッション・フォーラム、ダウンロード、その他を提供しています。
- Cell/B.E. ベースのカスタム・ソリューション、あるいはカスタム・プロセッサー・ベースのソリューションに関しては IBM にご連絡ください。
議論するために
- Cell Broadband Engine Architectureのフォーラムを調べてみてください。このフォーラムではプロセッサーに関する技術的な質問への答えを得ることができます。このフォーラムに登場した深い内容の問題や回答は定期的にまとめられ、「Forum watch」ブログ・シリーズで特集されます。
- Cell Broadband Engine/Power Architecture のブログでは Cell/B.E. や Power Architecture 関連の技術に関するニュースやダウンロード、教育資料、イベントの通知などを網羅しています。また「Forum watch」ブログ・シリーズ (Q&A のまとめ) や、技術の更新に関する「FixIt」、簡単に読める技術紹介の Infobomb なども人気です。
