vine-users ML アーカイブ



[vine-users:052323] Re: 計測時間が狂うのです

  • From: 上村岳明 <kami@xxxxxxxxxxxxxxxxxxx>
  • Subject: [vine-users:052323] Re: 計測時間が狂うのです
  • Date: Mon, 22 Jul 2002 16:34:54 +0900
上村です。

この話題はあまりこのMLにふさわしくないようですが....

原因は多分変数 t1 のover flow です。

clock_t は long int ですので(私のマシンではですが)4バイトの符号付き
整数です。
t1 が収納できる最大の数は 2147483647 (0x7fffffff) です。
一方、 CLOCKS_PER_SEC は私のマシンでは 1000000 でした。
従ってCPU TIMEが35分位でt1が突然マイナスの値になってしまいます。
符号無しで扱っても71分くらいでover flowしてしまいます。

(2147483647 / 1000000) / 60 = 35

Macでうまくいっているのは多分 CLOCKS_PER_SEC の値がもっと小さいのでは
ないかと思います。

以下のプログラムをMacとLinuxで実行してみて下さい。

#include <time.h>

main()
{
    printf("%d  %d\n",CLOCKS_PER_SEC,sizeof(clock_t));
}

私のマシンでは
1000000  4
とでます。

それにしても、引用されているプログラムでは無限ループになってしまうと
思われます。多分、コピー&ペーストが誤っているのだと思います。
プログラムのように1字の違いが大変な差になるような話題にカッコが消えて
しまうようなコピー&ペーストは使わないで下さい。

最初に申し上げたように、この話題はこのMLにはふさわしくないと思います。
もし、上記でも解決しないで、かつ、どうしても原因を究明したいというなら、
私宛にMailで連絡をくださるほうがいいかと思います。


