4

C(openMP環境)でtime_t変数を使用してCPUの実行時間を維持しています...すべてのCPUの時間を合計するためにfloat値sum_tot_timeを定義しています...つまり、sum_tot_timeはCPUのtime_t値の合計です。問題は、値sum_tot_timeを整数またはlongとして出力することです。ちなみに、小数部はありません。

私はこれらの方法で試しました:

  1. double値としてdoubleとしてsum_tot_timeをprintfする
  2. float値であるfloatとしてfsum_tot_timeをprintfする
  3. xをtime_t値としてdoubleとしてprintfsum_tot_timeする
  4. time_t値であるfloatとしてfsum_tot_timeをprintfする
4

2 に答える 2

3

の分解能time_tは、ほとんどのプラットフォームで最大 1 秒です。つまり、ほとんどのプラットフォームでtime_t 、1970 年 1 月 1 日の午前 0 時 (UTC) から経過した秒数をカウントする整数 (32 ビットまたは 64 ビット) の値になり、1 秒の精度しか達成できません。

したがって、time_t値の合計も 1 秒の分解能しか示しません (に変換した後でも小数部分はありませんdouble)。

上記で述べたように、累積しようとしている値を取得するためにどのネイティブまたは OpenMP 呼び出しを使用していますか?time_t

ネイティブの *nixgetrusage()呼び出しを使用してrusage構造体 (プラットフォームがサポートしている場合) にユーザー/カーネル時間を入力する場合、またはgettimeofday()壁時間を取得するために使用する場合は、tv_sectv_usecフィールドの両方を使用struct timevalしてdouble値 (ミリ秒または-より良い解像度、通常)、time_t計算の代わりにそれを使用します。

struct timeval {
        time_t          tv_sec;         /* seconds */
        suseconds_t     tv_usec;        /* microseconds */
};

これに対応して、ユーザー/カーネル時間またはWindows プラットフォームのウォール時間にGetThreadTimes/を使用してから、 を組み合わせることができます。GetProcessTimes_ftimeFILETIME::dwHighDateTime/dwLowDateTime

于 2010-04-13T15:56:00.130 に答える
0

標準の *nix システム コールにアクセスできるかどうか (または、これが特にあなたが行っていることに関連しているかどうか) はわかりませんが、アクセスできる場合はtimeval structandを使用できますgettimeofday。たとえば、tcpdump スタイルのタイムスタンプを生成する小数点以下 6 桁の精度のタイムスタンプを出力するには ( Steven UNP の好意による)

#include    "unp.h"
#include    <time.h>

char *
gf_time(void)
{
    struct timeval  tv;
    time_t          t;
    static char     str[30];
    char            *ptr;

    if (gettimeofday(&tv, NULL) < 0)
        err_sys("gettimeofday error");

    t = tv.tv_sec;  /* POSIX says tv.tv_sec is time_t; some BSDs don't agree. */
    ptr = ctime(&t);
    strcpy(str, &ptr[11]);
        /* Fri Sep 13 00:00:00 1986\n\0 */
        /* 0123456789012345678901234 5  */
    snprintf(str+8, sizeof(str)-8, ".%06ld", tv.tv_usec);

    return(str);
}
于 2010-04-13T16:41:22.063 に答える