2016-03-16 5 views
1

Посмотрев в последнее время объявить поддержку WebAssembly, это происходит со мной, что было бы значительно увеличить его полезность, если бы каким-нибудь способом:Есть ли способ предоставить asm.js или код WebAssembly для V8 Turbofan?

  1. Have турбовентилятор преемник на the V8 JIT Crankshaft optimizer выход всей коды сборки его генерирует вместе с сигнатурами статического типа и профиль выполнения этого сгенерированного кода.

  2. Разрешите программисту предоставить свой собственный код asm.js/WebAssembly для определенных сигнатур статического типа, которые переопределяют оптимизатор.

Есть ли способ сделать это уже?

Существует несколько признаков того, что это может быть из следующего отрывка из this article:

Под капотом, реализация WebAssembly в V8 предназначена для повторного использования большого количества существующих JavaScript виртуальной машины инфраструктуры, конкретно компилятор TurboFan. Специализированный декодер WebAssembly проверяет модули путем проверки типов, локальных индексов переменных, функций ссылок, возвращаемых значений и структуры управления потоком в одном проходе . Декодер создает график TurboFan, который обрабатывается различными проходами оптимизации и, наконец, превращается в машинный код того же бэкэнд, который генерирует машинный код для оптимизированного JavaScript и asm.js. В течение следующих нескольких месяцев команда сосредоточится на , улучшив время запуска реализации V8 с помощью компилятора улучшения настройки, параллелизма и улучшения компиляции.

Для расширения идеи для более широкой аудитории:

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

+0

Не могли бы вы пояснить, что вы имеете в виду? Это больше похоже на запрос функции для команды V8, чем на вопрос SO, но я не уверен, что такое запрос :-) –

+0

Это запрос функции для IFF команды V8, эта функция еще не доступна в V8. Поэтому мой вопрос заключается в том, существует ли эта функция, как кажется. Я не уверен, как быть яснее в том, что я сказал. Технические термины, которые я использовал, четко определены. На кого из вас есть вопрос? 'node --v8-options' представляет недоумение. – user3673

ответ

0

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

Веб-интерфейс к модулям WebAssembly (через объект Wasm) обеспечивает простой и простой способ взаимодействия между JS и Wasm. В будущем модули ES6 могут упростить взаимодействие. Неясно, в чем преимущество такого сложного механизма, как вы предлагаете.

+0

Очевидно, что было бы необходимо ввести ограничения, которые поддерживали бы границы абстракции. Если эти ограничения в конечном итоге стоили много накладных расходов на кодирование и/или время выполнения отдельных методов, тогда не было бы никакого преимущества. Основным преимуществом, которое я искал, было обычное использование источника высокого уровня в качестве фактической спецификации (и резервной копии для неподдерживаемых сред) для оптимизации по требованию (как определено профилированием по времени выполнения) на языке низкого уровня. Это имеет преимущество эмпирического кодирования низкого уровня над априорной архитектурой. – user3673

+0

@ user3673, единственным подходящим таким «ограничением» является тот, который у нас есть сейчас.;) Ваш прецедент по-прежнему распространяется: вы можете поэтапно поместить быстрые пути в модуль Wasm просто отлично. Вам просто нужно вызвать их через интерфейс экспорта, без коротких сокращений. В случае, если вы беспокоитесь о накладных расходах на звонки: это то, что Turbofan должен иметь возможность встроить. –

1

Для 1.Вы можете играть со следующими флагами:

  • trace_turbo: след генерируется турбовентиляторной ИК
  • trace_turbo_graph: след генерироваться турбовентиляторными графам
  • trace_turbo_cfg_file: след графика турбо CFG (для C1 визуализатора) для заданного имени файла
  • trace_turbo_types: проследить типы турбовентиляторном в
  • trace_turbo_scheduler: отслеживать планировщик турбовентиляторном в
  • trace_turbo_reduction: прослеживают различных редукторы турбовентиляторных в
  • trace_turbo_jt: проследить переход турбовентиляторного в продевал
  • trace_turbo_ceq: прослеживать контроль эквивалентности турбовентиляторной в
  • turbo_stats: печать турбовентиляторной статистики

Они могут измениться в будущих версиях V8 и не являются стабильный API.

TurboFan довольно сложно в том, что он потребляет информацию от базовой линии JIT/интерпретатора и может перейти к этой информации после deopt. Компилятор не всегда является прямым конвейером от JS/wasm до сборки. Вложение и множество других вещей влияют на то, что происходит.

Для 2 .: введите код wasm или действительный asm.js в первую очередь.

Мы обсудили выполнение различных типов динамической трассировки, кеширование трасс (и возможность вставки следов для тестирования), но это, вероятно, не то, что мы раскрываем, учитывая, что уже существует способ дать компилятору точную введите информацию!