time.h — часы C ++ остаются нулевыми

Я пытаюсь получить истекшее время моей программы. На самом деле я думал, что я должен использовать yclock() от time.h, Но он остается нулевым на всех этапах программы, хотя я добавляю 10 ^ 5 чисел (должно быть потреблено некоторое время процессора). Я уже искал эту проблему, и кажется, что люди, работающие под Linux, имеют эту проблему только. Я использую Ubuntu 12.04LTS.

Я собираюсь сравнить инструкции AVX и SSE, поэтому с помощью time_t это не совсем вариант. Есть намеки?

Вот код:

 //Dimension of Arrays
unsigned int N = 100000;
//Fill two arrays with random numbers
unsigned  int a[N];
clock_t start_of_programm = clock();
for(int i=0;i<N;i++){
a[i] = i;
}
clock_t after_init_of_a = clock();
unsigned  int b[N];
for(int i=0;i<N;i++){
b[i] = i;
}
clock_t after_init_of_b = clock();

//Add the two arrays with Standard
unsigned int out[N];
for(int i = 0; i < N; ++i)
out[i] = a[i] + b[i];
clock_t after_add = clock();

cout  << "start_of_programm " << start_of_programm  << endl; // prints
cout  << "after_init_of_a " << after_init_of_a  << endl; // prints
cout  << "after_init_of_b " << after_init_of_b  << endl; // prints
cout  << "after_add " << after_add  << endl; // prints
cout  << endl << "CLOCKS_PER_SEC " << CLOCKS_PER_SEC << endl;

И вывод на консоль. Я также использовал printf() с %dбез разницы.

start_of_programm 0
after_init_of_a 0
after_init_of_b 0
after_add 0

CLOCKS_PER_SEC 1000000

2

Решение

Самый простой способ получить время — просто использовать функцию-заглушку из OpenMP. Это будет работать на MSVC, GCC и ICC. С MSVC вам даже не нужно включать OpenMP. С ICC вы можете связать только заглушки, если хотите -openmp-stubs, С GCC вы должен использовать -fopenmp,

#include <omp.h>

double dtime;
dtime = omp_get_wtime();
foo();
dtime = omp_get_wtime() - dtime;
printf("time %f\n", dtime);
2

Другие решения

clock действительно возвращает используемое время процессора, но степень детализации составляет порядка 10 Гц. Так что если ваш код не займет больше 100 мс, вы получите ноль. И если оно не будет значительно длиннее 100 мс, вы не получите очень точное значение, потому что при этом ваша погрешность будет около 100 мс.

Таким образом, увеличение N или использование другого метода для измерения времени будет вашим выбором. std::chrono Скорее всего, будет производить более точную синхронизацию (но он будет измерять «время стены», а не время процессора).

timespec t1, t2;
clock_gettime(CLOCK_REALTIME, &t1);
... do stuff ...
clock_gettime(CLOCK_REALTIME, &t2);
double t = timespec_diff(t2, t1);

double timespec_diff(timespec t2, timespec t1)
{
double d1 = t1.tv_sec + t1.tv_nsec / 1000000000.0;
double d2 = t2.tv_sec + t2.tv_nsec / 1000000000.0;

return d2 - d1;
}
5

Во-первых, компилятор может оптимизировать ваш код. Проверьте опцию оптимизации вашего компилятора.

Поскольку массив в том числе out[], a[], b[] не используются последовательным кодом и не имеют значения из out[], a[], b[] будет выведен, компилятор должен оптимизировать блок кода следующим образом, как никогда не выполнять вообще:

for(int i=0;i<=N;i++){
a[i] = i;
}

for(int i=0;i<=N;i++){
b[i] = i;
}

for(int i = 0; i < N; ++i)
out[i] = a[i] + b[i];

поскольку clock() Функция возвращает процессорное время, приведенный выше код практически не тратит время после оптимизации.

И еще одна вещь, установите N большее значение. 100000 слишком мало для теста производительности, в настоящее время компьютер работает очень быстро с кодом o (n) в масштабе 100000.

unsigned int N = 10000000;
1

Добавьте это в конец кода

int sum = 0;
for(int i = 0; i<N; i++)
sum += out[i];
cout << sum;

Тогда вы увидите время.

Так как вы не используете a[], b[], out[] он игнорирует соответствующие циклы. Это из-за оптимизации компилятора.

Кроме того, чтобы увидеть точное время, которое нужно использовать debug mode вместо release, тогда вы сможете увидеть время, которое требуется.

0
По вопросам рекламы [email protected]