Aligned memcpy(), memset(), memcmp(), etc

claprix
claprix

https://godbolt.org/z/c8G8Hh
В примере видно, что если компилятору сказать о выравнивании это может давать положительный эффект на оптимизацию кода на некоторых платформах.

Эта штука может быть полезна для сериализации, где происходит копированние данных между структурами C++ и массивом байтов.

Если кто-то собирает код с -march=native, -mtune=native такое не сильно ускорит работу программы. Но если такой возможности нет, например, если раздаем бинарник людям с разными процессорами, то в этом может быть смысл.

Пока что совсем не представляю как это может выглядеть в C++. Может какой-нибудь std::aligned_copy() и прочее?

Заодно, если в эти функции положить ассерты на проверку выравнивания это может помочь ловить баги у себя в коде.

12
рейтинг
5 комментариев
claprix

Кстати, даже AMD64 ускоряется этим, потому что позволяет использовать более шустрые SIMD инструкции, которые двигают выравненные данные https://godbolt.org/z/U4eiu6

claprix
claprix

Еще пример. https://godbolt.org/z/4pgQwJ

512 это выравнивание, которого требует O_DIRECT на линуксе. Еще mmap() все выравнивает по размеру страницы. Ну и потенциальные пользователи всего этого добра авторы какого-нибудь BTree, у которых в кодобазе с большой вероятностью могут оказаться довольно большие выравненные буферы.

claprix
Игорь Гусаров

Насколько я знаю, качественные реализации memcpy / memset / memcmp уже проверяют, выровнены ли переданные им указатели (и кратны ли длины), после чего переходят к наиболее оптимальному коду. Получается, что данное предложение позволяет сэкономить только на рантайм-определении фактического выравнивнивания?

Игорь Гусаров
claprix

Игорь Гусаров, вы говорите про реализацию libc. Насколько знаю, действительно, проверяются фичи процессора чтобы выбрать SIMD пожирнее. Проверка выравнивания это if(). Если мы какой-нибудь type punning делаем между int/float, у нас, наверное, этот if() займет больше времени, чем собственно операция. Но это я так, фантазирую.

Конечно, предложение ничем не поможет реализациям libc. Но эти функции могут инлайниться разными компиляторами. И в этом случае компиляторы могут попытаться сгенерировать код получше, в зависимости от alignment и размера буфера.

claprix
claprix

Только недавно нашел http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1007r3.pdf

С его помощью реализовать мое предложение проще простого. Настолько просто, что я теперь не уверен, нужно ли оно вообще.

claprix
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения