如何使用OpenMP实现可扩展的3D泊松红/黑解算器



我想为三维泊松方程(CFD(编写一个OpenMP红/黑SOR求解器,我发现了一些关于一维情况的讨论(比如这个(,但我找不到解决三维情况的参考(有CUDA参考,但没有OpenMP的参考(。

它基本上是一个3D卷积,每个松弛的单元访问6个相邻单元,因此,它只需要很少的数学计算,但需要大量的内存访问(并且缓存不友好,因为你在X轴上有2个邻居,在Y轴上有两个邻居,而在Z轴上有二个邻居(。然后你只需要添加一些内容,但恐怕这里的大成本是3个轴中的这些内存访问。

所以我担心这篇文章很难用OpenMP实现有效的比例因子,在盲目尝试之前,我想开始用一种有意义的方式来写它。

是的,我想也许我可以把记忆分解成更多的";缓存友好的子立方体";,但是这种复杂的转变真的值得吗?我的意思是:我能从这些";缓存友好的多维数据集"?我预见到用这些替代方式排列内存会有一个相当复杂的索引转换,所以只有当我能期望它有好的性能时,我才会这么做

请注意,如果没有目标硬件(如处理器速度、缓存大小、内存等(和软件参数(如数据大小(的信息,就很难给出这个问题的精确答案。

我可以将内存分解为更多的";缓存友好的子立方体";,但是这种复杂的转变真的值得吗?

如果速度是一个关键点,那么它绝对值得。与缓存访问相比,RAM访问成本非常高。事实上,最大的问题是很少有线程会很快使RAM饱和,而只要块适合CPU缓存,那么使用块应该会更好。对于不共享的缓存(通常是x86-64主流处理器上的L1/L2缓存(,情况尤其如此。

有很多方法可以做到这一点。一个著名的解决方案是使用z-tile或更普遍的缓存遗忘模具算法如果目标模板在循环中迭代计算,则梯形分解是最重要的方法之一。这些算法的实现非常复杂,但有几个工具/框架可以高效且非常容易地完成这些模板(例如,请参阅Pochoir,它报告称,与简单的实现相比,速度非常快(。

我能从这些";缓存友好的多维数据集"?

可能不会。至少,不是只有";缓存友好立方体";,而不是在具有许多内核和相当小的RAM吞吐量的主流服务器处理器上。也就是说,使用上述所有组合方法可以极大地帮助提高性能和可扩展性(尤其是在时间维度上的缓存优化(。假设数据可以完全容纳在CPU缓存中,那么就目标硬件而言,它可能会扩展得很好,如果不是完美的话(一些处理器,比如最近的AMD,可以拥有巨大而快速的基于NUMA的L3缓存,而一些机器,比如IBM,可以拥有相当大的RAM吞吐量(。

最新更新