Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! Столкнулся с проблемой при распараллеливании вычислений, и не могу понять причину почему потоки не работают параллельно. Пишу на с++ Builder 6 приложение. Пробовал и на dll перенести в VS 2008, итог одинаковый. Для запуска в потока использую API Windows CreateThread, количество потоков контролирую семафорами. Отладил потоки сначала на простенькой функции сложения в цикле, поверил запустил все работает, потоки грузят ядра процессора. Как только перенес алгоритм расчета в поток, многопоточность перестала работать, точнее она вроде бы и есть но при работе грузится только 1 процессор. В поточных расчете используется порядка 7 классов, и операции с данными в этих классах, обход деревьев, разделение деревьев, объединение деревьев, деревья реализованы на вектора std. Может как то можно отловить кусок кода который препятствует распараллеливанию потоков? Поделитесь опытом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 15:44 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Логи пиши и изучай что каждый поток делает. ID потока GetCurrentThreadId() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 15:50 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
GarfishДля запуска в потока использую API Windows CreateThread "Уже смешно", доки явно не читаны. GarfishМожет как то можно отловить кусок кода который препятствует распараллеливанию потоков? Профилер попробуй. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 16:06 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
GarfishДобрый день, коллеги! Столкнулся с проблемой при распараллеливании вычислений, и не могу понять причину почему потоки не работают параллельно. Пишу на с++ Builder 6 приложение. Пробовал и на dll перенести в VS 2008, итог одинаковый. ... В поточных расчете используется порядка 7 классов, и операции с данными в этих классах, обход деревьев, разделение деревьев, объединение деревьев, деревья реализованы на вектора std. Может как то можно отловить кусок кода который препятствует распараллеливанию потоков? Поделитесь опытом... Это всё очень сложно, и без кода вообще нет смысла обсуждать. Скоре всего, всё тривиально, и ты просто неправильно диагносцируешь загрузку процессоров. Но может быть и ты сделал какую-то сериализацию в программе, и потоки друг другу мешают. Например, что значит вот это вот : авторДля запуска в потока использую API Windows CreateThread, количество потоков контролирую семафорами. Отладил потоки ? Количество потоков семафорами невозможно контролировать, семафорами возможно только контролировать кто из запущенных потоков будет работать. И в идеале это вообще не нужно делать, в идеале многопоточная программа должна выглядеть так: 0) взял всю работу, что нужно сделать, описал её данными. 1) разделил эту работу на куски в соответствии с уровнем параллелизма системы (N кусков)(грубо -- кол-во процессоров). 2) запустил N потоков, каждому из потоков дал свой кусок вычислений. 3) дождался конца выполнения каждого из потоков. 4) для хорошего распаралеливания нужно, чтобы у потоков не было общих выходных данных, а входные были бы только на чтение. Иначе надо будет синхронизировать доступ к данным, что приведёт неизбежно к состязаниям за этот доступ и снижению общего уровня параллелизма. 5) в конце все потоки должны отдать результаты и главный поток должен их как-то сагрегировать в единый результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 17:22 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovGarfishДля запуска в потока использую API Windows CreateThread "Уже смешно", доки явно не читаны. Ты на beginthread_ex намекаешь ? Если так, не факт, что он в Builder е есть или если есть, то так же называется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 17:23 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
MasterZivТы на beginthread_ex намекаешь ? Я намекаю на явное указание "никогда не использовать эту функцию в программах, использующих RTL". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 17:43 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
MasterZiv, по 4 пункту есть общая выходная переменная std::vector по окончании вычислений объем больше 1 гига, результаты всех потоков записываются в структуру и передаются в вектор спасибо есть интересные идеи будем думать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 18:14 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMasterZivТы на beginthread_ex намекаешь ? Я намекаю на явное указание "никогда не использовать эту функцию в программах, использующих RTL". ну это одно и то же. на самом деле можно, если в этом созданном потоке CRT не использовать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 21:04 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Garfish, тебе думать не надо, тебе надо код опубликовать, если хочешь, чтобы тебе помогли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 21:06 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
MasterZiv, сделал ведение лога по прохождению функции и записью Id процесса, процессы работают параллельно но в пределах одного ядра. начал отключать куски кода, и нашел что распараллеливание пропадает при подключении сборки дерева на рекурсивном вызове new Код: plaintext 1. 2. 3. 4. 5. 6. 7. сли исходить из такой логики, что потоки работают в одном адресном пространстве программы, то работа с общей памятью при выделении памяти происходит в "одно окно" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:30 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Запросто. Есть многопоточные аллокаторы, но если ты хочешь быструю программу - старайся уйти от постоянных мелких выделений памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 13:00 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
GarfishMasterZiv, сделал ведение лога по прохождению функции и записью Id процесса, процессы работают параллельно но в пределах одного ядра. начал отключать куски кода, и нашел что распараллеливание пропадает при подключении сборки дерева на рекурсивном вызове new Код: plaintext 1. 2. 3. 4. 5. 6. 7. сли исходить из такой логики, что потоки работают в одном адресном пространстве программы, то работа с общей памятью при выделении памяти происходит в "одно окно" сказки не рассказывай. впрочем, если у тебя билдер, и там может ты собрал с однопоточной CRT, и она там сделана так, что на всякий случай ставит process affinity mask на один проц, то ты вполне можешь получить такую картину. это все предположение, я билдер не знаю, и знаю не хочу, и тебе не советую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 13:16 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
MasterZiv, проблема в new как я и предполагал, когда используется new работа с общим адресным пространством программы работает в одно окно, я сделал простенький проект с многопоточностью. В нем 2 функции, Первая MulAdd1 без использования new, все распараллеливается на 4 ядра. И вторая функция MulAdd2 где используется оператор new многопоточность исчезает. посмотри пожалуйста, как можно распараллелить потоки по ядрам не изменяя код функции MulAdd2 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 20:30 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Garfishкак можно распараллелить потоки по ядрам не изменяя код функции MulAdd2 Ну, например, можно переопределить операторы new и delete объектов, которые там выделяются-освобождаются так, чтобы они были более thread-friendly. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 20:41 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, а как? new вызывается в конструкторе класса delete в деструкторе и принцип работы такой, что я обхожу по узлам деревья и строю новое node->node->node->node-> .... node->node->node->end можно это решить как то за пределами функции использующей выделение памяти, что бы для каждого потока задать свое адресное пространство? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 20:54 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Siemargl, многопоточный аллокатор, как его сделать? ни разу не сталкивался, но похоже это то, что надо в моем случае ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 21:21 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Garfish, Трай гуггл зис, Люк! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 22:02 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Garfish, проблема может быть не в какой-то синтаксической ошибке или качестве вашего кода, а в том, что разработанная программа не реентерабельна в целом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 22:16 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
SashaMercury, как в потоках реализовать разделяемое адресное пространство не знаю, но вот используя разделяемую память можно запустить разные процессы и читать данные в разделяемой памяти, процессы будет между собой изолированы на работу с памятью но будет общая точка обмена данными разделяемая память, пока что я вижу такую возможность распараллеливания ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 22:25 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Garfish, что проще то выделить память до создания потока, передать в функцию потока, потом удалить? можно также вообще память не выделять, использовать статическую память, Или выделять через alloca(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 00:48 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
MasterZiv, а применительно к конструктору node как это можно сделать? Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 09:32 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
Garfish, я потом посмотрю всё, отпишусь... сорри сейчас некогда... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 13:18 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
GarfishMasterZiv, а применительно к конструктору node как это можно сделать? Код: plaintext 1. 2. 3. 4. 5. 6. 7. в очередной раз прошу посылать ВЕСЬ код... сделать то можно, вопрос, что дальше будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 13:20 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
GarfishDimitry Sibiryakov, а как? Сюда смотри, Ищи как можно добраться до нужных тебе системных вызовов из используемой тобой обертки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 13:53 |
|
||
|
Почему не распараллеливаются потоки
|
|||
|---|---|---|---|
|
#18+
[quot Garfish]SashaMercury, как в потоках реализовать разделяемое адресное пространство не знаю, просто 0) выделить память 1) использовать только в этом потоке 2) вовремя удалить память если использовать все виды стековой памяти , то вообще все автоматом разделяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 22:59 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39357289&tid=2018364]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 170ms |

| 0 / 0 |
