powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как распараллелить по ядрам
25 сообщений из 29, страница 1 из 2
Как распараллелить по ядрам
    #39251545
Кое-кто-2016
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, господа!

имеется код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void update()
{
.........
	for(int i=0;i<nodes.size();i++)
	{
		handleNode(nodes[i]);
	}
}


функция update работает в главном потоке и вызывается много раз в секунду.
при этом 1 ядро процессора загружается полностью, а остальные - почти не работают.

handleNode можно вынести в отдельные потоки. Достаточно ли этого чтобы распределить нагрузку по ядрам?(я думаю что нет)
Как построить работу с потоками чтобы эффективно распределить нагрузку?
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251546
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кое-кто-2016Достаточно ли этого чтобы распределить нагрузку по ядрам?
Да, достаточно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251563
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кое-кто-2016
handleNode можно вынести в отдельные потоки. Достаточно ли этого чтобы распределить нагрузку по ядрам?(я думаю что нет)


да, достаточно.

Кое-кто-2016Как построить работу с потоками чтобы эффективно распределить нагрузку?

эффективно -- лучше создать столько потоков, сколько есть на машине ядер, и распределить задачи максимально равномерно по этим протокам, и отработать в каждом потоке по несколько задач последовательно.

например, если есть 100 задач и 4 процесса, то лучше запускать 4 потока по 25 задач, чем 100 потоков по одной задаче, или 50 потоков по 2.

это естественно в теории, при условии 100% использовании CPU при работе одной задачи, если например половину времени задача висит на IO, то вместо 4 рабочих потоков можно создать в 2 раза больше потоков, т. е. 8.
Принцип - чтобы загрузка CPU была бы максимальной, как можно ближе к 100%.
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251595
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а компиляторы не могут сами распараллеливать такие циклы, вроде как это называлось раскручивание стека
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
for(int i= 0;i<nodes.size();i++ ++ ++ ...)
	{
		handleNode(nodes[i]);
                handleNode(nodes[i+1]);
                .................
                ..................
	}
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251636
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кое-кто-2016
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void update()
{
.........
	for(int i=0;i<nodes.size();i++)
	{
		handleNode(nodes[i]);
	}
}


handleNode можно вынести в отдельные потоки. Достаточно ли этого чтобы распределить нагрузку по ядрам?(я думаю что нет)
Как построить работу с потоками чтобы эффективно распределить нагрузку?
Тут - много неизвестных. Чтобы функцию параллелить надо чтобы она была "пригожая" для параллельности.
К примеру гарантировать чтобы ее клон не создавал взаимных блокировок. И кроме того формула
производительности не всегда линейно связана с количеством процессов(потоков). Если внутри функции
используется некий ресурс-лузер то иногда эффект может быть даже обратным.
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251701
Кое-кто-2016
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cпасибо,

А как обрабатывать время простоя для потоков? когда они не обрабатывают ноды, они простаивают без работы - это примерно 50%~80% всего времени. Что использовать: suspend thread, wait for signal, или что-то другое? Быстродействие критично, 0.001 сек - это уже много(на обычных пк).
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251705
Кое-кто-2016
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonКое-кто-2016
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void update()
{
.........
	for(int i=0;i<nodes.size();i++)
	{
		handleNode(nodes[i]);
	}
}


handleNode можно вынести в отдельные потоки. Достаточно ли этого чтобы распределить нагрузку по ядрам?(я думаю что нет)
Как построить работу с потоками чтобы эффективно распределить нагрузку?
Тут - много неизвестных. Чтобы функцию параллелить надо чтобы она была "пригожая" для параллельности.

- это дано. В функции используется несколько констант из общей статической области, остальные данные - никак не пересеваются.

maytonИ кроме того формула производительности не всегда линейно связана с количеством процессов(потоков)
да, но это всяко лучше, чем обрабатывать на 1 ядре
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251715
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OpenMP
parallel_for c++
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251722
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сколько раз вызывается update() и чему равно nodes.size() ?
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251727
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиа компиляторы не могут сами распараллеливать такие циклы, вроде как это называлось раскручивание стека
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
for(int i= 0;i<nodes.size();i++ ++ ++ ...)
	{
		handleNode(nodes[i]);
                handleNode(nodes[i+1]);
                .................
                ..................
	}




нет, раскручивание стека - это совсем о другом.
о автоматическом распараллеливании нужно сказать следующее: средства такие есть, но они не входят в состав компиляторов, это библиотека и расширение языка OMP.
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251730
Кое-кто-2016
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonА сколько раз вызывается update() и чему равно nodes.size() ?

update() вызывается ~ 100 раз в секунду
nodes.size() - константа, но в зависимости от настроек программы ~ [20;70]
целевые машины 2-4 ядра по ~2.5-3.3 MHz
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251737
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кое-кто-2016Cпасибо,

А как обрабатывать время простоя для потоков? когда они не обрабатывают ноды, они простаивают без работы - это примерно 50%~80% всего времени. Что использовать: suspend thread, wait for signal, или что-то другое? Быстродействие критично, 0.001 сек - это уже много(на обычных пк).


я же писал, запускать больше рабочих потоков.
а времени простоя у потока просто напросто не должно быть, есть ему что делать - должен работать, Нет - заканчиваться.

