【问题标题】:C - array function evaluationC - 数组函数评估
【发布时间】: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 是一个长度相同的双数组,仅包含01(不稀疏)。现在我在这些条目上使用基本功能并将它们添加在一起。

问题:

  1. 这些非线性函数(explog)是否有类似于 cblas_dgemv 的东西来加速这个过程?
  2. 我能否通过在循环中仅使用非线性函数、存储结果然后尽可能再次使用cblas 函数来加快计算速度?

【问题讨论】:

  • 如果打算在特定架构上运行,您可以使用 SIMD 指令流式传输其中一些操作。例如,Intel Intrinsics 或类似的。或者在您的编译器设置中启用矢量化。根据计算的性质,您还可以将其拆分为多个工作线程。
  • 遗憾的是,事实并非如此。它应该在集群计算机上运行,​​但也可以在具有相当一般设置/限制的本地计算机上运行。
  • @tehfurbolg - 我有几个问题。你有什么 C 编译器用于该项目?可能是 gcc,但这实际上是我所拥有的 :) 如果你现在想要速度而不需要任何并行性,那么你就是在开玩笑,而不是在问编程问题。 Pthreads、OpenMPI 现在是标准的。
  • 我正在使用 gcc,是的。在我更改它之前,数组 x 的计算是硬编码的矩阵向量乘法,并且使用 cblas 函数已经使它变得更快(也在其他更复杂的部分中)。但是对于这个非线性部分,我不知道如何加快它们的速度,并且想知道是否有类似的解决方案。这就是为什么我认为这是一个编程问题而不是技术问题。

标签: c arrays performance blas


【解决方案1】:

您的计算更像是 BLAS 1 级操作。 ddotxt 在第一个短语中并减少了日志部分。

如果您想使用 BLAS,答案是肯定的。然而,它本质上不如 BLAS L3 高效。不过,通过对它们进行一些并行实现,它可能会为您节省一些时间和精力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 2020-08-24
    • 2016-08-14
    • 2019-05-23
    相关资源
    最近更新 更多