У меня вопрос, ответ на который я не успею услышать: "Как часто вы проверяете поддержку simd? Вы не пробовали выносить это куда-нибудь на более высокий уровень, чтобы не проверять это в каждой функции?"
Вот ответ как делали мы на моей прошлой работе.
1. Выделили все функции, которые могут использоваться SIMD и сделали два cpp-шника, один компилировался с SIMD, другой без.
2. Сделали header-файл с указателями на функции.
3. Если комплировался общий бинарь, то по сути на старте один раз проверялась поддержка SIMD и все указатели проставлялись на нужную версию.
4. Если компилировался бинарь под конкретную архитектуру в SIMD, тов хэдере был просто специальный ifdef, который делал typedef, чтоб компилятор мог инлайнить всякое.
Поэтому ответ на вопрос такой:
1. Если бинарь под неизвестную архитектуру - проверка была в рантайме один раз.
2. Если бинарь под известную архитектуру - это проставлялось соответствующим дефайном. Тоже один раз.