Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для snake32
3597 / 1727 / 236
Регистрация: 26.02.2009
Сообщений: 8,770
Записей в блоге: 5

Параллелил параллелил и не выпараллелил

20.04.2017, 03:40. Показов 2978. Ответов 30

Студворк — интернет-сервис помощи студентам
Доброго многопотока всем!

Тестили тут мой конвертер pbf в kml на производительность процессоров разных. Всё бы ничего да вот он однопоточный. А на дворе тем временем 2017 год - 4 потока есть даже у бомжа. А тут ещё Ryzen вышел в мейнстрим со своими 16 потоками. И подумал я что будет круто прокачать свой скилл и попробывать выжать все соки из любого кремния. Тем более что задача мне знакома, а 1000 мелких деталей можно подсмотреть в своём же коде - решил переписать всё с нуля.

После двух недель упорного и не очень кодинга, с новым подходом к программированию той же задачи, появилось на свет консольное приложение. Промежуточные тесты показали колоссальную прибавку! В разы! В предыдущей попытке был откровенный говнокод, подумал я, и был не далёк от истины. Но радость была подпорчена.

Присмотревшись к загрузке процессора более детально заметил что приблизительно 1/3 времени проц загружен далеко не на 100%: 40-45% для Q9450(4 потока) и 17-20% для 6700К(8 потоков). Да, там есть однопоточные участки, но они коротки и полностью от них отказаться нельзя. Начал копать глубже.

Расставив вспомогательные сообщения по этапам оказалось что медленный участок это второй и третий этап, алгоритмы которых я специально уже распараллелил. То есть по задумке проц в этих местах должен жарить на все 100, но что-то его держит. Покурив форумы пришёл к выводу, что, возможно, проблема в динамической памяти. Именно на этих этапах идёт обильное выделение мелких и не очень динамических переменных в том числе строки, листы, объекты. Как я понял, в Delphi чтобы выделить память нужно залочить ВСЁ и хоть там у тебя 100500 физических потоков, память в них выделяется последовательно, то есть привет однопоток!

Как же это побороть?
В общем случае, как я понял - никак! Тупо уменьшить кол-во выделений памяти на столько насколько это возможно.
Энтузиазм под угас. Может у вас есть инфа по теме?

ЗЫ: надеюсь вам было интересно читать так же как мне 2 недели назад начинать проект
0
 Аватар для snake32
3597 / 1727 / 236
Регистрация: 26.02.2009
Сообщений: 8,770
Записей в блоге: 5
24.04.2017, 12:23  [ТС]
Студворк — интернет-сервис помощи студентам
YuryK, да, 51% я имел ввиду скорость выполнения, а не время.
Рассуждал так:
Если скорость выполнения увеличить в 2 раза(+100%), то время выполнения уменьшится 2 раза, но в %, как вы подметили, время уменьшится всего лишь на 50%. Например, было 40 секунд стало 20. Отсюда можно сделать вывод что -100% по времени в принципе не достижимая цифра, так как в этом случае мне нужно сделать вычисления за 0 секунд. Поэтому ИМХО логичнее измерять именно скорость, а не время.
0
 Аватар для dimank666
8247 / 5665 / 205
Регистрация: 29.08.2011
Сообщений: 41,722
Записей в блоге: 1
24.04.2017, 18:03
подпишусь почитаю
0
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 518
26.04.2017, 00:33
snake32, попробуй через профайлер - AQTime, там уже будет видно где на самом деле "подтормаживает". А так вычисления в одной строке я бы разбил, например:
C++
1
auto z = (a*b) + (c*d) + (e*f)....
Выход:
C++
1
2
3
4
auto ab = a*b;
auto cd = c*d;
auto ef = e*f;
auto z = ab+cd+ef;
Думаю понятно )) , дело в том что на CPU расчёт ведётся в "разных областях" и зачастую, таким методом достигается наибольшая скорость в расчёте. Так же советуют поступать (и сам выходил из проблем) на GPU (openCL, CUDA).
Замечу, что это предположения - я не экстрасенс, код не видел).
По поводу Tlist<T>, я бы убрал и заменил на array. packed, убрать - это не Сеть, тормозной.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
26.04.2017, 01:54
Цитата Сообщение от wendstor Посмотреть сообщение
По поводу Tlist<T>, я бы убрал и заменил на array.
У array Copy-On-Write Symantic. При т.е. при ресайзе или записи копирование всего массива. Если там интенсивная вставка в контейнер я бы это по другому оптимизил - контейнер на основе сегментированного массива. И оверхед по памяти минимальный и при ресайзе копирования содержимого контейнера нет, копируется только массива указателей на сегменты. При этом если не нужен в последствии или во время самих вставок рандомный доступ к элемнтам можно вобще режим свербыстрой вставки сделать с добавлением сегментов односвязным списком. Ну а после всего если запись в файл то она обычно последовательная, если нужен рандомный доступ то скопировать либо все, либо только указатели на сегменты в обычный массив, длина то уже известна. При этом экономим время на промежуточные копирования данных при ресайзах во время добавления.
0
 Аватар для snake32
