C-数组函数评估

时间:2018-12-04 12:01:56

标签: c arrays performance blas

喂!我正在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是长度为{相同长度,仅包含01(不稀疏)。现在,我在这些条目上使用基本功能,并将它们添加在一起。

问题:

  1. 这些非线性函数(cblas_dgemvexp)是否有类似于log的东西,可以加快此过程?
  2. 是否可以通过仅在循环中使用非线性函数,存储结果然后尽可能多地使用cblas函数来使计算更快?

1 个答案:

答案 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} 中的ddotx中的t和对数部分的减少。

如果您想使用BLAS,答案是肯定的。但是,它本质上不如BLAS L3高效。通过并行执行它们,虽然可以节省一些时间和精力。