99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 455
1

Parallel_for_each

31.05.2016, 22:51. Показов 1814. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите, как можно улучшить параллельный for_each? Ибо работает он почему-то медленней однопоточного:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <algorithm>
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
 
template <typename InputIter, typename UnaryFunction>
void parallel_for_each(InputIter first, InputIter last, UnaryFunction f)
{
    auto range = std::distance(first, last);
    size_t approxNumThreads = std::thread::hardware_concurrency();
 
    // number of elements for one thread
    size_t jobsForThread = range / approxNumThreads;
    // number of elements for one thread + remainder
    size_t jobsForMainThread = range % approxNumThreads + jobsForThread;
 
    // minus main thread
    std::vector<std::thread> threads(approxNumThreads - 1);
 
    InputIter block_start = first;
    InputIter block_end = first + jobsForThread;
 
    for(size_t i = 0; i < approxNumThreads - 1; ++i)
    {
        threads[i] = std::thread(std::for_each<InputIter, UnaryFunction>,
                                 block_start, block_end, f);
 
        block_start = block_end;
        block_end += jobsForThread;
    }
 
    std::for_each(block_start, block_start + jobsForMainThread, f);
 
    for(auto& t : threads)
    {
        if(t.joinable())
        {
            t.join();
        }
    }
}
 
int main(int argc, char* argv[])
{
    std::vector<std::string> vec;
    for(size_t i = 0; i < 1000000; ++i)
    {
        vec.push_back("hello");
    }
 
    parallel_for_each(std::begin(vec), std::end(vec), [&vec](std::string& s){ s+=" s"; });
    //std::for_each(std::begin(vec), std::end(vec), [&vec](std::string& s){ s+=" s"; });
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2016, 22:51
Ответы с готовыми решениями:

[AMP] Можно ли вкладывать друг в друга parallel_for_each?
Можно ли в C++AMP делать вложенные друг в друга parallel_for_each? Пытаюсь,но какие-то непонятные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Заблокирован
01.06.2016, 08:16 2
Цитата Сообщение от ASCII Посмотреть сообщение
for(auto& t : threads)
* * {
* * * * if(t.joinable())
* * * * {
* * * * * * t.join();
* * * * }
* * }
- это псевдомногопоточность(т.к по факту ждём завершения текущего потока, т.е всё равно что делать работу в одном + накладные расходы на организацию пула потокв), многопточность - это t.detach()
http://en.cppreference.com/w/c... ead/detach

Добавлено через 52 секунды
И понятное дело для дэтача нужна синхронизация
1
01.06.2016, 08:16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru