Вычислительно эффективный С++ - общее чтение
Моя работа в основном связана с высокоэффективными "научными" вычислениями. Я занимаюсь этим уже 15 лет, но только недавно понял, что мое программное обеспечение тратит время на сборку. Короче говоря: мои способы написания эффективного кода на С++ больше не работают.
Время от времени я вижу фрагмент кода, написанный каким-то ребенком, который делает в основном те же вычисления, что и мой (тот же алгоритм, похожий подход), но - волшебным! - выполняет намного быстрее. В большинстве случаев я даже не могу отслеживать происхождение разницы!
Мой вопрос: как я могу научиться искусству современной оптимизации кода на С++? Возможно, что-то в SSE, проблемах с кешированием/памятью? Любое предложение книги, PDF, статьи, упражнения или веб-сайта приветствуется!
PS. Я хорошо знаю трюки, которые либо:
- Слишком общий (например, "Использовать профилировщик", "Использовать хорошие алгоритмы", "Перейти к многопоточному" )
- Тривиальный (например, "Избегайте виртуальных функций", "Do ++ я вместо я ++", "Enable -O3" )
- Сомнительный (например, "Повторное использование памяти с reinterpret_cast < > ", "Tabularize sine и cosine", "Write inline assembly" )
- Смешно (например, "Сделать шаблон метапрограммирование" )
Это не, о чем я прошу.
Ответы
Ответ 1
Я тоже работаю в научных вычислениях, хотя довольно долго, чем OP и в основном в Fortran. здесь небольшой совет из моего опыта;
1) Будьте в курсе того, что могут делать компиляторы. С одной стороны, не пытайтесь превзойти компилятор при оптимизации трюков, о которых компилятор знает, с другой стороны, знать, что компиляторы все еще не подходят. Например, прямо сейчас я думаю, что я могу сделать лучшую работу, чем мой компилятор при черепице цикла. Узнайте также, как упростить компилятор для оптимизации кода.
OP будет испытывать соблазн передать эту точку в качестве примера совета, который является слишком общим для использования. Я вижу, что руководство для компилятора Intel С++ содержит около 800 страниц документации по параметрам компилятора и еще 400 для оптимизации приложений. Имеет ли OP все это (или аналогичное количество документации для предпочтительного компилятора)?
2) Будьте в курсе архитектуры компьютера, в частности, с конструкцией иерархии памяти и fpus. Если ничего другого, это поможет понять, каковы могут быть пределы производительности, которые могут быть разумными. Но он также вносит вклад в решения по разработке и реализации программ и указывает на то, как эти решения должны меняться, когда программы переносятся на следующее поколение аппаратного обеспечения.
3) Используйте библиотеки. Напишите код в крайнем случае.
4) Не делайте пух-пух идей, таких как метапрограммирование шаблонов, которые имеют очень хорошую репутацию, помогая программисту создать быстрый код. Исследование Boost и Blitz.
5) Эффективность программы - это эмпирическая дисциплина. Верьте только данные, а не аргументы. Даже не аргумент, сделанный мной.
Наконец, даже при крупномасштабных высокопроизводительных вычислениях (мои самые большие задания работают в течение нескольких дней на 10K-процессорах, и тем более я немного об этом знаю), иногда оптимизация - это время разработки, а не время выполнения.
PS Вы спросили ребенка для обучения?
Ответ 2
Процессоры намного быстрее, чем 15 лет назад. Память не распространяется в скорости с той же скоростью. Это в сочетании с большими наборами данных, особенно в крупных научных симуляциях, означает, что вам нужно немного подумать о том, как обращаться к данным. Возможно, это одна из отличий.
Я нашел эти статьи интересными:
http://overbyte.com.au/2011/10/21/optimisationmasterclass1/
http://overbyte.com.au/2011/11/10/optimisation-lesson-2/
Они написаны парнем, которого я знаю, кто написал игровые движки и который теперь оптимизирует игры для PS3. Вы можете найти их полезными.
Ответ 3
Я не могу назвать этого парня "ребенком", но вы можете счесть полезным этот курс: Advanced STL
из MSDN Channel9 Лекции Стефана Т Лававей (член команды VС++ и сопровождающий STL там). Качество видео, однако, плохо на моей стороне. Возможно, вам повезет больше.
Ответ 4
Книга "Компьютерная архитектура - количественный подход" хенсеи и паттерсон. Не специально предназначено для С++, но еще более важно для общей архитектуры. Это важно для HPC даже больше, чем любой "трюк и советы".
Ответ 5
Лог время назад я прочитал две книги, которые помогли мне:
- Эффективные методы программирования производительности на С++ Bulka и Meyhew
- Более эффективный С++
Кроме того, периодически посещайте BrDobbs и, конечно же, stackoverflow!!!
Ответ 6
Не забывайте об обработке сетки. Длинные вычисления могут выполняться через несколько процессоров или несколько потоков.
Это один из современных способов улучшить время вычисления.
Другие, как правило, являются стандартными:
- эффективное использование кеширования
- эффективное использование ленивой оценки
и избегая блокировки/разблокировки, выполняя все это.