喂!我正在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
函数来使计算更快?答案 0 :(得分:0)
您的计算更像是BLAS 1级操作。
第一个短语{'EMS': 1, 'ESC': 2, 'HVAC': 3, 'IC': 4, 'ICU': 5, 'IS': 6, 'ITM': 7, 'MBFM': 8, 'PKE': 9, 'RPAS': 10, 'RVC': 11, 'SAS': 12, 'SRS': 13, 'TCU': 14, 'TPMS': 15, 'VCU': 16, 'BMS': 17, 'MCU': 18, 'OBC': 19}
中的ddot
和x
中的t
和对数部分的减少。
如果您想使用BLAS,答案是肯定的。但是,它本质上不如BLAS L3高效。通过并行执行它们,虽然可以节省一些时间和精力。