기본 벡터 및 행렬 연산의 성능을 향상시키기 위해 Apple의 Accelerate Framework에서 BLAS 라이브러리를 성공적으로 구현했습니다.
이것에 만족하면서 저는 기본 수학 함수를 벡터화하기 위해 vForce에 관심을 돌 렸습니다. 여기에서는 순진한 구현 (자동 컴파일러 최적화 -Os 사용)에 비해 성능이 상당히 저하되어 약간 놀랐습니다.
간단한 벤치 마크로 다음 테스트를 실행했습니다. Matrix는 이중 포인터를 사용하는 기본 Matrix 유형이고 AccelerateMatrix는 vForce의 지수 함수를 사용하는 Matrix의 하위 클래스입니다.
Matrix A(vec_size);
AccelerateMatrix B(vec_size);
for (int i=0; i<vec_size;i++ ) {
A[i] = i;
B[i] = i;
}
double elapsed_time;
clock_t start = clock();
for(int i=0;i<reps;i++){
A.exp();
A.log();
}
clock_t stop = clock();
elapsed_time = (double)(stop-start)/CLOCKS_PER_SEC/reps;
cerr << "Basic matrix exponentiation/log time = " << elapsed_time << endl;
start = clock();
for(int i=0;i<reps;i++){
B.exp();
B.log();
}
stop = clock();
elapsed_time = (double)(stop-start)/CLOCKS_PER_SEC/reps;
cerr << "Accelerate matrix exponentiation/log time = " << elapsed_time << endl;
지수 / 로그 멤버 함수는 다음과 같이 구현됩니다.
void AccelerateMatrix::exp(){
int size =(int)this->getSize();
this->goToStart();
vvexp(this->ptr, this->ptr, &size);}
void Matrix::exp(){
double *ptr = data;
while (!atEnd()) {
*ptr = std::exp(*ptr);
ptr++;
}
}
data는 double 배열의 첫 번째 요소에 대한 포인터입니다.
다음은 성능 결과입니다.
행렬 요소 수 = 1000000
기본 행렬 지수 / 로그 시간 (초) = 0.0089806
행렬 지수화 / 로그 시간 (초) 가속화 = 0.0149955
릴리스 모드의 XCode에서 실행 중입니다. 내 프로세서는 2.3GHz Intel Core i7입니다. 메모리는 8GB 1600MHz DDR3입니다.
문제는 vForce가 메모리를 조작하는 방법과 관련이있는 것으로 보입니다. 본질적으로 큰 행렬을 한 번에 처리하는 것은 좋지 않습니다. 들면 vec_size = 1000;
vForce는 지수를 계산 / 최적화 컴파일러 순 버전 배 빠른 기록. 나는 더 큰 예제 vec_size = 1000000
를 각각 1000 개의 배치로 나누었고, vForce 구현은 순진한 것보다 두 배나 빠릅니다. 좋은!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다