У меня есть идея для стиля кода для написания конкретных видов числовых алгоритмов, где вы пишете свой алгоритм исключительно в агностическом макете данных.Можно ли использовать Clang или GCC для автоматического разворачивания вручную развернутых циклов?
т. Е. Все ваши функции принимают (один или несколько) скалярные аргументы и возвращают (через указатель) одно или несколько скалярных возвращаемых значений. Так, например, если у вас есть функция, которая принимает 3D-вектор float, вместо того, чтобы брать структуру с тремя членами или float [3] xyz, вы берете float x, float y, float z.
Идея состоит в том, что вы можете изменить компоновку своих входных и выходных данных, то есть вы можете играть со структурой массива по сравнению с массивом структуры данных структуры, разбитыми макетами для эффективности кеша, SIMD и многоядерной детализацией и т. Д. .. БЕЗ необходимости переписывать весь ваш код для всех комбинаций макетов данных.
стратегия имеет некоторые очевидные недостатки:
- Вы не можете использовать для петель внутри ваших функций, чтобы сделать код более компактным
- Ваших функциям нужны больше параметров в их подписях
... но они приемлемы, если ваши массивы коротки, и это избавляет вас от необходимости переписывать свой код несколько раз, чтобы сделать его быстрым.
Но, в частности, я обеспокоен тем, что компиляторы могут не использовать такие вещи, как x + = a; у + = Ь; г + = с; w + = d и autovectorize в единый вектор SIMD add, в случае, если вы хотите сделать SIMD в нижней части стека вызовов, а не делать SIMD в верхней части стека встроенных функций.
Являются ли clang и/или gcc «повторно рулон» вручную развернутыми циклами в C и/или C++-коде (возможно, после того, как функции встроены) и генерируют векторизованный машинный код?
Это невозможно в C. Выберите один язык. И весь вопрос слишком широк. Мы не являемся дискуссионным сайтом. – Olaf
Привет, Олаф, ваш ответ «нет» вполне правдоподобен и нет необходимости в четырех экземплярах того же вопроса. –
Итак, вы намеренно разместили дубликат? – Olaf