Какой язык / платформу вы бы порекомендовали для приложений с привязкой к процессору? - PullRequest
5 голосов
/ 12 октября 2008

Я занимаюсь разработкой неинтерактивного приложения с привязкой к процессору, которое выполняет только вычисления, почти без ввода-вывода. В настоящее время он работает слишком долго, и в то время как я работаю над улучшением алгоритма, я также думаю, может ли это дать какую-либо пользу для изменения языка или платформы. В настоящее время это C ++ (без ООП, поэтому почти C) в Windows, скомпилированных с помощью компилятора Intel C ++. Может ли переключение на ASM помочь и насколько? Может ли помочь переход на Linux и GCC?

Ответы [ 22 ]

15 голосов
/ 12 октября 2008

Просто чтобы быть тщательным: первое, что нужно сделать, это собрать данные профиля, а второе, что нужно сделать, это рассмотреть ваши алгоритмы. Я уверен, что вы это знаете, но они должны быть включены в любое обсуждение программирования производительности.

Чтобы ответить на ваш вопрос "Может ли помочь переход на ASM?" ответ: «Если вы не знаете ответ на этот вопрос, то, вероятно, нет». Если вы не очень хорошо знакомы с архитектурой процессора и его входами и выходами, маловероятно, что вы будете выполнять работу значительно лучше, чем хороший оптимизирующий компилятор C / C ++ в своем коде.

Следующее, что нужно сделать, - это то, что значительное ускорение вашего кода (кроме алгоритмических улучшений) почти наверняка будет вызвано параллелизмом, а не линейным увеличением. Настольные машины теперь могут использовать 4 или 8 ядер для выполнения задачи, которая имеет гораздо больший потенциал производительности, чем чуть лучший генератор кода. Поскольку вам удобно с C / C ++, OpenMP в значительной степени прост; это очень легко использовать для распараллеливания ваших циклов (очевидно, вы должны следить за зависимостями, переносимыми циклами, но это определенно «самый простой параллелизм, который мог бы работать»).

Сказав все это, качество генерации кода различается в разных компиляторах C / C ++. Компилятор Intel C ++ высоко ценится за качество оптимизации и имеет полную поддержку не только для OpenMP, но и для других технологий, таких как Threading Building Blocks.

Если перейти к вопросу о том, какие языки программирования могут быть даже лучше, чем C ++, ответ будет «языки программирования, которые активно продвигают / облегчают концепции параллелизма и параллельного программирования». Эрланг в этом отношении - самый важный момент, и сейчас он является «горячим» языком, и большинство людей, интересующихся программированием производительности, обращают на него хоть какое-то внимание, поэтому, если вы хотите улучшить свои навыки в этой области, вы можете хочу проверить это.

14 голосов
/ 12 октября 2008

Это всегда алгоритм, редко язык. Вот моя подсказка: «пока я работаю над улучшением алгоритма».

Тонкой настройки может быть недостаточно.

Рассмотрим радикальные изменения в алгоритме. Вы должны устранить обработку, а не заставлять обработку идти быстрее. Виновником часто является «поиск» - перебор данных, ищущих что-то. Найти способы устранения поиска. Если вы не можете устранить это, замените линейный поиск каким-либо видом дерева поиска или какой-либо хэш-картой.

6 голосов
/ 12 октября 2008

Переключение на ASM не очень поможет, если вы не очень хороши в этом и / или у вас нет особой рутины критического пути, которая, как вы знаете, может быть лучше. Как отметили несколько человек, современные компиляторы в большинстве случаев лучше используют преимущества кэширования / и т.д. чем любой может сделать вручную.

Я бы предложил:

  • Попробуйте другой компилятор и / или другие варианты оптимизации
  • Запустите утилиту покрытия / анализа кода, выясните, где находятся критические пути, и поработайте над их оптимизацией в коде

C ++ должен обеспечить максимальную производительность кода, поэтому я бы не рекомендовал переключать язык. В зависимости от приложения вы можете добиться более высокой производительности в системах с несколькими кодами / процессорами, используя несколько потоков, в качестве другого предложения.

4 голосов
/ 12 октября 2008

Хотя простое переключение на asm не даст никаких преимуществ, поскольку компилятор Intel C ++, вероятно, лучше оптимизирует, чем вы, вы можете попробовать один из следующих вариантов:

  • Попробуйте компилятор, который будет распараллеливать ваш код, например VectorC компилятор.
  • Попробуйте переключиться в asm с интенсивным использованием MMX, 3DNow !, SSE или чего-либо еще, что соответствует вашим потребностям (и вашему ЦП). Это даст больше пользы, чем чистая асма.
  • Вы также можете попробовать GPGPU, то есть выполнить большую часть вашего алгоритма на GPU вместо CPU. В зависимости от вашего алгоритма, он может быть значительно быстрее.

