Muito poucos desenvolvedores científicos de software entendem bons princípios de design, então peço desculpas se essa resposta for um pouco demorada. Do ponto de vista da engenharia de software, o objetivo do desenvolvedor de software científico é projetar uma solução que satisfaça um conjunto de restrições que geralmente são conflitantes .
Aqui estão alguns exemplos típicos dessas restrições, que podem ser aplicados ao design da sua biblioteca de matrizes esparsas:
- Concluído em um mês
- Funciona corretamente no seu laptop e em várias estações de trabalho
- Executa com eficiência
Os cientistas estão gradualmente prestando mais atenção a alguns outros requisitos comuns da engenharia de software:
- Documentação (Guia do usuário, tutorial, comentário de código)
- Manutenção (controle de versão, teste, projeto modular)
- Reutilização (design modular, "flexibilidade")
Você pode precisar de mais ou menos de um desses requisitos. Se você está tentando ganhar um prêmio de Gordon Bell por desempenho, mesmo frações de um por cento são relevantes, e poucos juízes avaliarão a qualidade do seu código (desde que você possa convencê-lo de que é certo). Se você estiver tentando justificar a execução desse código em um recurso compartilhado, como um cluster ou um supercomputador, frequentemente precisará defender reivindicações sobre o desempenho do seu código, mas essas raramente são muito rigorosas. Se você está tentando publicar um artigo em um diário descrevendo os ganhos de desempenho de sua abordagem, precisa legitimamente ser mais rápido que seus concorrentes, e 20% do desempenho é uma troca que eu faria com prazer para melhor manutenção e reutilização.
Voltando à sua pergunta, o "bom design", com tempo de desenvolvimento suficiente, nunca deve sacrificar o desempenho. Se o objetivo é criar código que seja executado o mais rápido possível, o código deve ser projetado com base nessas restrições. Você pode usar técnicas como geração de código, montagem embutida ou aproveitar as bibliotecas altamente ajustadas para ajudá-lo a resolver seu problema.
Mas e se você não tiver tempo de desenvolvimento suficiente? O que é bom o suficiente? Bem, depende, e ninguém será capaz de lhe dar uma boa resposta a esta pergunta sem mais contexto.
FWIW: Se você realmente está interessado em escrever kernels de matriz esparsa de alto desempenho, deve comparar com uma instalação PETSc otimizada e trabalhar com a equipe deles, se estiver derrotando-os, eles ficarão felizes em incorporar kernels ajustados à biblioteca.