Тестирование приложения в полностью загруженной машине - PullRequest
3 голосов
/ 07 февраля 2011

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

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

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

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

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

P.S .: компилятор gcc, а в некоторых случаях nvcc (NVIDIA) P.S.2: в моих тестах я просто хочу измерить время выполнения между двумя частями основной функции

Ответы [ 3 ]

2 голосов
/ 07 февраля 2011

Вы не упомянули, какой компилятор вы используете, но в GNU g ++ я обычно устанавливаю флаг -pg для сборки с данными профилирования.

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

См. this для начала.

1 голос
/ 07 февраля 2011

Из других ваших недавних вопросов вы, похоже, используете 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 обрабатыватьспецифичные для платформы способы обработки времени, хотя вы можете использовать MPI_Wtick () для определения разрешения таймера, используемого на каждой платформе.

1 голос
/ 07 февраля 2011

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

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

Вы также можете использовать часы, чтобы получить приблизительную оценку :

#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;
}
...