У меня есть небольшая тестовая программа, которая компилируется вместе с моей библиотекой для тестирования скоростей различных математических функций при использовании различных методов (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 наносекунд для операций!
С чего бы это?
Постскриптум Я знаю, что это крошечная разница, я просто подумал, что это интересно.
Задача ещё не решена.