Привет.
У меня есть такая программа;
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <omp.h>
#include <time.h>
#define ARRAY_SIZE 1024
//структуры для хранения стартового и конечного времени
struct timespec start_time = {0}, finish_time = {0};
//переменная для расчёта дельты времени в наносекундах
long time_delta = 0;
//функция сортирующая массив "пузырьком"
void bubble_sort(unsigned int* array) {
unsigned int tmp = 0;
bool no_swap = 0;
for (unsigned int i = ARRAY_SIZE - 1; i >= 0; --i)
{
no_swap = 1;
{
//#pragma omp paralel for num_threads(4)
for (unsigned int j = 0; j < i; j++)
{
if (array[j] > array[j + 1])
{
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
no_swap = 0;
}
}
}
if (no_swap)
break;
}
}
int main(int argc, char* argv[]) {
(void)argc;
(void)argv;
//настроим генератор случайных чисел
srand(time(NULL));
//выделим память для теста
unsigned int* array = malloc(sizeof(unsigned int) * ARRAY_SIZE);
if(!array) { return -1; }
//сгенерируем массив
for(unsigned int i = 0; i < ARRAY_SIZE; ++i) {
array[i] = rand() % ARRAY_SIZE;
}
//замеряем стартовое время процесса
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time);
//отсортируем массив
bubble_sort(array);
//замеряем конечное время
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &finish_time);
time_delta = (1000000000 * (finish_time.tv_sec - start_time.tv_sec)) + (finish_time.tv_nsec - start_time.tv_nsec);
printf("Затраченное время: %li\n", time_delta);
free(array);
return 0;
}
Если я компилирую её так:
gcc main.c -o prog, то получаю число примерно равное 20000000, однако, если я добавляю флаг -pthread, то время работы уменьшиться до 12000000, я не понимаю почему так происходит, почему при добавлении этого флага, время исполнения падает само по себе?
Изначально, я хотел протестировать прирост времени от использования различных деректив OpenMP, но т.к. флаг
-fopenmp автоматически подключает
-pthread , то время работа падает само по себе, а это уже портит точность.
Что делать?