Я хотел следовать этому руководству: http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt12ch31s03.htmlПочему параллельные расширения GNU, похоже, замедляют работу алгоритмов?
Вот несколько примеров кода:
#include <numeric>
#include <vector>
#include <iostream>
#include <chrono>
using namespace std;
int main()
{
vector<int> in(1000);
vector<double> out(1000);
iota(in.begin(), in.end(), 1);
auto t = std::chrono::high_resolution_clock::now();
for(int i = 0; i < 100000; ++i)
accumulate(in.begin(), in.end(), 0);
auto t2 = std::chrono::high_resolution_clock::now();
cout << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t).count() << endl;
return 0;
}
У меня есть следующие результаты:
~:$ g++ test.cpp -std=c++11
~:$ ./a.out
900
~:$ g++ test.cpp -D_GLIBCXX_PARALLEL -std=c++11 -fopenmp -march=native
~:$ ./a.out
1026
При выполнении нескольких прогонов, эти два пребывания в примерно в то же время. Я также пробовал с другими алгоритмами, например сортировать, генерировать, находить, преобразовывать ... У меня есть i7 с включенной поддержкой гиперпотока (4 логических ядра). я бегу г ++ - 4.8.1
Благодаря
Помните, что есть накладные расходы при создании потоков, а также для ОС для переключения между ними. Для небольших циклов, подобных вашим, эти накладные расходы, вероятно, велики, вы должны попробовать с большими наборами данных (т. Е. Зацикливать больше). –