Как подчеркнул Линли Гвеннап, главный аналитик компании Linley Group, большая часть современного программного обеспечения написана для одноядерных процессоров, и его придется переписать или модернизировать, чтобы задействовать возможности многоядерных процессоров, предлагаемых Intel, AMD, Sun Microsystems и другими производителями.
По словам Гвеннапа, готовые приложения зачастую работают быстрее на процессорах, имеющих не более четырех ядер, а при увеличении этого числа уровень производительности перестает расти и может даже снизиться. Наличие этой проблемы подтверждает и недавний отчет компании Gartner.
Производители процессоров и систем начали обучать разработчиков и предоставлять им более эффективные инструментальные средства для программирования в расчете на многоядерные процессоры. Год назад Intel и Microsoft объявили о намерении инвестировать 20 млн долл. в создание двух специализированных исследовательских центров в университетах США. По словам Гвеннапа, пожалуй, самая серьезная проблема, с которой сейчас столкнулась отрасль, - отсутствие у большинства разработчиков эффективного инструментария для создания программ, рассчитанных на процессоры с несколькими ядрами.
Есть идея создавать приложения так, чтобы можно было разделять определенные части вычислительной задачи, например расчетную часть или вывод изображения, и одновременно выполнять их на нескольких ядрах. Но эта модель, часто называемая параллельной обработкой, пока зачастую ограничивается специализированными, высокопроизводительными вычислительными средами.
В последние годы Intel и AMD используют увеличенное число ядер как более эффективный с точки зрения энергозатрат способ повышения производительности процессора, кардинально отличающийся от традиционной практики наращивания тактовой частоты. Intel использует восемь ядер в своих новых процессорах Nehalem-EX, а AMD разрабатывает 12-ядерные процессоры для серверов. Одновременно поддерживается многопоточность, что позволяет каждому из ядер работать одновременно с несколькими нитями кода.
Это значит, что все наиболее распространенные приложения необходимо переписать так, чтобы в них использовались возможности дополнительных ядер. Это крайне трудная работа, и она чревата новыми видами программных ошибок. Одна из наиболее распространенных – "состояние гонки" (race conditions), когда результат вычислений зависит от того, в каком порядке будет завершено выполнение разных элементов задачи. Если порядок будет нарушен, могут возникнуть ошибки.
Уже выпущено несколько инструментальных средств для параллельного программирования, в том числе Intel Parallel Studio для Cи и C++. На этом рынке работают и такие компании, как Codeplay, Polycore Software и Clik Arts. Создана новая модель параллельного программирования на базе языка Си, получившая название OpenCL, которая разработана Khronos Group и поддерживается Apple, Intel, AMD, nVidia и рядом других производителей.
Однако работа над многими из этих инструментов далека от завершения, как отметили участники Multicore Expo. Программные компиляторы должны выявлять код, который может быть распараллелен, а затем выполнять работу по его распараллеливанию, без участия программистов, считает Схай Галь-Он, директор по программной инженерии EEMBC, некоммерческой организации, которая разрабатывает тесты на производительность для встроенных процессоров.
Несмотря на отсутствие инструментария, некоторые производители программного обеспечения обнаружили, что относительно просто создавать параллельный код для отдельных видов вычислительных задач, таких как обработка изображений и видео. По словам Гвеннапа, Adobe переписала Photoshop таким образом, чтобы он мог присваивать отдельные задачи, например увеличение и фильтрацию изображения, конкретным ядрам x86, что позволяет увеличить производительность в три–четыре раза.
"Разным центральным процессорам можно назначить обработку разных наборов пикселов и тем самым добиться высокого уровня параллелизма", - заметил он. Но в случае более сложных задач трудно найти единый подход, позволяющий выявить последовательности вычислений, которые можно было бы распараллелить, а затем разделить.
Несмотря на то, что возможно, самые серьезные проблемы связаны с программированием, необходимы и аппаратные изменения, чтобы преодолеть такие проблемы, как задержка при доступе к памяти и низкие скорости шины. "По мере добавления все новых центральных процессоров на микросхему потребуется полоса пропускания при доступе к памяти, позволяющая это поддерживать", - подчеркнул Гвеннап.
Совместное использование одной кэш-памяти или шины данных несколькими ядрами может привести к возникновению узких мест, и большая часть ресурсов дополнительных ядер будет расходоваться впустую. "Шесть или восемь центральных процессоров будут тратить все свое время на 'переговоры' друг с другом, и никакая работа выполняться не будет", - заметил он.
В конечном итоге основное бремя может лечь на плечи разработчиков, которые должны будут устранить дисбаланс между аппаратным и программным обеспечением, чтобы создавать более эффективные параллельные программы. Многие не в состоянии угнаться за последними разработками в аппаратной архитектуре, как заметил Галь-Он. По его словам, им придется смотреть таблицы данных и изучать архитектуру процессоров, чтобы понять, как сделать так, чтобы код мог работать лучше.