Редактировать: я также второй подход профиля. Я рекомендую AQTime , который поддерживает компилятор Intel C ++.

3 голосов
/ 12 октября 2008

Попробуйте Fortran 77 - когда дело доходит до вычислений, ничто не сравнится с дедушкой языков программирования. Кроме того, попробуйте это с OpenMP, чтобы использовать преимущества нескольких ядер.

3 голосов
/ 12 октября 2008

Ручная оптимизация кода ASM по сравнению с тем, что может сделать для вас C ++, редко бывает экономически эффективной.

Если вы сделали все, что могли для алгоритма с традиционного алгоритмического представления, и вы также устранили лишние, то вы можете быть либо SOL, либо , вы можете подумать об оптимизации вашей программы с аппаратной точки зрения. вид.

Например, каждый раз, когда вы следите за указателем в куче, вы платите огромные расходы из-за пропусков кэша, возможного подкачки страниц и т. Д., Которые все влияют на прогнозы ветвления. Большинство программистов (даже гуру C) склонны смотреть на процессор с функциональной точки зрения, а не за кулисами. Иногда реорганизация памяти, например, путем «выравнивания» или выделения памяти вручную для размещения на одной странице, может привести к ОГРОМНОМУ ускорению. Мне удалось получить 2-кратное ускорение при обходе графа, просто сгладив мои структуры.

Это не то, что ваш компилятор сделает для вас, поскольку они основаны на вашем высоком понимании программы.

3 голосов
/ 12 октября 2008

Лично я бы посмотрел на языки, которые позволяют вам легче всего воспользоваться преимуществами параллелизма, если только это не полностью непараллельная ситуация. Возможность использовать некоторые дополнительные сердечники и получить (если возможно!) Почти линейное улучшение может оказаться намного более экономически выгодным, чем выжать лишние несколько процентов эффективности.

Когда дело доходит до распараллеливания, я считаю, что функциональные языки часто рассматриваются как лучший способ, или вы можете взглянуть на OpenMP для C / C ++. (Лично я, как парень, владеющий языком управления, смотрел на библиотеки для Java / .NET, но я прекрасно понимаю, что не у всех одинаковые предпочтения!)

2 голосов
/ 12 октября 2008

Как сказал Лобриен, вы не дали нам никакой информации, чтобы сообщить, поможет ли оптимизированный вручную код ASM ... что означает, что ответ, вероятно, "еще нет".

Вы запускаете свой код с помощью профилировщика?

Знаете ли вы, если код работает медленно из-за ограничений памяти или процессора?

Используете ли вы все доступные ядра?

Вы определили какие-либо алгоритмы, которые вы используете, которые не O (1)? Можете ли вы получить их O (1)? Если нет, то почему нет?

Если вы все это сделали, насколько вы контролируете среду, в которой работает ваша программа? (вероятно, много, если вы думаете о переключении операционных систем) Можете ли вы отключить другие процессы, дать вашему процессу наивысший приоритет и т.д. Как насчет просто найти машину с более быстрым процессором, большим количеством ядер или большим объемом памяти (в зависимости от того, на чем вы ограничены)

И еще и еще.

Если вы уже сделали все это и даже больше, вполне возможно, что вы попадете в точку, в которой вы думаете: «Интересно, могли бы эти несколько строк кода прямо здесь быть оптимизированы лучше, чем сборка, которую я глядя на отладчик прямо сейчас? И в этот момент вы можете спросить конкретно.

Удачи! Вы решаете проблему, которую интересно решить.

1 голос
/ 29 января 2009

Как уже намекнул Oregonghost - может помочь компилятор VectorC. Хотя он не распараллеливает код, но вы можете использовать его для использования расширенных наборов команд, таких как mmx или sse. Я использовал его для наиболее критичных ко времени деталей в механизме рендеринга программного обеспечения, и это привело к ускорению на 150-200% на большинстве процессоров.

1 голос
/ 12 октября 2008

Сначала выясните, можете ли вы изменить алгоритм, как предложил С. Лотт.

Если выбор алгоритма верен, вы можете посмотреть шаблоны доступа к памяти, если у вас много данных, которые вы обрабатываете. В наши дни для многих приложений, ограничивающих число, они связаны шиной памяти, а не ALU. Недавно я оптимизировал код, который имел вид:

// Assume N is a big number
for (int i=0; i<N; i++) {
  myArray[i] = dosomething(i);
}
for (int i=0; i<N; i++) {
  myArray[i] = somethingElse(myArray[i]);
}
...

и преобразовал его так:

for (int i=0; i<N; i++) {
  double tmp = dosomething(i);
  tmp = somethingElse(tmp);
  ...
  myArray[i] = tmp;
}
...

В данном конкретном случае это привело к ускорению в 2 раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...