2013-07-24 2 views
1

Я хотел следовать этому руководству: 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

Благодаря

+0

Помните, что есть накладные расходы при создании потоков, а также для ОС для переключения между ними. Для небольших циклов, подобных вашим, эти накладные расходы, вероятно, велики, вы должны попробовать с большими наборами данных (т. Е. Зацикливать больше). –

ответ

1

Я думаю, вам нужно попробовать что-то немного более тяжелым. Все, что вы делаете, добавляет int с. Накладные расходы на создание потоков и т. Д. Будут больше. Попробуйте заменить int с std::string и работает следующий код и сравнить результаты:

int main() 
{ 
    vector<string> in(100000); 

    auto t = std::chrono::high_resolution_clock::now(); 
    accumulate(in.begin(), in.end(), string(), [](string s1, string s2){ return s1 += s2 + "a" + "b";}); 
    auto t2 = std::chrono::high_resolution_clock::now(); 

    cout << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t).count() << endl; 
} 
+0

Я вижу, намного лучше! –

+1

В качестве побочного примечания я получаю эти цифры, если кому-то интересно количество выигрышей, предлагаемое g ++: * без параллельных расширений: 530 мс (в среднем) * без параллелизма и с O3: 500 мс * с параллельным: 95 мс * с параллельным и O3: 85 мс –

Смежные вопросы