Самый быстрый способ запустить программу в 64-битной среде? - PullRequest
2 голосов
/ 16 октября 2010

Прошло несколько десятилетий с тех пор, как я занимался программированием.На самом деле, последний раз, когда я программировал, находился в среде MS-DOS перед выпуском Windows.У меня была эта идея программирования, которую я хотел попробовать в течение нескольких лет, и я думал, что попробую.Количество расчетов огромно.Следовательно, я хочу запустить его в самой быстрой среде, доступной для обычного программиста-хобби.

Я буду использовать 64-битную машину.В настоящее время он работает под управлением Windows 7. Несколько лет назад программа работала намного медленнее в среде Windows, чем в режиме MS-DOS.Мой личный опыт программирования был на языках Фортран, Паскаль, Базовый и машинном языке для процессоров серии 6800 Motorola.Я в принципе готов попробовать что угодно.Я тоже дурачился с Ubuntu.Нет возражений против изучения нового.Просто хочу воспользоваться скоростью.Я бы предпочел не тратить деньги на этот проект.Поэтому я ищу бесплатный или очень близкий к бесплатному компилятору.Я скачал Microsoft Visual Studio C ++ Express.Но у меня есть ощущение, что готовый скомпилированный код нужно будет запускать в среде Windows.Что, я уверен, значительно замедляет скорость обработки.

Поэтому я ищу идеи или указатели на то, что доступно.

Спасибо,

Хорошего дня!Jim

Ответы [ 8 ]

8 голосов
/ 17 октября 2010

Скорость обычно поставляется с ценой переносимости или сложности.

Если ваша программная идея требует большого количества вычислений, то, если вы используете процессор Intel, вы можете использовать компилятор Intel, который может извлечь выгоду из некоторых скрытых функций процессора, которые могут сделать вашу программу быстрее. В противном случае, если вашей целью является переносимость, используйте GCC (GNU Compiler Collection), который может кросс-компилировать хорошо оптимизированный исполняемый файл практически для любой платформы, доступной на земле. Если ваши вычисления могут быть распараллеливаемыми, то вы можете рассмотреть методы SIMD (однократный ввод нескольких данных) и GPGPU / CUDA / OpenCL (использование графической карты для вычислений).

Однако я бы порекомендовал вам сначала попробовать свою идею на более простых языках, например, Python, Java, C #, Basic; и посмотрим, достаточно ли хорошая скорость. Поскольку вы никогда не программировали в течение десятилетий, скорее всего, ваше восприятие огромных вычислений в настоящее время незначительно из-за увеличения скорости процессора и оперативной памяти. В настоящее время нет заметной разницы в работе в среде графического интерфейса и командной строки.

8 голосов
/ 17 октября 2010

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

Простой факт заключается в том, что если вы не программировали в течение 20 лет, у вас не будет реалистичной картины производительности вообще. Вы должны сделать, как и большинство людей, - начать с легкого в изучении, но не очень быстрого языка программирования, такого как C #, создать программу, затем доказать, что она работает слишком медленно, затем выполнить несколько проходов оптимизации с помощью таких инструментов, как профилировщики, и тогда вы можете решить язык слишком медленный Если вы не написали ни одной строки кода в течение двух десятилетий, большая вероятность состоит в том, что любая написанная вами программа будет медленной, потому что вы начинающий программист с современных точек зрения, а не из-за выбора языка или среды. Создание приложений с высокой производительностью требует детального понимания целевой платформы, а также языка выбора и операций программы.

Я бы определенно рекомендовал Visual C ++. Express Edition является бесплатным, и Visual Studio 2010 может создавать неоправданно быстрый код. Windows не является медленной платформой - даже если вы написали свою собственную операционную систему вручную, она, вероятно, будет медленнее, и даже если вы создадите более быструю, выигрыш в производительности будет незначительным, если вашей программе не потребуются дни или недели для выполнения одного выполнения. .

3 голосов
/ 17 октября 2010

Отступление: то, что ОС не имеет значения для производительности, в общем , очевидно, ложно. Ссылка на загрузку ЦП во время простоя мне кажется довольно «своеобразной» идеей: конечно, можно надеяться, что когда не выполняется ни одно задание, ОС не тратит впустую энергию. В противном случае измеряют скорость / пропускную способность ОС, когда она предоставляет услугу (т. Е. Обеспечивает доступ к оборудованию / ресурсам).

Чтобы избежать назойливой MS Windows против Linux против Mac OS X битва, я буду ссылаться на концепцию исследовательской ОС: exokernels . Суть exokernels заключается в том, что традиционная ОС является не только посредником для доступа к ресурсам, но и реализует политики . Такие политики не всегда способствуют повышению производительности вашего режима доступа к ресурсу. С концепцией exokernel исследователи предложили « уничтожить все абстракции операционной системы » (.pdf), сохранив за собой роль мультиплексора. Таким образом :

& hellip; Результаты показывают, что обычные немодифицированные приложения UNIX могут пользоваться преимуществами exokernels: приложения либо работают сравнимо с Xok / ExOS и BSD UNIX, либо работают значительно лучше. Кроме того, результаты показывают, что настраиваемые приложения могут существенно выиграть от контроля над своими ресурсами (например, с коэффициентом 8 для веб-сервера). & Hellip;

Таким образом, обходя обычные политики доступа к ОС, которые они получили для настроенного веб-сервера, увеличение производительности составило около 800%.

Возвращаясь к исходному вопросу: * обычно верно, что приложение выполняется без или незначительными издержками ОС, когда:

  • имеет ядро ​​ с интенсивными вычислениями , где такое ядро ​​не вызывает API-интерфейс ОС;
  • памяти достаточно или доступ к данным осуществляется таким образом, чтобы не вызывать чрезмерного подкачки;
  • все несущественные службы, работающие в одних и тех же системах, отключены.

Возможны и другие факторы, в зависимости от оборудования / ОС / приложения.

Я предполагаю, что ОП верен в грубой оценке требуемой вычислительной мощности . ОП не определяет природу таких интенсивных вычислений, поэтому трудно давать предложения. Но он написал:

Сумма Расчеты огромны

«Вычисления», по-видимому, намекают на вычислительно-интенсивное ядро ​​, для которого, я думаю, требуется скомпилированный язык или - быстрый интерпретируемый язык с операторами нативных массивов, например APL , или современный вариант, такой как J , A + или K (потенциально, по крайней мере: я не знаю, используют ли они преимущества современного аппаратное обеспечение).

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

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

Для параллельной части, если такая программа поддается распараллеливанию (помните как закон Амдала и закон Густафсона ), существуют различные виды параллелизма рассмотрим (они не являются взаимоисключающими):

  • Параллелизм на уровне инструкций : об этом заботится аппаратная часть / компилятор;
  • параллелизм данных :
    • битовый уровень: иногда для такого параллелизма используется акроним SWAR (SIMD в регистре A) .Для задач (или некоторых их частей), где может быть сформулировано представление данных, которое может быть отображено на битовые векторы (где значение представлено 1 или более битами);поэтому каждая инструкция из набора команд потенциально является параллельной инструкцией, которая работает с несколькими элементами данных (SIMD).Особенно интересно на машине с 64-битными (или большими) регистрами.Возможно на CPU и некоторых GPU .Поддержка компилятора не требуется;
    • мелкозернистый средний параллелизм: ~ 10 операций параллельно на процессорах x86 с SIMD расширениями набора команд, такими как SSE преемники, предшественники и тому подобное;требуется поддержка компилятора;
    • мелкозернистый массивный параллелизм: сотни операций параллельно на GPGPU (с использованием обычных графических карт для вычислений общего назначения), программируемых с помощью OpenCL (открытый стандарт), CUDA (NVIDIA), DirectCompute (Microsoft), BrookGPU (Стэнфордский университет) и Intel ArrayСтроительные блоки .Требуется поддержка компилятора или использование выделенного API.Обратите внимание, что некоторые из них также имеют серверные части для инструкций SSE:
    • грубый скромный параллелизм (на уровне потоков, а не отдельных команд): это не является необычным для CPU на текущемнастольные ПК / ноутбуки, чтобы иметь более одного ядра (2/4) в одном и том же пуле памяти ( shared-memory ).Стандарт для параллельного программирования с общей памятью - OpenMP API , где, например, в C / C ++, директивы #pragma используются вокруг циклов.Если я не ошибаюсь, это можно считать параллелизмом данных, эмулируемым поверх параллелизма задач;
  • параллелизм задач : каждое ядро ​​в одном (или нескольких) процессорах (s) имеет свой независимый поток выполнения и, возможно, работает с различными данными.Здесь можно использовать понятие «поток» напрямую или модель программирования более высокого уровня, которая маскирует потоки.Я не буду вдаваться в детали этих моделей программирования здесь, потому что очевидно это не то, что нужно OP.

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

