문제는 이미 '식 템플릿 (ET)'이라는 용어로 시작됩니다. 그것에 대한 정확한 정의가 있는지 모르겠습니다. 그러나 일반적인 사용법에서 어떻게 '선형 대수 표현식을 코딩하는 방법'과 '계산 방법'을 결합합니다. 예를 들면 다음과 같습니다.
당신은 벡터 연산을 코딩
v = 2*x + 3*y + 4*z; // (1)
그리고 그것은 루프에 의해 계산됩니다.
for (int i=0; i<n; ++i) // (2)
v(i) = 2*x(i) + 3*y(i) + 4*z(i);
내 생각에 이것은 두 가지 다른 점이며 분리되어야합니다 : (1) 인터페이스이고 (2) 하나의 가능한 구현. 이것이 프로그래밍에서 일반적인 관행임을 의미합니다. 물론 (2)는 좋은 기본 구현 일 수 있지만 일반적으로 전문화 된 전용 구현을 사용할 수 있기를 원합니다. 예를 들어, 나는 같은 기능을 원한다.
myGreatVecSum(alpha, x, beta, y, gamma, z, result); // (3)
코딩 할 때 호출됩니다 (1). 아마도 (3)은 (2)와 같이 내부적으로 루프를 사용합니다. 그러나 벡터 크기에 따라 다른 구현이 더 효율적일 수 있습니다. 어쨌든 일부 고성능 전문가는 가능한 한 많이 구현하고 조정할 수 있습니다 (3). 따라서 (1)을 (3)의 호출에 매핑 할 수 없으면 (1)의 구문 설탕을 피하고 (3)을 직접 호출하십시오.
내가 설명하는 것은 새로운 것이 아닙니다. 반대로 BLAS / LPACK의 기본 개념은 다음과 같습니다.
- LAPACK의 모든 성능 결정 작업은 BLAS 함수를 호출하여 수행됩니다.
- BLAS는 일반적으로 필요한 선형 대수 표현식에 대한 인터페이스를 정의합니다.
- BLAS의 경우 서로 다른 최적화 된 구현이 존재합니다.
BLAS의 범위가 충분하지 않은 경우 (예 : (3)과 같은 기능을 제공하지 않는 경우) BLAS의 범위를 확장 할 수 있습니다. 60 년대와 70 년대의이 공룡은 석기 시대 도구를 사용하여 인터페이스와 구현의 깨끗하고 직교적인 분리를 실현합니다. (대부분의) 숫자 C ++ 라이브러리가 이러한 수준의 소프트웨어 품질을 달성하지 못한다는 것은 재미 있습니다. 프로그래밍 언어 자체가 훨씬 더 정교하지만. 따라서 BLAS / LAPACK이 여전히 살아 있고 활발하게 개발되어 있다는 것은 놀라운 일이 아닙니다.
따라서 제 생각에 ET는 그 자체로 악이 아닙니다. 그러나 수치 C ++ 라이브러리에서 일반적으로 사용되는 방식은 과학 컴퓨팅 분야에서 매우 나쁜 평판을 얻었습니다.