Архитектура ЦП смещена в сторону процедурного времени выполнения?

13

Могут ли быть внесены какие-либо изменения в ЦП, чтобы они работали лучше для одновременных сред выполнения, таких как Rust? Например, есть ли изменения в реализациях прогнозирования ветвлений или размерах кэша, которые могли бы помочь одновременным выполнениям?

У меня сложилось впечатление, что текущие конструкции ЦП могут быть оптимизированы в большей степени для процедурных сред выполнения, таких как C. Если бы вместо этого мы собирались оптимизировать параллельные среды выполнения, как бы ЦП выглядели иначе?

Для этого прогноз ветвлений был реализован на основе обобщений, сделанных в научных работах и ​​анализирующих процедурные коды. Мне интересно, добавит ли абстракция параллелизма значительный рабочий набор к среде выполнения, что отрицательно скажется на существующих алгоритмах прогнозирования ветвлений. Например, предсказание в цикле for - это одно, но когда целью ветви всегда является какая-то новая часть памяти (графическая, текстовая и т. Д.), Это всегда будет пропуском кэша, и никогда не будет перехода история для этого - потому что ни один еще не коснулся этого.

Это, вероятно, глупый вопрос, потому что контент, хотя он всегда может быть в ОЗУ, будет разветвлен на порядок меньше, чем он будет использоваться (как только он будет загружен в кэш) ... но все же, там должна быть наблюдаемой временной границей с контекстами, хранящимися в кэш-памяти и предикторах ветвления в процедурной среде выполнения, что будет проявляться как граница абстракции в более параллельной среде. Поэтому мне интересно ... Были ли соблюдены эти границы? Какие-нибудь исследовательские работы проанализировали это?

Ориентированы ли архитектуры ЦП на процедурный код поверх параллельного кода; или современные процессоры достаточно универсальны, чтобы язык с высокой степенью параллелизма не пострадал?

paIncrease
источник
2
Вы смотрели литературу по архитектуре Itanium (IA-64)? Он был спроектирован с большими мечтами об ультрапараллелизме, но тогда люди не смогли создать компиляторы, которые бы использовали преимущества процессора, а программное обеспечение в конце концов не работало так хорошо.
Жиль "ТАК - перестать быть злым"
@ Жиль да. Хотя это и другой вопрос, на самом деле это интересное наблюдение - возможно, параллелизм, запеченный в Itanium, лучше подходит для современных параллельных языков?
Увеличение
@Gilles: И, похоже, новая архитектура Mill построена с учетом параллелизма и недорогих коммутаторов. Например, используя единое виртуальное адресное пространство для всех «процессов», он выталкивает TLB между последним уровнем кэша и контроллерами устройства (см. Слайд 49 на сайте millcomputing.com/docs/memory ).
Матье М.
1
@pedAntic Rust, нуждающийся в среде исполнения, - это неправильное представление, которое легко сделать: chat.stackoverflow.com/transcript/message/24171983#24171983 . Ваш вопрос, кажется, поддерживает это заблуждение, что не очень хорошо для Rust.
ArtemGr
1
@pedAntic Видите ли, у Rust была параллельная среда выполнения (для зеленых потоков), но она больше не существует. Прямо сейчас Rust в значительной степени находится в той же лиге, что и C, в отношении профиля производительности параллелизма. Единственное отличие от C состоит в том, что статический анализ в Rust делает параллелизм главным образом безопасным.
ArtemGr

Ответы:

1

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

В течение очень долгого времени целевым языком для большинства архитектур был язык «C». Это отражает скромные требования, которые этот язык предъявляет к своему оборудованию, и тот факт, что он стал почти универсальным языком системного программирования (извините, Rust and Go, вам предстоит пройти долгий путь, чтобы победить C).

Следствием этого, по-видимому, является то, что новые языки часто определяются в терминах их эквивалентной семантики C просто для того, чтобы избежать использования процессорных средств, которые, вероятно, отсутствуют на современных компьютерах.

Окупаемость процессора, который хорошо сочетается с современными компиляторами, заключается в том, что код этих компиляторов работает хорошо, и у процессора есть, по крайней мере, шанс быть конкурентоспособным. Стоимость отказа здесь обрекает процессор, прежде чем он сможет начать работу. Всего два отрицательных примера: iAPX-432 и Itanium от Intel. У обоих были очень плохие отношения со своими компиляторами (Ada и C соответственно) из-за провала продуктов, превращающихся в игру по обвинению между кремнием и программным обеспечением.

Питер Камиллери
источник
0

Без сомнения, да.

В частности, коммуникационная модель, подразумеваемая C99, является разделяемой памятью. Более продвинутые параллельные языки имеют более богатые коммуникационные модели, такие как каналы передачи сообщений (как в Rust).

Современные архитектуры ЦП имеют явную аппаратную поддержку разделяемой памяти. В частности, протоколы когерентности кэша, такие как MESI, реализованы в реальных шлюзах и проводах. Реальной поддержки передачи сообщений между процессами не существует, хотя идея передачи сообщений не чужда процессорам. Современные шины PCI-e даже эмулируют совместную память, используя передачу сообщений, тогда как процессорные процессы должны эмулировать передачу сообщений, используя общую память!

MSalters
источник