pad*_*pad 26 parallel-processing f# asynchronous functional-programming multicore
我正在研究F#中的多核并行性.我必须承认,不可变性确实有助于编写正确的并行实现.但是,当核心数量增长时,很难实现良好的加速和良好的可扩展性.例如,我使用快速排序算法的经验是,许多尝试以纯粹功能的方式实现并行快速排序并使用List或Array作为表示失败.对这些实现进行分析表明,与顺序版本相比,缓存未命中数量显着增加.但是,如果使用阵列内部的突变实现并行快速排序,则可以获得良好的加速.因此,我认为突变可能是优化多核并行性的一种很好的实践.
我认为缓存局部性是功能语言中多核并行的一大障碍.函数式编程涉及创建许多短期对象; 破坏这些对象可能会破坏CPU缓存的一致性.我已经看到很多建议如何改进命令式语言中的缓存局部性,例如,这里和这里.但是我不清楚如何在函数式编程中完成它们,特别是对于经常出现的递归数据结构(如树等).
是否有任何技术可以改进不纯函数语言(特别是F#)中的缓存局部性?任何建议或代码示例都非常受欢迎.
Adr*_*ian 25
据我所知,缓存局部性(多线程或其他)的关键是
为此 ;
在实践中,这意味着您可能最终使用的数据结构在理论上并不是计算机科学的完美例子 - 但没关系,计算机在理论上也不是计算机科学的完美例子.
关于这个主题的一篇好的学术论文是使用复制的高效字符串排序