powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / несколько вопросов по потокам, оперативке и debug-release
8 сообщений из 8, страница 1 из 1
несколько вопросов по потокам, оперативке и debug-release
    #38307083
ayvango
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Я в потоках не сильно разбираюсь, потому вопрос может показаться нелепым. Итак, есть 2-ядерный процессор и есть цикл 0...1000. Быстрее ли всё будет выполняться, если распределить на циклы 0...499 и 500...1000, каждый из которых выполнялся бы в своём потоке?

2. У меня на компе 2 Гб оперативки, использую несколько больших массивов, в оперативку не помещающихся, в результате подключается внешний диск, но при нажатии Ctrl+Alt+Del видно, что примерно 300 Мб оперативки всё равно не расходуются, несмотря на то, что уже используется внешний диск, а память, используемая в программе, превышает всю оперативку. Почему?
Более кратко: почему внешний диск начинает использоваться за 300 Мб до полного опустошения оперативки?

3. Уже задавал вопрос, но понятного ответа не получил.
Итак, есть цикл

for(int i = 0; i < N; ++i)
{
a[i] = b[i] + c[i]
}

затем меняем на

for(int i = 0; i < N; ++i)
{
a[i] = b[i] + c[i]
x[i] = y[i] + z[i]
}

Почему Debug-версия резко увеличивает время работы при увеличении числа операций в цикле, а в Release-версии время работы почти не увеличивается?
...
Рейтинг: 0 / 0
несколько вопросов по потокам, оперативке и debug-release
    #38307147
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ayvango1. Итак, есть 2-ядерный процессор и есть цикл 0...1000. Быстрее ли всё будет выполняться, если распределить на циклы 0...499 и 500...1000, каждый из которых выполнялся бы в своём потоке?
Да, будет, но есть масса нюансов. Создание и запуск потоков - довольно дорогие операции. Поэтому суммарное время выполнения маленьких циклов с учётом времени создания потоков может оказаться больше, чем выполнение одного большого цикла.
Кроме того, потоки могут конкурировать за один ресурс, что может привести к ожиданиям, а то и дедлокам.

ayvango2. использую несколько больших массивов, ...
... почему внешний диск начинает использоваться за 300 Мб до полного опустошения оперативки?
Память под массив выделяется одним сплошным куском. Вероятно, память уже фрагментирована, и диспетчер не может найти кусок нужного размера. Поэтому подключается хард. Как-то так.

ayvango3.
Итак, есть цикл
...
Почему Debug-версия резко увеличивает время работы при увеличении числа операций в цикле, а в Release-версии время работы почти не увеличивается?
Возможно, умный компилятор в релиз-версии выкидывает код, результат работы которого нигде не используется. А в дебаге компилирутся всё подряд, даже реально не нужный код.
...
Рейтинг: 0 / 0
несколько вопросов по потокам, оперативке и debug-release
    #38307167
ayvango
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подробные ответы, но ещё не всё понятно до конца.

petalvik Кроме того, потоки могут конкурировать за один ресурс, что может привести к ожиданиям, а то и дедлокам.
А если потоки лишь считывают массив, но не меняют его, то будут ли ожидания или можно обойтись без них?

petalvik Вероятно, память уже фрагментирована, и диспетчер не может найти кусок нужного размера
При нажатии Ctrl Alt Del написано, что доступной памяти в любом случае на 300 Мб меньше, чем следует, словно у меня стоит не 2 Гб, а 1 700 Мб. Даже если я не запускаю своё приложение.

petalvik Возможно, умный компилятор в релиз-версии выкидывает код, результат работы которого нигде не используется
Я думал об этом, но даже "полезные" операции считаются в release намного быстрее.
...
Рейтинг: 0 / 0
несколько вопросов по потокам, оперативке и debug-release
    #38307190
Фотография акуз-лингвист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikayvango1. Итак, есть 2-ядерный процессор и есть цикл 0...1000. Быстрее ли всё будет выполняться, если распределить на циклы 0...499 и 500...1000, каждый из которых выполнялся бы в своём потоке?
Да, Нет. Многопоточные приложения пишутся, используя математику параллельных вычислений.
В общем слуае будет МЕДЛЕННЕЙ.
Вот если спеиально разбить цикл на несколько независимых и паралельно вычислить - то да, будет быстрее.

petalvikayvangoпочему внешний диск начинает использоваться за 300 Мб до полного опустошения оперативки?
Память под массив выделяется одним сплошным куском. Кто вам такое сказал? Сплошой кусок памяти с точки зрения процесса и с точки зрения диспетчера памяти ОС - две большие разницы. Грубо говоря: ОС може выделить фрагментированную память (а начиная с вин7 это стандарт - защита от некоторых вирусов), но процесс будет работать с ней как с непрерывным участком.

ayvangoПочему Debug-версия резко увеличивает время работы при увеличении числа операций в цикле, а в Release-версии время работы почти не увеличивается? Дебаг включает в исполняемый файл всякие проверки и информацию для отладки.
...
Рейтинг: 0 / 0
несколько вопросов по потокам, оперативке и debug-release
    #38307257
ayvango
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
акуз-лингвист Вот если спеиально разбить цикл на несколько независимых и паралельно вычислить - то да, будет быстрее.
Под независимыми имеется ввиду те, которые используют разные ресурсы?
Если всем им нужно чтение одного массива -- то всё равно они будут тормозить друг друга?
...
Рейтинг: 0 / 0
несколько вопросов по потокам, оперативке и debug-release
    #38307280
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ayvango,

Нет, имеется в виду независимость использования "ресурсов" (обычно - памяти), которые являются общими (глобальные переменные, например), на запись . Или так - скажем, циклы
Код: sql
1.
2.
3.
4.
for(int i = 0; i < N; ++i)
{
a[i] = a[i] + b[i]
}

Код: sql
1.
2.
3.
4.
for(int i = 0; i < N; ++i)
{
x[i] = x[i] + b[i]
}

вполне можно запустить параллельно, а вот
Код: sql
1.
2.
3.
4.
for(int i = 1; i < N; ++i)
{
a[i] = a[i] + a[i-1]
}

уже не получится :)
...
Рейтинг: 0 / 0
несколько вопросов по потокам, оперативке и debug-release
    #38307735
ayvango
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял: общими ресурсы, если они только считываются, можно пользоваться без всякого страха, всяких синхронных фокусов делать не надо. А если мы нарушаем (меняем общие ресурсы без синхронизации), то ошибки не возникнет, просто получаем, вообще говоря, не то, что ожидали.
А с ядрами как быть: 2 ядра -- это примерно 2-кратное ускорение, 4 -- 4-кратное и т.д.? Предполагается, что памяти должно хватить.
...
Рейтинг: 0 / 0
несколько вопросов по потокам, оперативке и debug-release
    #38308756
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ayvangoА с ядрами как быть: 2 ядра -- это примерно 2-кратное ускорение, 4 -- 4-кратное и т.д.? Предполагается, что памяти должно хватить.

Закон Амдала
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / несколько вопросов по потокам, оперативке и debug-release
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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