Я успешно внедрил библиотеку BLAS из Apple Accelerate Framework для повышения производительности моих основных векторных и матричных операций.
Будучи удовлетворенным этим, я переключил свое внимание на vForce, чтобы векторизовать мои основные математические функции. Здесь я был немного удивлен, увидев довольно низкую производительность по сравнению с наивными реализациями (используя автоматическую оптимизацию компилятора -О).
В качестве простого теста я выполнил следующий тест: Matrix — это базовый тип Matrix, использующий двойной указатель, AccelerateMatrix — подкласс Matrix, который использует функцию возведения в степень из vForce:
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++;
}
}
Данные — это указатель на первый элемент двойного массива.
Ниже приведен результат исполнения:
Количество матричных элементов = 1000000
Базовая матрица возведения в степень / логарифм (сек) = 0,0089806
Ускорение возведения в степень матрицы / время записи (сек) = 0,0149955
Я бегу из XCode в режиме выпуска.
У меня процессор Intel Core i7 2,3 ГГц.
Объем памяти составляет 8 ГБ, 1600 МГц DDR3.
Похоже, проблема в том, как vForce манипулирует памятью. По сути, это не хорошо для обработки больших матриц за один раз. За vec_size = 1000;
vForce вычисляет экспоненту / журнал в два раза быстрее, чем оптимизированная компилятором, наивная версия. Я сломал более крупный пример vec_size = 1000000
до 1000 штук в каждой, и вот, реализация vForce была в два раза быстрее наивной. Ницца!
Других решений пока нет …