【发布时间】:2018-12-04 12:01:55
【问题描述】:
喂!我在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(不稀疏)。现在我在这些条目上使用基本功能并将它们添加在一起。
问题:
- 这些非线性函数(
exp和log)是否有类似于cblas_dgemv的东西来加速这个过程? - 我能否通过在循环中仅使用非线性函数、存储结果然后尽可能再次使用
cblas函数来加快计算速度?
【问题讨论】:
-
如果打算在特定架构上运行,您可以使用 SIMD 指令流式传输其中一些操作。例如,Intel Intrinsics 或类似的。或者在您的编译器设置中启用矢量化。根据计算的性质,您还可以将其拆分为多个工作线程。
-
遗憾的是,事实并非如此。它应该在集群计算机上运行,但也可以在具有相当一般设置/限制的本地计算机上运行。
-
@tehfurbolg - 我有几个问题。你有什么 C 编译器用于该项目?可能是 gcc,但这实际上是我所拥有的 :) 如果你现在想要速度而不需要任何并行性,那么你就是在开玩笑,而不是在问编程问题。 Pthreads、OpenMPI 现在是标准的。
-
我正在使用 gcc,是的。在我更改它之前,数组 x 的计算是硬编码的矩阵向量乘法,并且使用 cblas 函数已经使它变得更快(也在其他更复杂的部分中)。但是对于这个非线性部分,我不知道如何加快它们的速度,并且想知道是否有类似的解决方案。这就是为什么我认为这是一个编程问题而不是技术问题。
标签: c arrays performance blas