3 голосов
/ 17 октября 2010

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

Windows, как полагают некоторые, не потребляет 50% вашего процессора.Он может съесть 0,5%, но так же, как и Linux и OSX.И если бы вам пришлось отказаться от всех существующих ОС и вместо этого написать свою с нуля, вы бы получили ошибочную, менее работоспособную ОС, которая также потребляет немного процессорного времени.

На самом деле, среда не имеет значения .

Что делает важно то, на каком оборудовании вы запускаете программу (и здесь, при запуске ее на GPU)возможно, стоит подумать) и насколько хорошо вы используете аппаратное обеспечение (параллелизм является обязательным условием, если вы хотите использовать современное аппаратное обеспечение).

Какой код вы пишете, и как вы его компилируете, имеет значение.Аппаратное обеспечение, на котором вы работаете, имеет значение.Выбор ОС не делает.

2 голосов
/ 17 октября 2010

Просто мои два цента о DOS против Windows.

Несколько лет назад (что-то вроде 1998?), У меня было такое же предположение.

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

Друг предложил переписать эту вещь в Visual Basic.Я возразил, потому что, вы знаете , все эти штуковины, виджеты и модные окна, вы знаете , будут замедлять выполнение вы знаете , важныйcode.

Версия Visual Basic настолько превзошла версию QBasic, что стала приложением по умолчанию (Я не буду упоминать «эй, даже в VBA в Excel вы выигрываете» из-за моих раненыхгордость, но ...) .

Дело в том, что это часть "вы знаете".

Вы не знаете.

ОС здесь не важна.Как объяснили другие в своих ответах, выберите свое оборудование и выберите свой язык.И пишите свой код понятным способом, потому что теперь компиляторы лучше оптимизируют разработчиков кода, если вы не Джон Кармак ( преждевременная оптимизация - корень всех зол ).

Тогда, если вы не удовлетворены результатом, используйте профилировщик для проверки вашего кода.Подумайте о многопоточности (которая поможет вам, если у вас несколько ядер ... TBB приходит на ум).

1 голос
/ 17 октября 2010

Что вы пытаетесь сделать? Я считаю, что все вещи должны быть скомпилированы в 64-битном режиме по умолчанию. Компьютеры стали намного быстрее. Скорость не должна быть проблемой по большей части.

Примечание: Что касается сложных вычислений, вы можете посмотреть OpenCL или CUDA OpenCL и CUDA используют преимущества графического процессора, который может передавать много информации одновременно по сравнению с процессором.

0 голосов
/ 19 октября 2010

Я оригинальный постер этой темы.

Я еще раз повторяю, что в этой программе будет огромное количество вычислений.

Windows & Ubuntu - это многозадачные среды. Есть запущенные процессы, и многие из них используют ресурсы процессора. Правда многие из них считаются неактивными. Но все же среда Windows по природе многозадачности постоянно отслеживает необходимость запуска каждого процесса. Например, в настоящее время в диспетчере задач Windows отображается 62 процесса. По словам менеджера задач, три потребляют ресурсы процессора. Итак, у нас есть три текущих процесса, которые потребляют процессорную обработку. Есть дополнение 59, показывающее активную, но не потребляющую процессорную обработку. Итак, Windows контролирует 63, а затем есть Windows, которая также проверяет различные вещи.

Я надеялся найти какой-нибудь способ, позволяющий просто запускать программу на уровне «голой машины». Боковой шаг со всей вовлеченностью Windows (Ubuntu).

Идея очень трудоемкая.

Спасибо всем, что нашли время ответить.

Хорошего дня, Jim

0 голосов
/ 17 октября 2010

Если ваши последние ориентиры - это M68K и ПК с DOS, то я бы посоветовал вам начать с C / C ++ на современном процессоре и ОС. Если вы столкнулись с проблемами производительности и можете доказать, что они вызваны работой в Linux / Windows или что кода, сгенерированного компилятором / оптимизатором, недостаточно, вы можете посмотреть на другие операционные системы и / или ASM с ручным кодом. Если вы ищете бесплатно, Linux / gcc - хорошее место для начала.

...