Я изучаю multicore parallelism в F #. Я должен признать, что неизменность действительно помогает написать правильную параллельную реализацию. Тем не менее, трудно добиться хорошего ускорения и хорошей масштабируемости, когда число ядер растет. Например, мой опыт с алгоритмом быстрой сортировки заключается в том, что многие попытки реализовать параллельный Quick Sort в чисто функциональном виде и использование List
или Array
по мере того, как представление не выполняется. Профилирование этих реализаций показывает, что количество промахов в кеше значительно увеличивается по сравнению с количеством последовательных версий. Однако, если вы реализуете параллельную Quick Sort, используя мутацию внутри массивов, можно получить хорошее ускорение. Поэтому я считаю, что мутация может быть хорошей практикой для оптимизации многоядерного parallelism.
Я считаю, что местонахождение кеша является большим препятствием для многоядерного parallelism на функциональном языке. Функциональное программирование включает в себя создание многих недолговечных объектов; уничтожение этих объектов может разрушить свойство когерентности кэшей CPU. Я видел много предложений о том, как улучшить локальность кеша в императивных языках, например здесь и . Но мне не ясно, как они будут выполняться в функциональном программировании, особенно с рекурсивными структурами данных, такими как деревья и т.д., Которые появляются довольно часто.
Существуют ли какие-либо методы улучшения местоположения кеша на нечистом функциональном языке (в частности, F #)? Любые советы или примеры кода более чем приветствуются.