Генерация меток времени для параллельных программ - PullRequest
1 голос
/ 10 мая 2011

Для профилирования определенных событий в параллельной программе мне нужно генерировать временные метки. До сих пор я использовал clock_gettime, но я сталкиваюсь с некоторыми проблемами, некоторые из них из-за проблем с разными часами.

При CLOCK_REALTIME сгенерированные временные метки, кажется, не соответствуют фактическому порядку событий, что означает, что результирующие временные метки, сопоставленные с событиями, не имеют никакого смысла.

При CLOCK_THREAD_CPUTIME_ID и CLOCK_PROCESS_CPUTIME_ID метки времени располагаются в значимом порядке, но я ожидал, что такое поведение будет CLOCK_REALTIME, а не версиями часов, зависящими от потока / процесса. Кроме того, на странице руководства говорится, что в системах SMP могут быть фиктивные результаты, которых я не вижу.

У меня вопрос: есть ли альтернативы clock_gettime, и если нет, как я могу подойти к моему недоразумению с доступными системными часами?

1 Ответ

1 голос
/ 10 мая 2011

Если я правильно понимаю, вы пытаетесь упорядочить события в многопоточной программе.Clock_gettime слишком навязчиво для этого IMO.Если вы работаете на машине Intel, почему бы вам просто не вставить инструкцию rdtsc.Его путь более точен для цикла, а накладные расходы намного меньше.Вы можете вызвать rdtsc следующим образом:

static inline unsigned long long rdtsc(void)
{
    unsigned hi, lo;
    __asm__ __volatile__ ( 
                      "rdtsc \n"
                      : "=a"(lo), "=d"(hi));
    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}

Кстати, в SMP-системах это все равно будет поддельным, поскольку тактовые частоты двух чиповых модулей вполне могут быть несинхронизированы.

...