Задать вопрос

Почему -pthread произвольно ускоряет работу программы?

Привет.
У меня есть такая программа;
#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 , то время работа падает само по себе, а это уже портит точность.

Что делать?
  • Вопрос задан
  • 121 просмотр
Подписаться 3 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg
Любые ответы на любые вопросы
Герман,
1) Бенчить надо в максимально контролируемых условиях, на машине, на которой кроме ОС и вашей программы не запущен, например, браузер с кучей вкладок.
2) Бенчить на такой милюзге, как 1024 элемента смысла нет, это выполнится за микросекунды, а у вас лезет погрешность порядка миллисекунд, что говорит скорее о лажовом таймере (или о том, что вы где-то добыли оригинальный 8080)
3) Бенчить пузырьковую сортировку смысла еще меньше, кому она сдалась с ее сложностью N^2? Для распараллеливания больше подходят другие сортировки

Для начала, увеличьте размер сортируемого раз так в миллион.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы