C - оценка функции массива - PullRequest
0 голосов
/ 04 декабря 2018

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 (не редкий).Теперь я использую базовые функции для этих записей и складываю их вместе.

Вопросы:

  1. Есть ли что-нибудь похожее на cblas_dgemv для этих нелинейных функций (exp иlog) что ускоряет этот процесс?
  2. Можно ли сделать этот расчет быстрее, используя только нелинейные функции в цикле, сохраняя результаты, а затем снова максимально используя функции cblas?

1 Ответ

0 голосов
/ 24 апреля 2019

Ваши вычисления больше похожи на операцию BLAS уровня 1.ddot из x и t в первой фразе и сокращение в части журнала.

Ответ будет положительным, если вы хотите использовать BLAS.Однако это не так эффективно, как BLAS L3 по своей природе.Однако при их параллельной реализации это может сэкономить вам время и силы.

...