|
|
|
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
|
|||
|---|---|---|---|
|
#18+
Проц Core i5 760, 4GB ОЗУ. Есть около 150 MB данных в ОЗУ: не изменяющиеся во времени таблицы констант. Выравнивания нет. Имеется 500 KB заранее неизвестных данных - это 1000 мелких задачек. Каждая задачка - выбрать 20-30 констант из таблицы по непредсказуемым далеко отстоящим индексам (случайная величина, равномерное распределение) и произвести умножения и сложения с предложенным в задачке числом. То есть, в ходе работы идёт активный доступ к случайным местам в пределах 150MB данных в ОЗУ, лежащих без какого-либо выравнивания. Имеется 4 ядра. При запуске программы с 1 рабочим потоком, 1000 задачек обрабатываются примерно за 1050ms (1.05 сек). При запуске в 4 потоках (каждый из которых выполняет ровно по 250 задачек) время решения - 380...450ms. То есть прироста в 4 раза нет, есть прирост раза в 2.5 - 3. Больше 4-х потоков не пробовал. Сложного распределения задачек по потокам нет - все потоки в один присест обрабатывают в цикле по 250 задачек по пинку из главного потока и засыпают до следующего пинка. Узкое место - скорее всего шина памяти? valgrind с анализом промахов в кеше буду мучать позже, но из постановки задачи ясно, что промахов в L3 будет почти 100%. Промахов в L1 мало, т.к. выполняется один и тот же компактный код на разных данных. CUDA будет исследоваться позднее. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2012, 02:38 |
|
||
|
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
|
|||
|---|---|---|---|
|
#18+
Будет технологическая деградацияи произвести умножения и сложения с предложенным в задачке числом. CUDA будет исследоваться позднее. Шутишь ради одной-единственной операции писать алгоритм, чтобы узнать, что эта операция выплняется молниеносно, но время гоняния данных с оперативки в карту и обратно соизмеримо (а то и больше) чем время выполнения на CPU? ))) авторТо есть прироста в 4 раза нет, есть прирост раза в 2.5 - 3. Как по мне - более чем адекватно. авторБольше 4-х потоков не пробовал. А тему создать - время нашел :P ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2012, 06:31 |
|
||
|
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
|
|||
|---|---|---|---|
|
#18+
Edd.DragonШутишь ради одной-единственной операции писать алгоритм, чтобы узнать, что эта операция выплняется молниеносно, но время гоняния данных с оперативки в карту и обратно соизмеримо (а то и больше) чем время выполнения на CPU? ))) Данных немного, много констант (150 MB). Эти константы положить в видеокарту во время инициализации, а затем передавать только 1000 задачек, параллеля их на сотни реальных потоков в видеокарте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2012, 14:56 |
|
||
|
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
|
|||
|---|---|---|---|
|
#18+
Edd.DragonБудет технологическая деградацияТо есть прироста в 4 раза нет, есть прирост раза в 2.5 - 3. Как по мне - более чем адекватно. Казалось бы - запустил 4 потока, не блокирующих друг друга, получил прирост в столько же раз. Но почему только в 2-3 раза? Я правильно думаю про неоптимальный доступ к ОЗУ? Попробую погуглить, реорганизовать данные в памяти. p.s. Кода с собой нет, не могу ничего проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2012, 20:08 |
|
||
|
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
|
|||
|---|---|---|---|
|
#18+
Будет технологическая деградацияEdd.DragonШутишь ради одной-единственной операции писать алгоритм, чтобы узнать, что эта операция выплняется молниеносно, но время гоняния данных с оперативки в карту и обратно соизмеримо (а то и больше) чем время выполнения на CPU? ))) Данных немного, много констант (150 MB). Эти константы положить в видеокарту во время инициализации, а затем передавать только 1000 задачек, параллеля их на сотни реальных потоков в видеокарте. Вопрос в том - каких задачек? Если, как выше сказано, умнодить да прибавить, т.е. 1 операция, так это ж не задача параллельно 1000 операций выполнить. Вот если ты загонишь данные и будешь в 1000-10000 потоков 1000-10000 операций выполнять - тут другой разговор. Короче, самый интуитивный тест - загнать, умножить, забрать - очень тебя огорчит. Очень, очень ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2012, 20:53 |
|
||
|
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
|
|||
|---|---|---|---|
|
#18+
Будет технологическая деградацияEdd.Dragonпропущено... Как по мне - более чем адекватно. Казалось бы - запустил 4 потока, не блокирующих друг друга, получил прирост в столько же раз. Но почему только в 2-3 раза? Я правильно думаю про неоптимальный доступ к ОЗУ? Попробую погуглить, реорганизовать данные в памяти. Хорошо, допустим у тебя есть 4 проца, каждому своя память. Да хоть отдельные машины. Ты дублируешь данные для каждой из них. Запускаешь на каждой задачу и получает реально 4х. Правда время на раздачу данных и на сбор результатов. Т.е. даже в такой схеме будут потери на координацию. Ну а когда 4 процесса роются в одной памяти, которую ну никак в их личные кеши не впихнуть, да и в общий тоже, то таки они не совершенно свободны друг от друга )) + координирующие действия. основного потока, операционки и т.д. Но ты попробуй не 150 мб, а 1.5 например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2012, 20:59 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=37671220&tid=1342427]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 456ms |

| 0 / 0 |