либо он что-то делает, либо ожидает IO.
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251742
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кое-кто-2016update() вызывается ~ 100 раз в секунду
nodes.size() - константа, но в зависимости от настроек программы ~ [20;70]
целевые машины 2-4 ядра по ~2.5-3.3 MHz
ОК. А что на них? Windows? Linux?
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251752
Кое-кто-2016
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonКое-кто-2016update() вызывается ~ 100 раз в секунду
nodes.size() - константа, но в зависимости от настроек программы ~ [20;70]
целевые машины 2-4 ядра по ~2.5-3.3 MHz
ОК. А что на них? Windows? Linux?
Windows xp-10, архитектура проекта: x86
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251759
Кое-кто-2016
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivКое-кто-2016Cпасибо,

А как обрабатывать время простоя для потоков? когда они не обрабатывают ноды, они простаивают без работы - это примерно 50%~80% всего времени. Что использовать: suspend thread, wait for signal, или что-то другое? Быстродействие критично, 0.001 сек - это уже много(на обычных пк).


я же писал, запускать больше рабочих потоков.
а времени простоя у потока просто напросто не должно быть, есть ему что делать - должен работать, Нет - заканчиваться.

либо он что-то делает, либо ожидает IO.
создавать новые потоки для обработки задач
ок, я вас понял, Благодарю
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251770
Кое-кто-2016
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemarglOpenMP
parallel_for c++
по идее, самое простое решение. Обязательно попробую,
Благодарю
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251838
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivлибо он что-то делает, либо ожидает IO.

Не обязательно IO в чистом виде.

Поток может ожидать на спинлупе , это сейчас модно.
или висеть на запросе подклчения участка памяти
памяти в адресное пространство процесса.

В *nix системах подобного рода ожидания можно помотиторить
командой vmstat ( вторая колонка отличная от нуля)
это значит, что шадулер выделил контекст выполнения ,
но в силу перехода процесса в ожидание возврата из неявного системного вызова
процесс не выполняет полезной работы, он может ждать пока страницу его помяти
поднимут со свопа или ожидать когда система отожмет
страницы памяти у кеша файловой системы
что бы выделить память процессу.

приблизительно так ....
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39251865
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кое-кто-2016maytonпропущено...

ОК. А что на них? Windows? Linux?
Windows xp-10, архитектура проекта: x86


Попугаи производительности во многом будут зависеть
от алгоритма ,
какими порциями изменяется память и как синхонизируются кеши ядер.


Попыткой распаралелить вы можете ухудшить попугаи производительности.
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39252155
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНе обязательно IO в чистом виде.

Да обязательно.


авторПоток может ожидать на спинлупе , это сейчас модно.

Нахрена ? Только потому, что модно ?


авторили висеть на запросе подклчения участка памяти
памяти в адресное пространство процесса.


Это ввод-вывод.

авторпроцесс не выполняет полезной работы, он может ждать пока страницу его помяти
поднимут со свопа или ожидать когда система отожмет
страницы памяти у кеша файловой системы
что бы выделить память процессу.

Это системные ожидания, это-то тут при чём?
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39252234
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зря спорите. Пусть автор хоть что-то попробует и скажет результат. Пока неясно
что за Стебелёк у него под-капотом. И разыграет-ли он удачно карту мультипоточности.
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39252236
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivавторНе обязательно IO в чистом виде.

Да обязательно.


авторПоток может ожидать на спинлупе , это сейчас модно.

Нахрена ? Только потому, что модно ?


авторили висеть на запросе подклчения участка памяти
памяти в адресное пространство процесса.


Это ввод-вывод.

авторпроцесс не выполняет полезной работы, он может ждать пока страницу его помяти
поднимут со свопа или ожидать когда система отожмет
страницы памяти у кеша файловой системы
что бы выделить память процессу.

Это системные ожидания, это-то тут при чём?

MasterZiv либо он что-то делает , либо ожидает IO.
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39252262
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonЗря спорите. Пусть автор хоть что-то попробует и скажет результат. Пока неясно
что за Стебелёк у него под-капотом. И разыграет-ли он удачно карту мультипоточности.

Если там действительно стебелек , то врядли ....

Киллер фича Стебелека - работа с кешами процессора,
именно на этом он получает свои бенчмарковые наносекунды

В случае не попадания по кешам , это будет уже не стебелек :)
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39256658
Кое-кто-2016
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, всё-таки получается , вы себе противоречите:
Вы признаёте, что создание новых потоков влияет на производительность (даже при N~100)
MasterZivнапример, если есть 100 задач и 4 процесса, то лучше запускать 4 потока по 25 задач, чем 100 потоков по одной задаче, или 50 потоков по 2.

с другой стороны, вы настаиваете, что нужно создавать новые потоки при необходимости, а не использовать существующие
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39256669
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кое-кто-2016MasterZiv, всё-таки получается , вы себе противоречите:
Вы признаёте, что создание новых потоков влияет на производительность (даже при N~100)
MasterZivнапример, если есть 100 задач и 4 процесса, то лучше запускать 4 потока по 25 задач, чем 100 потоков по одной задаче, или 50 потоков по 2.

с другой стороны, вы настаиваете, что нужно создавать новые потоки при необходимости, а не использовать существующие

Даже если и так, что с того ?
Мне всё равно. Я уже даже забыл, о чём это всё.
...
Рейтинг: 0 / 0
Как распараллелить по ядрам
    #39257270
Кое-кто-2016
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем вы меня все обманули. Потоки с коротким жизненным циклом ось автоматически не распределяет по ядрам,
в т.ч. OpenMP тут тоже не помогает
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как распараллелить по ядрам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]