LINUX.ORG.RU

predefined memcpy()


1

1

Вопрос вот какой, уважаемые коллеги.

Есть некая структура с предопределенным размером - 100 байт. Встал вопрос об ультражесткой оптимизации копирования этого блока памяти.

Приоритет - минимальная латентность (работа идет на выделенных процессорных ядрах).

Подстроить размер блока можно в диапазоне 92-100 байт. Выравнивание - отдельная тема, но теоретически решаемо. Кроссплатформенности нет и не предвидится, решение штучное, заточенное под железо, на данный момент - ксеоны последнего поколения.

Какие последуют советы?

Спасибо всем заранее.

Ответ на: комментарий от Harald

256 не пойдет, или, возможно, выше? Если несложно, с деталями.

Обратите внимание что речь идет о малом единичном блоке памяти с потенциальными проблемами с выравниванием в блоке памяти назначения.

westtrd
() автор топика
Ответ на: комментарий от i-rinat

Обратите внимание, что размер структуры для копирования предопределен - основная задача - максимально оптимизировать эту операцию, все встроенные функции исходят все же из иных предпосылок

westtrd
() автор топика

железо, на данный момент - ксеоны последнего поколения. Какие последуют советы?

Любой специализированный (по длине копируемой структуры) способ копирования, хоть rep movs. Процессор всё равно команды на свои uops разберёт/соберёт с примерно одинаковым паттерном работы с uncore. А оптимизировать надо картину уровнем выше: чтобы переключений контекста не было, код в l1 умещался, промахов TLB не было, пайплайн не затыкался.

mv ★★★★★
()

Оооо, «ultra low-latency trading platform developer» :)

mv ★★★★★
()

Значит, для твоего левелбука надо в первую очередь озаботиться локальностью данных и прогнозируемым паттерном доступа к ним. Помимо must have техник, типа hugepages (и для размещения кода тоже, если какая-то аналитика делается), нужно ещё постоянно помнить, что латентность даже L2 на E5 порядка 8 тактов - это дюжина команд. Т.е. часто выгодней побольше посчитать на структуре посложне, чем дотянуться до данных в плоском массиве.

Прогнозируемый доступ (для сокращения eviction rate и засирания tlb) - это, например, выделение отдельного ядра на эйпл, чтобы не слишком прибыльный, но назойливый микрософт не мешал.

mv ★★★★★
()
Ответ на: комментарий от mv

Спасибо за советы.

Какие решения применяются. 1. Это выделенные ядра, что на читателе, что на писателе. 2. Критичные потоки пасутся на одном физическом кеше L3

В данном случае речь идет про биржевое API. Задача - максимально быстро вернуть управление из коллбека, для этого и применяется специализированный memcpy.

westtrd
() автор топика
Ответ на: комментарий от mv

И да, все вещи типа кеш-выравнивания и тому подобные предусмотрены изначально.

westtrd
() автор топика

Интереса ради, а как вы поняли что у вас производительность упирается в копирование 100 байт?

pulo
()
Ответ на: комментарий от pulo

У меня ничего никуда не упирается.

Это законы индустрии такие - коллбек должен вернуть управление за минимально возможное время.

В трейдинге латентность это абсолютно реальные деньги, поэтому, если есть возможность оптимизировать критический блок кода, он должен быть оптимизирован.

westtrd
() автор топика
Ответ на: комментарий от westtrd

А при чем тут коллбек? Откуда куда данные копируете то? Я так понял ОС Linux + PREEMPT_RT используете? Не боитесь что кто-то другой процессорное время съест, в разы больше копирования 100байт? Или полностью свой планировщик задач у вас?

pulo
()
Ответ на: комментарий от pulo

Есть биржевое API, которое вызывает определенные пользователем коллбеки. Пока коллбеки не вернут управление, поток биржевого API ждет.

Вот потому и решаю такого рода задачи.

А все остальное, то что вы упомянули, само собой, делается. И, обратите внимание, горячие потоки работают монопольно на выделенных ядрах, так что этот момент учтен.

westtrd
() автор топика
Ответ на: комментарий от westtrd

Спасибо за пояснения, собственно направление на «монопольность потока на ядре» не дадите? как делается, может ссылки?

pulo
()
Ответ на: комментарий от pulo

shed_setaffinity taskset irqbalance

Еще интересная дискуссия была на этом форуме, на предмет запрета выполнения на определенном ядре процессора kernel work queue

