Вычислительно эффективный С++ - общее чтение

Моя работа в основном связана с высокоэффективными "научными" вычислениями. Я занимаюсь этим уже 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

Не забывайте об обработке сетки. Длинные вычисления могут выполняться через несколько процессоров или несколько потоков.

Это один из современных способов улучшить время вычисления.

Другие, как правило, являются стандартными: - эффективное использование кеширования - эффективное использование ленивой оценки

и избегая блокировки/разблокировки, выполняя все это.