次の奇妙な動作を目撃しました。ほとんど同じことを行う 2 つの関数があります。これらは、特定の操作を実行するのにかかるサイクル数を測定します。ある関数では、ループ内で変数をインクリメントします。他の場合は何も起こりません。変数は揮発性であるため、最適化されません。これらは関数です:
unsigned int _osm_iterations=5000;
double osm_operation_time(){
// volatile is used so that j will not be optimized, and ++ operation
// will be done in each loop
volatile unsigned int j=0;
volatile unsigned int i;
tsc_counter_t start_t, end_t;
start_t = tsc_readCycles_C();
for (i=0; i<_osm_iterations; i++){
++j;
}
end_t = tsc_readCycles_C();
if (tsc_C2CI(start_t) ==0 || tsc_C2CI(end_t) ==0 || tsc_C2CI(start_t) >= tsc_C2CI(end_t))
return -1;
return (tsc_C2CI(end_t)-tsc_C2CI(start_t))/_osm_iterations;
}
double osm_empty_time(){
volatile unsigned int i;
volatile unsigned int j=0;
tsc_counter_t start_t, end_t;
start_t = tsc_readCycles_C();
for (i=0; i<_osm_iterations; i++){
;
}
end_t = tsc_readCycles_C();
if (tsc_C2CI(start_t) ==0 || tsc_C2CI(end_t) ==0 || tsc_C2CI(start_t) >= tsc_C2CI(end_t))
return -1;
return (tsc_C2CI(end_t)-tsc_C2CI(start_t))/_osm_iterations;
}
そこには標準外の機能がいくつかありますが、管理できると確信しています。
問題は、最初の関数は4を返し、2 番目の関数 (おそらく少ない) は6を返しますが、2 番目の関数は最初の関数より明らかに少ないことです。
それは誰にとっても意味がありますか?
実際には、最初の関数を作成したので、2 番目の測定のループ オーバーヘッドを減らすことができました。それを行う方法はありますか(この方法では実際にはうまくいきません)?
私はUbuntuを使用しています(64ビットだと思います)。
どうもありがとう。