Hajime Tanaka wrote:
> 
>  上村さん、応答ありがとうございます。
> 
> >
> > >         if(sscanf(buf, "passed time /sec = %lu", ppass0     < 1
> > >             fprintf(stderr, "can't read pass0 ! \n"), exit(1);
> >
> > ほんとにこれでgccを通っているのですか? 左右のカッコの数が合ってないと
> > 思います。
> 
>  なぜかVineLinux上のエディタからmozillaにテキストをコピー&ペーストできま
> せんで、リブートしたところできるようになったと思いきや、今度はコピー後に"
> ) "が消えてしまいます。気づいた箇所は直したのですが一部漏れ落ちました。失
> 礼を。しかしこのコピー&ペーストのトラブルは頭が痛いです。しかたがないので
> いまはMacで作業しております。
>  先のメールでpassをキャストする点を加えてあらためてソースの時間計測部分の
> みを示します。残念ながら
> pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
> としてキャストを行っても依然、時間がおかしいです。ちなみに同一のソースが
> Mac上では異常を見せないことも相変わらずです。どこを疑うべきでしょうか?
> 
> ttypedef unsigned long int time_passed;
> (略)
>  void Read_tmp(
>   const char *filename,
>   const char *mode,
>   int *pmax_series_set,
>   int *pn_series_set,
>   set **pseries_set,
>   int *pmax_series_record,
>   int *pn_series_record,
>   int *poptimizesgl,
>   record **pseries_record,
>   int *pi_series_record,
>   set *pnd_set,
>   int *pstepmin,
>   double *pratiomin,
>   double *pep,
>   int *pstepsgl,
>   int *pstep,
>   time_passed *ppass0
>  );
>  void Read_tmp(
>   const char *filename,
>   const char *mode,
>   int *pmax_series_set,
>   int *pn_series_set,
>   set **pseries_set,
>   int *pmax_series_record,
>   int *pn_series_record,
>   int *poptimizesgl,
>   record **pseries_record,
>   int *pi_series_record,
>   set *pnd_set,
>   int *pstepmin,
>   double *pratiomin,
>   double *pep,
>   int *pstepsgl,
>   int *pstep,
>   time_passed *ppass0
>  ){
> (中略)
>   if (NULL == fgets(buf, sizeof(buf), fp)) exit(1); /*ppass0の読み込み*/
>   if (sscanf(buf, "passed time /sec = %lu", ppass0) < 1)
>    fprintf(stderr, "can't read pass0 ! \n"), exit(1);
>   printf("pass0 = %12u\n", *ppass0);
> (中略)
>  }
> 
> int main()
> {
> (中略)
>  clock_t t0, t1;
>  time_passed pass, pass0;
> (中略)
>              if ('y' == icon){
>   Read_tmp(
>    "tmp.CDsearch130_b",
>    "rb",
>    &max_series_set,
>    &n_series_set,
>    &series_set,
>    &max_series_record,
>    &n_series_record,
>    &optimizesgl,
>    &series_record,
>    &i_series_record,
>    &ndp_set,
>    &stepmin,
>    &ratiomin,
>    &ep,
>    &stepsgl,
>    &step,
>    &pass0
>   );
> (中略)
>      }
>  else{
> (中略)
>   pass0 = 0;
>  }
>  t0 = t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
> /*時間計測開始*/
>          printf("\n"); printf("***** START ! *****\n");
>  for (; ;){
>           if (optimizesgl == 0){
>    for (; ;){
>               for (; ;){
>                  for (; ;){
>                     /*時間計測*/
>       t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
>       printf("\n"); printf("passed time = %12u sec\n", pass);
> printf("\n");
> (中略)
>      }
>     }
>     if (i_series_record >= n_series_record){
>      /*時間計測*/
>      t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
>      printf("\n"); printf("passed time = %12u sec\n", pass); printf("\n");
> 
> (中略)
>     }
>    }
>   }
>   if (optimizesgl == 1){
>              for (; ;){
>              /*時間計測*/
>     t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
>     printf("\n"); printf("passed time = %12u sec\n", pass); printf("\n");
> (中略)
>    }
>   }
>            /*時間計測*/
>   t1 = clock(); pass = (time_passed)((t1-t0)/ CLOCKS_PER_SEC) +pass0;
>   printf("\n"); printf("passed time = %12u sec\n", pass); printf("\n");
> (中略)
>             } /*計算全体を終了*/
>          printf("\nFinished !!\n");
>              return 0;
> }
> 
> >
> >
> >     if(sscanf(buf, "passed time /sec = %lu", ppass0)     < 1)
> >           fprintf(stderr, "can't read pass0 ! \n"), exit(1);
> >
> > のつもりではないのでしょうか?
> >
> > gccでエラーにならなかったとしたら
> >
> >     if(sscanf(buf, "passed time /sec = %lu", ppass0     < 1))
> >           fprintf(stderr, "can't read pass0 ! \n"), exit(1);
> >
> > になっているのではないかとおもいますが......
> > この場合多分実行時にエラー(Segmentation fault ?)になると思いますが。
> > 理由は
> >
> > printf("value = %lu\n",ppass0 < 1);
> >
> > で表示される値で表されるアドレスにsscanfの結果を書き込むことになると
> > 思うからです。
> >
> > 間違っていたら、識者の方フォローを宜しく...
> >
> > 尚、変数の定義のあたり、特にppass0の前後も省略しないで書いたほうが
> > アドヴァイスを受けやすいと思います。(原因がそのあたりにあるかも...)
> >
> > --
> > ==================================================
> > 上村 岳明   Gakumei Kamimura
> >    E-Mail:kami@xxxxxxxxxxxxxxxxxxx
> >    TEL 03-5445-7059 / FAX 03-5445-7071
> >    JALインフォテック(株)ソリューション事業本部
> 
> --
> 田中 元 BYH01337@xxxxxxxxxxx

-- 
==================================================
上村 岳明   Gakumei Kamimura
   E-Mail:kami@xxxxxxxxxxxxxxxxxxx
   TEL 03-5445-7059 / FAX 03-5445-7071
   JALインフォテック(株)ソリューション事業本部