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

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

20.04.2017, 03:40. Показов 3005. Ответов 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
3603 / 1735 / 236
Регистрация: 26.02.2009
Сообщений: 8,825
Записей в блоге: 5
24.04.2017, 12:23  [ТС]
Студворк — интернет-сервис помощи студентам
YuryK, да, 51% я имел ввиду скорость выполнения, а не время.
Рассуждал так:
Если скорость выполнения увеличить в 2 раза(+100%), то время выполнения уменьшится 2 раза, но в %, как вы подметили, время уменьшится всего лишь на 50%. Например, было 40 секунд стало 20. Отсюда можно сделать вывод что -100% по времени в принципе не достижимая цифра, так как в этом случае мне нужно сделать вычисления за 0 секунд. Поэтому ИМХО логичнее измерять именно скорость, а не время.
0
 Аватар для dimank666
8257 / 5676 / 205
Регистрация: 29.08.2011
Сообщений: 41,879
Записей в блоге: 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
3603 / 1735 / 236
Регистрация: 26.02.2009
Сообщений: 8,825
Записей в блоге: 5
26.04.2017, 17:07  [ТС]
Цитата Сообщение от wendstor Посмотреть сообщение
попробуй через профайлер - AQTime, там уже будет видно где на самом деле "подтормаживает"
Использовал его, правда в другом проекте. Бесплатная версия которая идёт вместе с Delphi XE2 тестит всё и вся, а это не очень удобно и медленно получается, а платная - с возможностью выбора тестируемых ф-ий стоит не мало.
Цитата Сообщение от wendstor Посмотреть сообщение
на GPU (openCL, CUDA).
Замечу, что это предположения - я не экстрасенс, код не видел).
Вы бы 0-пост для начала прочитайте, поймёте в чём проблема. GPU тут ни в какие ворота.

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

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

Добавлено через 13 минут
Вообщем вся надежда AMD на свежий компилятор. Если и там будут болты, то AMD уже ничего не поможет. Буду хаить AMD пуще прежнего
0
 Аватар для snake32
3603 / 1735 / 236
Регистрация: 26.02.2009
Сообщений: 8,825
Записей в блоге: 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
8257 / 5676 / 205
Регистрация: 29.08.2011
Сообщений: 41,879
Записей в блоге: 1
29.04.2017, 02:39
Цитата Сообщение от snake32 Посмотреть сообщение
что дало +154,6% к скорости на Intel Q9450
ну вот, а то все мама да мама
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru