|
|
|
несколько вопросов по потокам, оперативке и debug-release
|
|||
|---|---|---|---|
|
#18+
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-версии время работы почти не увеличивается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 16:34 |
|
||
|
несколько вопросов по потокам, оперативке и debug-release
|
|||
|---|---|---|---|
|
#18+
ayvango1. Итак, есть 2-ядерный процессор и есть цикл 0...1000. Быстрее ли всё будет выполняться, если распределить на циклы 0...499 и 500...1000, каждый из которых выполнялся бы в своём потоке? Да, будет, но есть масса нюансов. Создание и запуск потоков - довольно дорогие операции. Поэтому суммарное время выполнения маленьких циклов с учётом времени создания потоков может оказаться больше, чем выполнение одного большого цикла. Кроме того, потоки могут конкурировать за один ресурс, что может привести к ожиданиям, а то и дедлокам. ayvango2. использую несколько больших массивов, ... ... почему внешний диск начинает использоваться за 300 Мб до полного опустошения оперативки? Память под массив выделяется одним сплошным куском. Вероятно, память уже фрагментирована, и диспетчер не может найти кусок нужного размера. Поэтому подключается хард. Как-то так. ayvango3. Итак, есть цикл ... Почему Debug-версия резко увеличивает время работы при увеличении числа операций в цикле, а в Release-версии время работы почти не увеличивается? Возможно, умный компилятор в релиз-версии выкидывает код, результат работы которого нигде не используется. А в дебаге компилирутся всё подряд, даже реально не нужный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 20:14 |
|
||
|
несколько вопросов по потокам, оперативке и debug-release
|
|||
|---|---|---|---|
|
#18+
Спасибо за подробные ответы, но ещё не всё понятно до конца. petalvik Кроме того, потоки могут конкурировать за один ресурс, что может привести к ожиданиям, а то и дедлокам. А если потоки лишь считывают массив, но не меняют его, то будут ли ожидания или можно обойтись без них? petalvik Вероятно, память уже фрагментирована, и диспетчер не может найти кусок нужного размера При нажатии Ctrl Alt Del написано, что доступной памяти в любом случае на 300 Мб меньше, чем следует, словно у меня стоит не 2 Гб, а 1 700 Мб. Даже если я не запускаю своё приложение. petalvik Возможно, умный компилятор в релиз-версии выкидывает код, результат работы которого нигде не используется Я думал об этом, но даже "полезные" операции считаются в release намного быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 20:56 |
|
||
|
несколько вопросов по потокам, оперативке и debug-release
|
|||
|---|---|---|---|
|
#18+
petalvikayvango1. Итак, есть 2-ядерный процессор и есть цикл 0...1000. Быстрее ли всё будет выполняться, если распределить на циклы 0...499 и 500...1000, каждый из которых выполнялся бы в своём потоке? Да, Нет. Многопоточные приложения пишутся, используя математику параллельных вычислений. В общем слуае будет МЕДЛЕННЕЙ. Вот если спеиально разбить цикл на несколько независимых и паралельно вычислить - то да, будет быстрее. petalvikayvangoпочему внешний диск начинает использоваться за 300 Мб до полного опустошения оперативки? Память под массив выделяется одним сплошным куском. Кто вам такое сказал? Сплошой кусок памяти с точки зрения процесса и с точки зрения диспетчера памяти ОС - две большие разницы. Грубо говоря: ОС може выделить фрагментированную память (а начиная с вин7 это стандарт - защита от некоторых вирусов), но процесс будет работать с ней как с непрерывным участком. ayvangoПочему Debug-версия резко увеличивает время работы при увеличении числа операций в цикле, а в Release-версии время работы почти не увеличивается? Дебаг включает в исполняемый файл всякие проверки и информацию для отладки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 22:36 |
|
||
|
несколько вопросов по потокам, оперативке и debug-release
|
|||
|---|---|---|---|
|
#18+
акуз-лингвист Вот если спеиально разбить цикл на несколько независимых и паралельно вычислить - то да, будет быстрее. Под независимыми имеется ввиду те, которые используют разные ресурсы? Если всем им нужно чтение одного массива -- то всё равно они будут тормозить друг друга? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2013, 03:39 |
|
||
|
несколько вопросов по потокам, оперативке и debug-release
|
|||
|---|---|---|---|
|
#18+
ayvango, Нет, имеется в виду независимость использования "ресурсов" (обычно - памяти), которые являются общими (глобальные переменные, например), на запись . Или так - скажем, циклы Код: sql 1. 2. 3. 4. Код: sql 1. 2. 3. 4. вполне можно запустить параллельно, а вот Код: sql 1. 2. 3. 4. уже не получится :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2013, 09:53 |
|
||
|
несколько вопросов по потокам, оперативке и debug-release
|
|||
|---|---|---|---|
|
#18+
Понял: общими ресурсы, если они только считываются, можно пользоваться без всякого страха, всяких синхронных фокусов делать не надо. А если мы нарушаем (меняем общие ресурсы без синхронизации), то ошибки не возникнет, просто получаем, вообще говоря, не то, что ожидали. А с ядрами как быть: 2 ядра -- это примерно 2-кратное ускорение, 4 -- 4-кратное и т.д.? Предполагается, что памяти должно хватить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2013, 02:14 |
|
||
|
несколько вопросов по потокам, оперативке и debug-release
|
|||
|---|---|---|---|
|
#18+
ayvangoА с ядрами как быть: 2 ядра -- это примерно 2-кратное ускорение, 4 -- 4-кратное и т.д.? Предполагается, что памяти должно хватить. Закон Амдала ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2013, 21:26 |
|
||
|
|

start [/forum/topic.php?fid=16&fpage=55&tid=1341759]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 375ms |

| 0 / 0 |
