Я пытаюсь получить истекшее время моей программы. На самом деле я думал, что я должен использовать 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
Самый простой способ получить время — просто использовать функцию-заглушку из 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);
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;
}
Во-первых, компилятор может оптимизировать ваш код. Проверьте опцию оптимизации вашего компилятора.
Поскольку массив в том числе 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;
Добавьте это в конец кода
int sum = 0;
for(int i = 0; i<N; i++)
sum += out[i];
cout << sum;
Тогда вы увидите время.
Так как вы не используете a[], b[], out[]
он игнорирует соответствующие циклы. Это из-за оптимизации компилятора.
Кроме того, чтобы увидеть точное время, которое нужно использовать debug mode
вместо release
, тогда вы сможете увидеть время, которое требуется.