westtrd
() автор топика
Ответ на: комментарий от westtrd

Еще интересная дискуссия была на этом форуме, на предмет запрета выполнения на определенном ядре процессора kernel work queue

Ссылки не осталось?

mv ★★★★★
()
Ответ на: комментарий от westtrd

Ну, это просто посетовали, что в Линуксе полностью нельзя от wq избавиться.. ;)

mv ★★★★★
()
Ответ на: комментарий от mv

Любой специализированный (по длине копируемой структуры) способ копирования, хоть rep movs. Процессор всё равно команды на свои uops разберёт/соберёт с примерно одинаковым паттерном работы с uncore.

Если все обстоит именно так, какой тогда был смысл городить такие сложные способы копирования через SSSE3 инструкции, как: http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/x86_64/multiarc...

Вот тут есть куча написанных на ассемблере функций для всяких разных SSE расширений http://sourceware.org/git/?p=glibc.git;a=tree;f=sysdeps/x86_64/multiarch;h=46...

Еще мне вспомнил, был случай что из-за memcpy который копировал данные задом наперед(т.к. это оказывается эффективнее на каких-то процессорах), флеш плеер работал некорректно http://avva.livejournal.com/2323823.html

SZT ★★★★★
()
Ответ на: комментарий от mv

хоть rep movs. Процессор всё равно команды на свои uops разберёт/соберёт с примерно одинаковым паттерном работы с uncore.

Смешно такое читать. Удачного копирования через rep movsb!

anonymous
()
Ответ на: комментарий от SZT

Если все обстоит именно так, какой тогда был смысл городить такие сложные способы копирования через SSSE3 инструкции

Сложные? :)

glibc работает на куче разных процессоров с разными микроархитектурами, а у memcpy нет требований в выравниванию и размеру данных. У ТС данные выравнены, размер подогнан под РОН/XMM. Разницы между копированием через mov/movs посередине живого кода на E5 вообще не будет, через xmm тоже не будет, если префетчер правильно настроен.

Трейдерский софт такого уровня, каким ТС занимается, оптимизируется под конкретную микроархитектуру: будет работать на SB-EP, значит, всё затачивается под особенности SB-EP. На следующем интеловском tock, как правило, все заточки под предыдущую микроархитектуру пересматриваются. И вот это как раз хороший пример:

Еще мне вспомнил, был случай что из-за memcpy который копировал данные задом наперед(т.к. это оказывается эффективнее на каких-то процессорах)

mv ★★★★★
()
Ответ на: комментарий от mv

Разницы между копированием через mov/movs посередине живого кода на E5 вообще не будет, через xmm тоже не будет, если префетчер правильно настроен.

Сначала не поверил, погуглил слегка. Наткнулся на статью http://habrahabr.ru/company/intel/blog/133962/

Цифра — во сколько раз самый продвинутый SSE4.1 код быстрее, чем std::memcpy, реализованный через rep movs

Bulldozer — 1.22x (спасибо stepmex за данные)

Penryn — 1.6x

Nehalem — 1.5x

Sandy Bridge — 1.008x

Этот бенчмарк не особенно точный, в реальном софте играют роль многие другие факторы, которые я вкраце перечислил выше.

Так что тут зависит от процессора

SZT ★★★★★
()
Ответ на: комментарий от SZT

Пока на Xeon E3, это у меня девсервер такой, проделал эксперименты такие:

1. memcpy c литеральным параметром

2. builtin memcpy с литеральным параметром

3. применение 128-битных интринисков и копирование чз builtins

Во всех случаях gcc сгенерировал абсолютно идентичный код копирования памяти на ассемблере через MMX инструкции, причем серией с фиксированными смещениями, без всяких циклов, то есть пачку инструкций

Доберусь, сделаю постановочный эксперимент на icc

westtrd
() автор топика
Ответ на: комментарий от westtrd

По ссылке http://gcc.1065356.n5.nabble.com/Ways-to-fill-the-stack-td912561.html#none в самом конце я тесты выкладывал под clang и gcc, там правда идет проверка способа записи данных в стек для передачи в функцию, но ситуация похожая. Можете переделать для своих тестов.

SZT ★★★★★
()
Ответ на: комментарий от SZT

Спасибо, погляжу :)

Таких мест всего несколько на всю систему, придется инвестировать время в эксперименты, ибо бенефит тут явно имеется.

westtrd
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.