#linux #gcc #genetic-algorithm #compiler-optimization
#linux #gcc #genetic-алгоритм #компилятор-оптимизация
Вопрос:
Я делаю проект для автоматической обработки параметров оптимизации компилятора gcc без спецификации программиста. Я решил использовать алгоритм коммивояжера и GA для выбора наилучшей оптимизации на основе скорости выполнения. Это приложение будет принимать задачу (код C ) в качестве входных данных и выполнять комбинацию перестановок для всех доступных параметров оптимизации в компиляторе GCC и сохранять время, затраченное на выполнение.
Теперь, возможно ли запрограммировать это в сценарии оболочки? или я должен программировать на самом C ?
Вот ссылка на базовый документ. http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4625477
Пожалуйста, дайте мне знать, если я ошибаюсь в концепции в целом. Было бы очень полезно, если бы вы могли направить меня по правильному пути и предложить что-нибудь.
Спасибо.
Комментарии:
1. freecode.com/projects/acovea делает что-то подобное
2. Я не уверен, но я помню группу, которая уже выполняла этот подход. Я не могу найти его, быстро взглянув на страницу gcc, возможно, вам следует заглянуть в архив рассылки gcc.
3. Вы можете сгенерировать файл, содержащий список оптимизационных последовательностей, которые вы хотите протестировать
Ответ №1:
Проект Milepost Ctuning работал именно над этим (Григорий Фурсин, Альберт Коэн, оба в INRIA), используя методы машинного обучения для настройки оптимизации GCC.
Вы могли бы использовать расширения GCC MELT для выполнения аналогичного действия.
Ответ №2:
Я думаю, что это категорически доказывает давнее предположение о том, что у GCC слишком много вариантов.
Что касается ответа на ваш конкретный вопрос, я думаю, вы собираетесь делать что-то, что, в конце концов, не имеет большой ценности. Одна из основных проблем заключается в том, что полученный вами ген будет годен только для определенной архитектуры, среды и версии gcc.
Кроме того, я почти уверен, что кто-то, знакомый с GCC, был бы лучше вашего алгоритма в большинстве реальных случаев.
Я не хочу портить ваш парад или что-то в этом роде, это, безусловно, интересное техническое / интеллектуальное упражнение. Я бы написал программу на C / C , которая выводила сценарий оболочки / командную строку, затем запускала результирующий сценарий / командную строку, рассчитывала его и сохраняла время, необходимое для запуска и правильность результата. Некоторые оптимизации могут привести к тому, что определенный код будет выполняться по-другому, что приведет к неправильному результату. Убедитесь, что ваш тестовый пример выводит числовые данные, чтобы вы могли рассчитать, насколько близко ваша оптимизированная программа достигла ожидаемого результата.
Ваши тестовые примеры никогда не будут охватывать достаточно места, здесь, и ваша функция пригодности будет в основном предположительной (поскольку это будет во многом зависеть от того, какие другие процессы были запущены на компьютере в то время и что они делали). Для разработки потребуется много времени.
Комментарии:
1. На самом деле я думал о задержках и проблемах точности, связанных с этим типом приложений, особенно из-за большого количества тестовых примеров. Но помимо этих проблем, возможно ли запрограммировать что-то подобное, минимизируя количество тестовых примеров? И результат сфокусирован на одном типе архитектуры / платформы. У меня не было никаких надежд на эту тему, когда мой старший дал мне проект. Но у меня нет другого выбора, кроме как сделать это. Снова спасибо.
2. Количество используемых вами тестовых примеров является компромиссом между временем, затраченным на выполнение генерации, и точностью результата. Кроме того, размер и сложность каждого тестового примера. Я бы выбрал несколько больших и сложных тестовых примеров, а не множество маленьких и простых, хотя я считаю, что это будет ваш самый низкий уровень издержек и лучший конечный результат (реальный код, скорее всего, будет большим и сложным). Добавьте также один или два небольших параметра, чтобы убедиться, что алгоритм хорошо масштабируется до меньших входных данных (если это ограничение).