3597 / 1727 / 236
Регистрация: 26.02.2009
Сообщений: 8,770
Записей в блоге: 5
26.04.2017, 17:07  [ТС]
Цитата Сообщение от wendstor Посмотреть сообщение
попробуй через профайлер - AQTime, там уже будет видно где на самом деле "подтормаживает"
Использовал его, правда в другом проекте. Бесплатная версия которая идёт вместе с Delphi XE2 тестит всё и вся, а это не очень удобно и медленно получается, а платная - с возможностью выбора тестируемых ф-ий стоит не мало.
Цитата Сообщение от wendstor Посмотреть сообщение
на GPU (openCL, CUDA).
Замечу, что это предположения - я не экстрасенс, код не видел).
Вы бы 0-пост для начала прочитайте, поймёте в чём проблема. GPU тут ни в какие ворота.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
контейнер на основе сегментированного массива.
Ну если быть более точным у меня хеш-таблица TObjectDictionary<int64, TObject> заполняется. Без неё остальные этапы станут мега медленными.

ЗЫ: Пока оставлю всё как есть и так профит получил не малый...
0
 Аватар для dimank666
8247 / 5665 / 205
Регистрация: 29.08.2011
Сообщений: 41,722
Записей в блоге: 1
26.04.2017, 18:57
Цитата Сообщение от snake32 Посмотреть сообщение
ЗЫ: Пока оставлю всё как есть и так профит получил не малый...
теперь покупай зен 8 ядерный еще ускоришся в два раза
0
 Аватар для snake32
3597 / 1727 / 236
Регистрация: 26.02.2009
Сообщений: 8,770
Записей в блоге: 5
26.04.2017, 23:16  [ТС]
dimank666, я не уверен что он обгонит мой 6700К. Тестили райзен ещё в однопотоке - всё печально!
Твой бывший FX - 60сек
Мой I7 - 33сек
Рузен у ребят с оверклокерс.ру - 50сек.
То есть пол пути не прошёл Рузен от ФХ до I7.
Но я ещё надеюсь что проблема в компиляторе - он у меня аж 2011 года.
Я уже скачал новую дельфю берлин. Там по-моему 2016, хотя хз.
В общем, есть вероятность что с Новым компилятором отрыв сократится.
0
 Аватар для dimank666
8247 / 5665 / 205
Регистрация: 29.08.2011
Сообщений: 41,722
Записей в блоге: 1
26.04.2017, 23:54
Цитата Сообщение от snake32 Посмотреть сообщение
Рузен у ребят с оверклокерс.ру - 50сек.
что то, тут не то. Нем может рейзен быть быстрее FX всего на 15%
0
 Аватар для snake32
3597 / 1727 / 236
Регистрация: 26.02.2009
Сообщений: 8,770
Записей в блоге: 5
27.04.2017, 00:23  [ТС]
dimank666, ну во-первых 60/50=1.2, то есть скорость Рузен на 20% быстрее фх. (время да на 16,66% уменьшилось)
Во-вторых, как есть так есть. Думаешь владельцы рузенов обрадовались? Хотя я их сразу предупредил что однопоток.
Некоторые обозываться стали ))) Только почему-то забыли что интол в тех же условиях тестился.

Добавлено через 13 минут
Вообщем вся надежда AMD на свежий компилятор. Если и там будут болты, то AMD уже ничего не поможет. Буду хаить AMD пуще прежнего
0
 Аватар для snake32
3597 / 1727 / 236
Регистрация: 26.02.2009
Сообщений: 8,770
Записей в блоге: 5
28.04.2017, 15:59  [ТС]
Решил ещё немного пооптимизировать так как пятница, сокращённый день и вообще последний рабочий день перед отпуском.
Написал свой вариант TList<T> с минимальными проверками, релокациями памяти, а так же с прямым доступом к массиву FItems. Меня кстати всё время раздражало что FItems сделали приватным в TList<T>. А ведь столько оптимизаций можно с ним сделать будь хотя бы он в секции protected. Приходилось писать обходные костыли типа таких:
Delphi
1
2
3
4
procedure TBufferObject.SetData<T>( const list:TList<T>; usage:GLenum=GL_STATIC_DRAW );
begin
  glBufferData( cTarget[target], sizeof(T)*list.Count, PPointer(NativeUINT(list)+sizeof(Pointer))^, usage );
end;
Вообщем теперь у меня полная свобода. Главное теперь не наломать дров.

Тестил на одном единственном этапе который выполняется на 4 потоках одновременно. Время этого этапа удалось уменьшить с 7,885 секунд до 3,097 (среднее время 6-ти прогонов), что дало +154,6% к скорости на Intel Q9450
0
 Аватар для dimank666
8247 / 5665 / 205
Регистрация: 29.08.2011
Сообщений: 41,722
Записей в блоге: 1
29.04.2017, 02:39
Цитата Сообщение от snake32 Посмотреть сообщение
что дало +154,6% к скорости на Intel Q9450
ну вот, а то все мама да мама
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru