Могут ли быть внесены какие-либо изменения в ЦП, чтобы они работали лучше для одновременных сред выполнения, таких как Rust? Например, есть ли изменения в реализациях прогнозирования ветвлений или размерах кэша, которые могли бы помочь одновременным выполнениям?
У меня сложилось впечатление, что текущие конструкции ЦП могут быть оптимизированы в большей степени для процедурных сред выполнения, таких как C. Если бы вместо этого мы собирались оптимизировать параллельные среды выполнения, как бы ЦП выглядели иначе?
Для этого прогноз ветвлений был реализован на основе обобщений, сделанных в научных работах и анализирующих процедурные коды. Мне интересно, добавит ли абстракция параллелизма значительный рабочий набор к среде выполнения, что отрицательно скажется на существующих алгоритмах прогнозирования ветвлений. Например, предсказание в цикле for - это одно, но когда целью ветви всегда является какая-то новая часть памяти (графическая, текстовая и т. Д.), Это всегда будет пропуском кэша, и никогда не будет перехода история для этого - потому что ни один еще не коснулся этого.
Это, вероятно, глупый вопрос, потому что контент, хотя он всегда может быть в ОЗУ, будет разветвлен на порядок меньше, чем он будет использоваться (как только он будет загружен в кэш) ... но все же, там должна быть наблюдаемой временной границей с контекстами, хранящимися в кэш-памяти и предикторах ветвления в процедурной среде выполнения, что будет проявляться как граница абстракции в более параллельной среде. Поэтому мне интересно ... Были ли соблюдены эти границы? Какие-нибудь исследовательские работы проанализировали это?
Ориентированы ли архитектуры ЦП на процедурный код поверх параллельного кода; или современные процессоры достаточно универсальны, чтобы язык с высокой степенью параллелизма не пострадал?
Ответы:
Вероятно, более вероятно, что современные компьютерные архитектуры разрабатываются с целью улучшения качества кода, сгенерированного компиляторами, за счет бюджета затрат в области кристалла и используемой мощности. Библиотеки времени выполнения - это просто конкретный экземпляр скомпилированного кода, который должен выполняться эффективно.
В течение очень долгого времени целевым языком для большинства архитектур был язык «C». Это отражает скромные требования, которые этот язык предъявляет к своему оборудованию, и тот факт, что он стал почти универсальным языком системного программирования (извините, Rust and Go, вам предстоит пройти долгий путь, чтобы победить C).
Следствием этого, по-видимому, является то, что новые языки часто определяются в терминах их эквивалентной семантики C просто для того, чтобы избежать использования процессорных средств, которые, вероятно, отсутствуют на современных компьютерах.
Окупаемость процессора, который хорошо сочетается с современными компиляторами, заключается в том, что код этих компиляторов работает хорошо, и у процессора есть, по крайней мере, шанс быть конкурентоспособным. Стоимость отказа здесь обрекает процессор, прежде чем он сможет начать работу. Всего два отрицательных примера: iAPX-432 и Itanium от Intel. У обоих были очень плохие отношения со своими компиляторами (Ada и C соответственно) из-за провала продуктов, превращающихся в игру по обвинению между кремнием и программным обеспечением.
источник
Без сомнения, да.
В частности, коммуникационная модель, подразумеваемая C99, является разделяемой памятью. Более продвинутые параллельные языки имеют более богатые коммуникационные модели, такие как каналы передачи сообщений (как в Rust).
Современные архитектуры ЦП имеют явную аппаратную поддержку разделяемой памяти. В частности, протоколы когерентности кэша, такие как MESI, реализованы в реальных шлюзах и проводах. Реальной поддержки передачи сообщений между процессами не существует, хотя идея передачи сообщений не чужда процессорам. Современные шины PCI-e даже эмулируют совместную память, используя передачу сообщений, тогда как процессорные процессы должны эмулировать передачу сообщений, используя общую память!
источник