Хоть сейчас процессоры и мощьнее чем раньше при тех же частотах, но основной прорыв в вычислительной мощьности какраз в кол-ве ядер. А вот само ядро как физический исполнитель комманд в скорости не сильно убыстрилось. А CCP какраз работает в одном потоке, а следовательно все эти 3-4 кратные увеличения мощьности за счёт ядер их не коснулись.
Да, оптимизация архитектуры ядер и их вычислительные способности увеличиваются - особенно что качается математики, всяких SSE & Co. Но обычному коду, который тупо исполняет логику и работу с данными это пофигу - такому коду важна частота процессора. Потому что скопировать данные из переменной А в переменную Б занимает N циклов и никакие оптимизации тут не сделаешь - потому что это работа с памятью. А та часть вычислений, которая всё же происходит, в EVE достаточно мала и хорошо оптимизированна и так - CCP об этом писали в девблоге, что физический движок Destiny на самом деле занимает малую часть ресурсов.
Что касается распаралеливания. У CCP и так в кластере все сервисы разнесены по нодам - Inventory, Market, SOL, etc - в девблоге это описывалось - список там не маленький. Т.е. по сути у них и так уже в общем-то всё что можно было - распределено. А ядро, которое отвечает за обработку движений и взаимодействий в космосе очень сложно, если вообще реально, распаралелить. Разделив на несколько потоков взаимодействие столкнёшься с проблемой синхронизации данных и блокировками операций над объектом. К примеру:
Есть два шипа - А и Б. Система обсчитывает всё раз в секунду. Представим что у нас распаралелена обработка дамага и откачки.
Они ведут бой. Шип А на грани смерти и у него врубается очередной цикл шилдбустера. В этот момент в него влетает очередной залп противника.
Если обсчитать залп первым - шип взорвётся. Если шилдбустер - останется живой, т.к. откачалось больше чем дамага вошло.
Как определить что произошло первым? Нужно делать какую-то систему, которая позволила бы это сделать и синхронизировать события между двумя потоками и обработать в правильном порядке.
В итоге получается ситуация, что мы больше тратим времени на синхронизацию (передача данных между потоками не такая тривиальная штука, как кажется. Это довольно долго) чем на сами вычисления. Если взять одну и туже мощьность - то с вероятностью 50% станет только хуже от распаралеливания. Иногда даже сильно хуже. Т.е. можно распаралелить программу, но выигрыш получить 10-15%, а то и вообще негативный эффект получить.
Паралельное программирование штука весьма сложная и слабо развитая ещё. + некоторые вещи принципиально не паралелятся вообще никак.
Сообщение отредактировал Psihius: 17 June 2011 - 16:57