Рабочие потоки намного хуже производительности, чем основные

У меня есть небольшая тестовая программа, которая компилируется вместе с моей библиотекой для тестирования скоростей различных математических функций при использовании различных методов (SSE, for-loop, unrolled-loop, ect). Эти тесты проходят по разным методам сотни тысяч раз и определяют среднее время вычислений. Я решил, что я создам 4 рабочих потока для каждого ядра моего компьютера и проведу тесты таким образом для моих тестов.

Теперь это микро-эталоны, измеряемые в наносекундах, поэтому различия могут показаться большими, но на самом деле никаких других различий на этом уровне нет.

Вот мой код для одностороннего выполнения функций:

static constexpr std::size_t num_tests = 400000;
auto do_test = [=](uint64_t(*test)()){
// test is a function that returns nanosecods taken for a specific method
uint64_t accum = 0;
for(std::size_t n = 0; n < num_tests; n++)
accum += test();
return accum / num_tests;
};

и вот мой (более быстрый) код для многопоточного выполнения тестов:

static constexpr std::size_t num_tests = 100000;
auto do_test = [=](uint64_t(*test)()){
uint64_t accum = 0;

std::thread first([&](){
for(std::size_t n = 0; n < num_tests; n++)
accum += test();
});
std::thread second([&](){
for(std::size_t n = 0; n < num_tests; n++)
accum += test();
});
std::thread third([&](){
for(std::size_t n = 0; n < num_tests; n++)
accum += test();
});
std::thread fourth([&](){
for(std::size_t n = 0; n < num_tests; n++)
accum += test();
});

first.join();
second.join();
third.join();
fourth.join();

return accum / (num_tests * 4);
};

НО результаты медленнее D: поэтому он выполняется быстрее, но операции дают более медленные результаты.

Моя однопоточная версия дает среднее значение 77 наносекунд, тогда как моя многопоточная версия дает среднее значение 150 наносекунд для операций!

С чего бы это?

Постскриптум Я знаю, что это крошечная разница, я просто подумал, что это интересно.

0

Решение

Задача ещё не решена.

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


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