Aloha!Я работаю в C
и использую базовые функции для всех элементов массива с циклом for
, и мне было интересно, можно ли ускорить этот расчет (например, с помощью cblas
функций).Я использую следующие библиотеки (и предпочел бы не добавлять ни одной из них, так как этот проект не полностью находится под моим контролем):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <gsl/gsl_statistics_double.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_matrix.h>
#include <cblas.h>
#include <float.h>
Часть кода, о которой идет речь, такова:
#use the following functions on every element of the array and add them together
for(ii = 0; ii < k1; ii++) {
val += t[ii]*x[ii] - log(1 + exp(x[ii]));
}
где x
- двойной массив длины k1
Я вычислил с помощью cblas_dgemv
(который выполняет умножение матрицы на вектор), а t
- двойной массив такой же длины, содержащий только 0
и 1
(не редкий).Теперь я использую базовые функции для этих записей и складываю их вместе.
Вопросы:
- Есть ли что-нибудь похожее на
cblas_dgemv
для этих нелинейных функций (exp
иlog
) что ускоряет этот процесс? - Можно ли сделать этот расчет быстрее, используя только нелинейные функции в цикле, сохраняя результаты, а затем снова максимально используя функции
cblas
?