Использование библиотеки Apple Accelerate Framework vForce для повышения производительности

Я успешно внедрил библиотеку 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.

2

Решение

Похоже, проблема в том, как vForce манипулирует памятью. По сути, это не хорошо для обработки больших матриц за один раз. За vec_size = 1000; vForce вычисляет экспоненту / журнал в два раза быстрее, чем оптимизированная компилятором, наивная версия. Я сломал более крупный пример vec_size = 1000000 до 1000 штук в каждой, и вот, реализация vForce была в два раза быстрее наивной. Ницца!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]