Дать возможность безопасно и с нулевым оверхедом использовать runtime-cpu-detection

ilnurkh
ilnurkh

Есть важная проблема: невозможность максимальной оптимизации в compile-time так как не извеснтно под какую архитектуру компилируется приложение (парк машин не гомогенен, либо список пользователей широк).

Это можно решать через jit (не выглядит как вариант для плюсов) или через cpu-detection непосредственно на хосте.

Во втором случае не избежать накладных расходов:

  нужно либо внутри точки входа делать проверку (мб. закешированную, но тем не менее не нулевую по стоимости) на поддержку необходимых инстукций

  либо делать интерфейс и фабрику, выдающую нужную реализацию. Во втором случае у нас virtual-call.

 

Альтернативой могло бы быть определение всех реализаций  на старте (как показано в примере). Проблема сейчас в том, что нельзя гарантировать выполнение этого определения до вызова других конструкторов стат-объектов, что ведёт к сложностям (эти объекты могут пытаться их использовать). Поэтому нужен спец механизм.

В качестве ограничения предлагаю разрешить для такого механизма только constexpr функции с единственным аргументом std::cpu_info_t и возвращаемым значением - указатель на функцию.

Потенциально, правильное аннотирование бинарников позволило бы даже писать тулы, которые бы заменяли вызов fastest_host_dot_product_impl на конкретную реализацию прямо на хосте (чтобы убрать разименование указателя).

 

 

Отдельно хочется добавить, что std::cpu_info_t cpu_info важна сама по себе, оно позволило бы даже без спец механизма помогать компилятору выкидывать ненужные ветки, сопоставляя условия с параметрами компиляции.

-1
рейтинг
4 комментария
yndx-antoshkka

У GCC есть близкий механизм https://gcc.gnu.org/wiki/FunctionMultiVersioning

Он вам подходит, или требуется что-то ещё?

yndx-antoshkka
Саша Зайцев

yndx-antoshkka, ты сам ответил на свой вопрос - он только у GCC :-)

Саша Зайцев
ilnurkh

yndx-antoshkka, gcc only не подходит

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

ilnurkh
Андрей Руссков

чтобы не тащить в стандарт все архитектуры и наборы команд, подобный функционал можно сделать аттрибутами (как у gcc, то, что кидал Антон), либо через функции аля bool cpu_supports(string_view) / bool cpu_target_is(string_view) / ...

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