2011-02-07 1 views
3

Мне нужно «время» или сравнение количества хрустящих приложений, написанных на C/C++. Проблема в том, что машина, на которой я запускаю программу, обычно заполнена людьми, которые делают подобные вещи, поэтому процессоры всегда находятся на полной нагрузке.Бенчмаркинг приложения в полностью загруженной машине

Я думал об использовании функций от time.h liket «получить время дня» (не помню точный синтаксис, извините) и аналогий, но я боюсь, что они не будут хороши для этого случая, я правильно?

И программа «время» от bash дала мне некоторые ошибки давным-давно.

Также проблема заключается в том, что иногда мне нужно получить тайминги в диапазоне 0,5 секунды и так далее.

У кого-нибудь есть подсказка?

PS: компилятор GCC и в некоторых случаях NVCC (NVIDIA) PS2: в моих тестах я просто хочу, чтобы измерить время выполнения между двумя частями основной функции

+0

'clock()' from 'time.h' должен делать то, что вы хотите ... – Christoph

+0

Упоминание того, что вы пытаетесь протестировать с помощью тестов, действительно поможет ответить. –

ответ

1

Из других ваших последних вопросов вы, кажется, используете MPI для параллелизации. Предполагая, что этот вопрос находится в том же контексте, тогда самым простым способом было бы использовать приложение MPI_Wtime().

От человека странице:

Эта подпрограмма возвращает текущее значение времени как двойной точности число с плавающей точкой в ​​секундах. Это значение представляет собой прошедшее время с некоторая точка в прошлом. На этот раз в прошлое не изменится в течение жизни задачи. Вы отвечаете за за преобразование количества секунд в другие блоки, если хотите.Использование

Примера:

#include "mpi.h" 

int main(int argc, char **argv) 
{ 
    int rc, taskid; 
    double t_start, t_end; 

    MPI_Init(&argc,&argv); 
    MPI_Comm_rank(MPI_COMM_WORLD,&taskid); 

    t_start = MPI_Wtime(); 

    /* .... your computation kernel .... */ 

    t_end = MPI_Wtime(); 

    /* make sure all processes have completed */ 
    MPI_Barrier(MPI_COMM_WORLD); 

    if (taskid == 0) { 
     printf("Elapsed time: %1.2f seconds\n", t_start - t_end); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

Преимущество этого в том, что мы позволяем Базовому MPI Library Handle платформе конкретных способы времени обработки, хотя вы можете использовать MPI_Wtick() для определения разрешения таймера используемых на каждой платформе.

+0

спасибо за ответ, я не знал об этом MPI. Но в этом случае мой вопрос сосредоточился только на gcc и nvcc. Я посмотрю на это – flow

1

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

Время, установленное в bash (или/usr/bin/time), сообщит время, фактически используемое процессором, которое будет более полезно на загруженной машине, чем настенные часы, но слишком много происходит действительно сравнить тайминги на мелком зерне - огромные различия на порядки будут все еще очевидны.

Вы можете также использовать часы, чтобы получить rough estimate:

#include <ctime> 
#include <iostream> 

struct Timer { 
    std::clock_t _start, _stop; 
    Timer() : _start(std::clock()) {} 
    void restart() { _start = std::clock(); } 
    void stop() { _stop = std::clock(); } 
    std::clock_t clocks() const { return _stop - _start; } 
    double secs() const { return double(clocks())/CLOCKS_PER_SEC; } 
}; 

int main() { 
    Timer t; 
    //run_some_code(); 
    t.stop(); 
    std::cout << "That took " << t.secs() << " seconds.\n"; 
    return 0; 
} 
+0

это выглядит действительно хорошо, я собираюсь посмотреть, спасибо! – flow

2

Вы не упомянули, какой компилятор вы используете, но с г ГНУ ++ я обычно установить -pg флаг, чтобы построить с профилирующей информацией.

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

Для стартеров см. this.

Смежные вопросы