Николай Коровин (03.06.2018 13:36, просмотров: 1221)
Есть какая-нибудь ВМ, где на уровне системы команд ВМ (угу, синтаксиса байткода) заложена возможность интерпретатором ВМ распараллеливать выполнение по ядрам и шейдерам на своё усмотрение, сообразно имеющемуся железу? Есть два вопроса, которые мы не рассматриваем.
1) На каком языке для такой ВМ надо писать. Си со спецбиблиотеками, поганочные недоязыки типа решётки или жабы, прибитые гвоздями к конкретной ВМ и поэтому не имеющие права зваться языками, ну или сразу на асме этой ВМ -- это НЕ ВАЖНО. Как-то написали. Точка.
2) Какой компилятор и как именно сделал из п. 1 байткод этой ВМ. Опять же, НЕ ВАЖНО. Просто есть данность: мы можем получить байткод этой ВМ со всеми присущими ему командами массовых операций и т. д., а уже задача интерпретатора ВМ решить, что циклом сделать, а что шейдерам скормить.
Если совсем грубо, в байткоде написано "сложи массив с массивом", а интерпретатор или динамически генерирует машкод для ядер целевого проца, или реально честно интерпретирует покомандно, или спихивает шейдерам, смотря какого размера массив и насколько часто надо будет, скажем, гонять данные с/из видеопамяти и т. д. Это вот совсем грубый пример. Или чуть изящнее: команда типа loop у x86, но с префиксом "unordered", которая указывает, что тело цикла можно считать в любом порядке или даже в несколько параллельных потоков. Интерпретатор может этим послаблением воспользоваться и пустить 8 кусочков цикла на 8 ядрах (или шейдерах опять же).
Кто-нибудь на такую ВМ замахивался? Осиливал? :)