경험을 바탕으로 예를 들어 보겠습니다. 매일 사용하는 대부분의 라이브러리는 어떤 방식 으로든 OOP를 사용합니다. OOP는 많은 도메인에 필요한 복잡성을 숨길 수 있지만 성능에 실제로 도움이되는 메커니즘은 아닙니다. 일어날 수있는 일은 라이브러리가 객체 계층을 기반으로 특정 최적화를 사용할 수 있지만 대부분 사용자에게 복잡성을 숨기는 것입니다. 디자인 패턴을 찾아보십시오. 이러한 복잡성을 숨기는 데 자주 사용되는 메커니즘입니다.
PETSc를 예로 들어 보겠습니다. PETSc는 OOP의 인스펙터 / 실행자 모델을 사용합니다. 여기서 해당 알고리즘은 주어진 객체에서 사용 가능한 루틴을보고 루틴을 수행하기 위해 실행할 루틴을 선택합니다. 이를 통해 사용자는 우려 사항을 분리 할 수 있습니다. 예를 들어 매트릭스 동작은 모든 종류의 차단 또는 최적화 된 루틴을 포함 할 수 있으며 수많은 반복 솔버에서 효과적으로 사용할 수 있습니다. 사용자에게 고유 한 데이터 유형 및 평가를 지정할 수있는 기능을 제공함으로써 몇 가지 중요한 루틴을 얻었으며 전체 라이브러리 기능을 계속 사용할 수 있습니다.
내가 줄 또 다른 예는 FEniCS와 deal.II입니다. 이 두 라이브러리는 OOP를 사용하여 많은 유한 요소법을 일반화합니다. 요소 유형, 요소 순서, 구적 표현 등의 모든 것에서 상호 교환이 가능합니다. 이 두 라이브러리는 일부 특수 목적의 구조화 된 FEM 코드보다 "느리게"있지만 사용자에게 알려지지 않은 FEM의 복잡성으로 인해 다양한 문제를 해결할 수 있습니다.
마지막 예제는 Elemental입니다. Elemental은 MPI 커뮤니케이터 및 데이터 위치를 매우 간단한 언어 구성으로 관리하는 데 어려움이있는 새로운 고밀도 선형 대수 라이브러리입니다. 결과적으로 FLAME 직렬 코드가있는 경우 데이터 유형을 변경하면 Elemental을 통해 병렬 코드를 가질 수도 있습니다. 더 흥미로운 것은 분포를 다른 것과 동일하게 설정하여 데이터 분포를 가지고 놀 수 있다는 것입니다.
OOP는 수동 롤 어셈블리와 경쟁하기위한 패러다임이 아니라 복잡성을 관리하는 방법으로 생각해야합니다. 또한 제대로 수행하지 않으면 많은 오버 헤드가 발생하므로 타이밍을 유지하고 사용하는 메커니즘을 업데이트해야합니다.