Satsuki開発者の方へ
# フォーラムを使うのが始めてなので,使い方が間違って
# いましたら,ご指摘いただけると幸いです。
Satsukiユーザの八柳@静大です。
流体を粒子の集まりとして計算するMPS法において
いままでは大丈夫だったと思うのですが,計算規模
(粒子数)をおおきくしたら,pzcl.logに
2017/08/12 07:04:37.587 <ERROR> =============
2017/08/12 07:04:37.587 <ERROR> 0 : WaitKernel failed:-1000
2017/08/12 07:04:46.356 <ERROR> 0 : Kernel Event Wait failed, 12
2017/08/12 07:04:46.357 <ERROR> 0 : Run 0000000F
2017/08/12 07:04:46.457 <ERROR> 0 : Kernel - density failed
2017/08/12 07:04:46.458 <INFO > 0 : ARG:00 MEM : 00.00200000 (00000000_00200000 - 00000000_006CE4DF)
2017/08/12 07:04:46.458 <INFO > 0 : ARG:01 MEM : 00.013B4140 (00000000_013B4140 - 00000000_014AD59F)
2017/08/12 07:04:46.458 <INFO > 0 : ARG:02 INT : 0x0003E508 (255240)
2017/08/12 07:04:46.459 <INFO > 0 : ARG:03 INT : 0x00066858 (419928)
2017/08/12 07:04:46.459 <ERROR> =============
というようなエラーが記録されるようになりました。これはどのような
場合に発生するエラーなのか,教えていただけないでしょうか。
潜在的なbugがありそうで,粒子数の問題ではないような気も…。^^;)
----kernel.pzc(一部)----
typedef struct vec { float x; float y; float z; } VEC;
#define L0 (0.1f)
#define EFF_R_ND (2.1f*L0)
#define WF_ND(r) (EFF_R_ND / r - 1.0f)
void pzc_density(VEC *pos, float *n, const int mn1, const int mn2) { const int tid = get_tid(); const int pid = get_pid(); const int offset = pid * get_maxtid() + tid; const int step = get_maxtid() * get_maxpid(); int i, j; for (i=offset; i<mn1; i+=step) { double nd = 0.0; for (j=0; j<i; j++) { const float r2 = SQR(pos[j].x - pos[i].x) + SQR(pos[j].y - pos[i].y) + SQR(pos[j].z - pos[i].z); if (r2 < EFF_R_ND2) { const float r = sqrtf(r2); nd += WF_ND(r); } } for (j=i+1; j<mn2; j++) { const float r2 = SQR(pos[j].x - pos[i].x) + SQR(pos[j].y - pos[i].y) + SQR(pos[j].z - pos[i].z); if (r2 < EFF_R_ND2) { const float r = sqrtf(r2); nd += WF_ND(r); } } n[i] = (float)nd; chgthread(); } flush(); }
大変遅くなってしまいましたが、これはカーネル処理が長くなってタイムアウトを発生しています。
https://portal.pezy.jp/tips/タイムアウトエラーへの対処法
にこちらの対応方法を記述してあります。