powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C++, 4 ядра, вычисления, 4 потока VS 1 поток.
6 сообщений из 6, страница 1 из 1
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
    #37668194
Фотография Будет технологическая деградация
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проц 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 будет исследоваться позднее.

Спасибо.
...
Рейтинг: 0 / 0
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
    #37668237
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет технологическая деградацияи произвести умножения и сложения с предложенным в задачке числом.

CUDA будет исследоваться позднее.


Шутишь ради одной-единственной операции писать алгоритм, чтобы узнать, что эта операция выплняется молниеносно, но время гоняния данных с оперативки в карту и обратно соизмеримо (а то и больше) чем время выполнения на CPU? )))

авторТо есть прироста в 4 раза нет, есть прирост раза в 2.5 - 3.
Как по мне - более чем адекватно.

авторБольше 4-х потоков не пробовал.
А тему создать - время нашел :P
...
Рейтинг: 0 / 0
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
    #37668450
Фотография Будет технологическая деградация
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonШутишь ради одной-единственной операции писать алгоритм, чтобы узнать, что эта операция выплняется молниеносно, но время гоняния данных с оперативки в карту и обратно соизмеримо (а то и больше) чем время выполнения на CPU? )))


Данных немного, много констант (150 MB). Эти константы положить в видеокарту во время инициализации, а затем передавать только 1000 задачек, параллеля их на сотни реальных потоков в видеокарте.
...
Рейтинг: 0 / 0
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
    #37668682
Фотография Будет технологическая деградация
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonБудет технологическая деградацияТо есть прироста в 4 раза нет, есть прирост раза в 2.5 - 3.
Как по мне - более чем адекватно.

Казалось бы - запустил 4 потока, не блокирующих друг друга, получил прирост в столько же раз. Но почему только в 2-3 раза? Я правильно думаю про неоптимальный доступ к ОЗУ? Попробую погуглить, реорганизовать данные в памяти.

p.s. Кода с собой нет, не могу ничего проверить.
...
Рейтинг: 0 / 0
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
    #37671220
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет технологическая деградацияEdd.DragonШутишь ради одной-единственной операции писать алгоритм, чтобы узнать, что эта операция выплняется молниеносно, но время гоняния данных с оперативки в карту и обратно соизмеримо (а то и больше) чем время выполнения на CPU? )))


Данных немного, много констант (150 MB). Эти константы положить в видеокарту во время инициализации, а затем передавать только 1000 задачек, параллеля их на сотни реальных потоков в видеокарте.

Вопрос в том - каких задачек? Если, как выше сказано, умнодить да прибавить, т.е. 1 операция, так это ж не задача параллельно 1000 операций выполнить. Вот если ты загонишь данные и будешь в 1000-10000 потоков 1000-10000 операций выполнять - тут другой разговор.

Короче, самый интуитивный тест - загнать, умножить, забрать - очень тебя огорчит. Очень, очень )))
...
Рейтинг: 0 / 0
C++, 4 ядра, вычисления, 4 потока VS 1 поток.
    #37671228
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет технологическая деградацияEdd.Dragonпропущено...

Как по мне - более чем адекватно.

Казалось бы - запустил 4 потока, не блокирующих друг друга, получил прирост в столько же раз. Но почему только в 2-3 раза? Я правильно думаю про неоптимальный доступ к ОЗУ? Попробую погуглить, реорганизовать данные в памяти.


Хорошо, допустим у тебя есть 4 проца, каждому своя память. Да хоть отдельные машины. Ты дублируешь данные для каждой из них. Запускаешь на каждой задачу и получает реально 4х. Правда время на раздачу данных и на сбор результатов. Т.е. даже в такой схеме будут потери на координацию.

Ну а когда 4 процесса роются в одной памяти, которую ну никак в их личные кеши не впихнуть, да и в общий тоже, то таки они не совершенно свободны друг от друга )) + координирующие действия. основного потока, операционки и т.д. Но ты попробуй не 150 мб, а 1.5 например.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C++, 4 ядра, вычисления, 4 потока VS 1 поток.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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