Кажется, что в Юлии поощряется писать детекционированный код. Существует даже пакет, который пытается сделать это за вас.
Мой вопрос: почему?
Прежде всего, исходя из аспекта пользовательского опыта, векторизованный код более краток (меньше кода, затем меньше вероятности ошибок), более понятный (отсюда легче отлаживать), более естественный способ написания кода (по крайней мере для кого-то который исходит из научного компьютерного фона, к которому Джулия пытается удовлетворить). Возможность написать что-то вроде vector'vector
или vector'Matrix*vector
очень важна, потому что это соответствует фактическому математическому представлению, и именно так думают научные мыслители об этом в голове (а не в вложенных циклах). И я ненавижу тот факт, что это не лучший способ написать это, и переустановка его в циклы будет быстрее.
В настоящий момент кажется, что существует конфликт между целью написания кода, который выполняется быстро, и сжатым/понятным кодом.
Во-вторых, какова техническая причина этого? Хорошо, я понимаю, что векторизованный код создает дополнительные временные и т.д., Но векторизованные функции (например, broadcast()
, map()
и т.д.) Имеют потенциал многопоточности, и я думаю, что преимущество многопоточности может перевесить накладные расходы временных и других недостатков векторизованных функций, что делает их более быстрыми, чем обычные для циклов.
Имеют ли текущие реализации векторизованных функций в Юлии скрытые многопоточности под капотом?
Если нет, есть ли работа/планирует добавить неявные concurrency в векторизованные функции и сделать их быстрее, чем циклы?