2013-11-18 5 views
0

Dont имеют большой опыт работы в Linux, у меня есть хорошо проверенный код, не получайте ошибки/предупреждения от MSVC, ICC, безупречно работать и на платформе Windows.Чрезвычайно медленный режим отладки?

Затем я скопировал эти коды в свою недавно установленную систему Linux (Ubuntu 13.10 с GCC 4.8.1), после чего я установил последнюю версию eclipse (3.8.1 или около того) с CDT и настроил ее с помощью компилятора GCC системы.

Eclipse CDT/GCC отлично работает со всеми тривиальными тестовыми кодами, которые я написал, затем я попрошу GCC собрать большую часть проверенного кода из Windows.

GCC скомпилировал его с ошибками NO и NO предупреждает, и программа работает нормально с тривиальными рабочими нагрузками, однако, как только я даю программе некоторую полезную нагрузку в реальном мире, она в основном freezen, навсегда завершается (когда в Windows, та же программа может завершить «реальную» полезную нагрузку за считанные секунды).

Может ли кто-нибудь сказать мне, что я должен исправить, или GCC - это то, что медленнее в режиме отладки (я имею в виду, по меньшей мере, на 2-3 величины медленнее, чем режим отладки ICC/MSVC), спасибо.

Уровень оптимизации компиляции устанавливается равным O3 для режима деблокирования, а также по умолчанию (без оптимизации или, по крайней мере, того, что я считаю) для режима отладки.

Проблема заключается в том, что я чувствую, что алгоритм ICC/MSVC в режиме отладки (без оптимизации) работает намного быстрее (я имею в виду, что-то вроде 1000 раз быстрее), чем GCC.

UPDATE: (На данный момент, кажется, я не могу сделать комментарий на StackOverflow, так что я должен положить ответы здесь, извините):

АМС: Ну, я подождать несколько минут, увидеть программу еще работает I просто прервите его, поэтому я не знаю, может ли программа закончить или нет. Однако, пока полезная нагрузка очень мала, она может закончить ее в обычном режиме.

Что касается узкого места кода, ну, я думаю, его память ограничена.

Большая часть времени (80 +%) кода выполняет некоторую сортировку radix с большим массивом входных данных, оптимизированный код сортировки radix, который я написал, может сортировать 200-300 миллионов 32-битных значений с плавающей запятой в секунду в Windows , но с тем же аппаратным обеспечением, в Linux, по-видимому, потребуется несколько часов, если не навсегда, чтобы отсортировать около 10 миллионов массивов данных длины.

UPDATE:

Спасибо за помощь все, что вам людей, я понял, что проблема заключается в некотором макросе я перепутались с Linux, теперь все работает отлично.

+0

Какие флаги оптимизации вы используете с ICC и GCC? В какой части есть затмение? Какие системные вызовы используются вашей программой? – iveqy

+0

Что такое узкое место, процессор, диск ввода-вывода или что? –

+3

Вы говорите, что это * никогда * не завершается, или вы говорите, что оно завершено, но занимает много времени? – ams

ответ

1

У вас есть три варианта:

  • Включить ведение журнала, чтобы увидеть, что делает этот код. Если у вас нет регистрации, добавьте ее.
  • Используйте профилировщик для сбора информации о том, где потрачено время. Посмотрите на valgrind. Я немного обеспокоен тем, что ваше приложение никогда не заканчивается; не уверен, справится ли это с valgrind.
  • Используйте отладчик и прервите свою программу через некоторое время, чтобы посмотреть, что он делает.Повторяйте до тех пор, пока не увидите картину
+0

Да, большинство профайлеров ничего полезного не делает, если программа никогда не выходит. Я бы пошел по маршруту отладчика. – ams

+0

+1 для 3-й пули. –

1

Я согласен с теми, кто говорят, что запустить его под отладчиком, как gdb и прерывать ее с помощью Ctrl-C (в выходном окне программы). Затем в gdb скажите thread 1, чтобы получить его в активную тему. Затем скажите bt, чтобы получить трассировку стека. Затем просмотрите каждую строку кода, набрав up и down (и данные, если необходимо, набрав p variablename) в стек, чтобы вы точно поняли, почему он делал то, что он делал в то время, когда вы его прервали.

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

(Примечание: нет необходимости 1. рассматривать это как проблему измерения, или 2. пытаются различать бесконечный цикл или просто затянувшийся.)

Это random-pausing технику.

+0

Разница между бесконечным циклом (или блоком) и длительным заданием - это разница между логической ошибкой и проблемой оптимизации. Он также определяет, интересен ли профилировщик или нет. Сначала я пошел на случайный пауза-маршрут. – ams

+0

@ams: Является ли программа, которая должна занимать 1 секунду, работает только год или навсегда, не кажется мне огромной разницей. Но это только я :) –

+0

LOL, долгое время я думал больше как 5 минут. В течение года была бы эффектно оптимизированная оптимизация, если бы она могла достичь этого, фактически не сломавшись. – ams

0

В дополнение ко всем другим советам я хотел бы упомянуть, что GCC предлагает new compiler flag -Og, который должен улучшить производительность отладочных сборников.

0

Использовали ли вы «верх» или другую команду/инструменты для мониторинга ресурсов системы (распределения) системы ..., чтобы получить больше информации о потреблении памяти и нагрузке на процессор во время обработки?

С помощью отладчика, такого как «gdb» (который отлично работает в Linux), вы можете добавлять (и удалять) условные и безусловные точки останова и проходить через код (после создания исполняемого файла отладки). Я использую «gdb» как интегрированный в Eclipse, который предоставляет вам несколько видов в процессе выполнения (например, кнопки и окно консоли). Вы также можете добавить дополнительные инструкции для печати тестовых кодов, которые по умолчанию пересылаются в окно консоли.

С помощью отладчика можно определить, где, в каком подпроцессе потребляется столько времени/ресурсов , Определив это, вы можете сосредоточиться на решении этой проблемы/нерегулярности/ошибки/ресурса.

Вы также запустили свой исполняемый файл в режиме отладки («запустить» вместо «debug»)? Если да, вы можете сравнить относительные «показатели».

Смежные вопросы