Как Pragma (OMP) влияет на измерение времени, затрачиваемого на выполнение фрагмента кода? - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь измерить время, необходимое для выполнения фрагмента кода в различных условиях.Я предоставляю число n, и программа выводит время, необходимое для выполнения цикла n раз.Но отображаемое время кажется неточным при использовании с директивой #pragma.

Я пробовал с и без директивы #pragma.

#include <threads.h>
#include <stdio.h>
#include <time.h>
#include <omp.h>

void loopy(int);
void runloop(int);
int main(int argc, char *argv[]){

    int num = atoi(argv[1]);
    printf("The number entered is :: %d\n",num);

    displayTimeTaken(loopy,num);

}

void loopy(int num){
    int i;
    #pragma omp parallel for
    for(i=0;i<num;i++)for(int j=0;j<num;j++);
}

void displayTimeTaken(void *function(), int num){
    clock_t start, end;
    double cpu_time_used;
    start = clock();

    function(num);

    end = clock();
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("Time taken is :: %10fs for the number %d\n ", cpu_time_used,num);
}

Результаты в моем ЦП для ввода 100000: :: (без параллелизма)

Время, потраченное на это :: 24,632967 с для числа 100000

Реальное время, записанное в моих часах, также составляет 24 с.

Пока все хорошо.

(с параллелизмом)

Время, затраченное на:: 24.408596s для числа 100000

Но в реальном времени это заняло около 8 секунд!Я проверял код несколько раз, но для меня не имеет смысла, как прагма влияет на отображаемое время.Я запустил GDB и обнаружил, что программа запускает 3 потока.

The number entered is :: 100000
[New Thread 0x7ffff7d79700 (LWP 8761)]
[New Thread 0x7ffff7578700 (LWP 8762)]
[New Thread 0x7ffff6d77700 (LWP 8763)]
Time taken is ::  24.177702s for the number 100000
 [Thread 0x7ffff6d77700 (LWP 8763) exited]
[Thread 0x7ffff7578700 (LWP 8762) exited]
[Thread 0x7ffff7d79700 (LWP 8761) exited]
[Inferior 1 (process 8760) exited normally]

Поэтому моя первая теория заключалась в том, что время, затрачиваемое отдельными потоками, складывается.Но опять же, для меня это не имеет смысла.

Я был бы счастлив, если бы кто-то смог пролить свет на это.

1 Ответ

0 голосов
/ 06 мая 2019

clock() возвращает приблизительное время процессора, используемое процессом. Это может быть больше или меньше реального времени (иногда называемого «настенным временем»), используемого для выполнения.

В качестве альтернативы вы можете использовать функцию time, но обычно она имеет разрешение всего одну секунду.

Для настенных часов с более высоким разрешением вам необходимо использовать что-то специфичное для системы (например, clock_gettime в системах, которые предоставляют заголовки POSIX, GetTickCount в Windows).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...