很少有科学软件开发人员了解良好的设计原则,所以如果这个答案有点冗长,我深表歉意。从软件工程的角度来看,科学软件开发人员的目标是设计一个解决方案,以满足一组经常相互冲突的约束。
以下是这些约束的一些典型示例,可应用于稀疏矩阵库的设计:
- 一个月内完成
- 在您的笔记本电脑和多个工作站上正常运行
- 高效运行
科学家们逐渐更加关注软件工程的其他一些常见需求:
- 文档(用户指南、教程、代码注释)
- 可维护性(版本控制、测试、模块化设计)
- 可重用性(模块化设计,“灵活性”)
您可能需要或多或少的这些要求之一。如果你想赢得 Gordon Bell 的性能奖,那么即使是百分之一的分数都是相关的,而且很少有评委会评估你的代码质量(只要你能说服他们这是正确的)。如果您试图证明在共享资源(例如集群或超级计算机)上运行此代码是合理的,那么您通常必须为您的代码性能的声明辩护,但这些声明很少非常严格。如果你想在期刊上发表一篇描述你的方法的性能提升的论文,那么你需要比你的竞争对手更快,而 20% 的性能是一个折衷,我很乐意为更好的可维护性和可重用性做出权衡。
回到你的问题,“好的设计”,给予足够的开发时间,不应该牺牲性能。如果目标是让代码尽可能快地运行,那么代码应该围绕这些约束进行设计。您可以使用代码生成、内联汇编等技术,或利用高度调整的库来帮助您解决问题。
但是,如果您没有足够的开发时间怎么办?什么足够好?好吧,这取决于,没有更多的上下文,没有人能够给你一个很好的答案。
FWIW:如果您真的对编写高性能稀疏矩阵内核感兴趣,您应该与优化的 PETSc 安装进行比较,如果您击败他们,请与他们的团队合作,他们很乐意将调整后的内核合并到库中。