【问题标题】:Dot product - SSE2 vs BLAS点积 - SSE2 与 BLAS
【发布时间】:2010-11-08 13:57:42
【问题描述】:

对于计算向量 x 与大量向量 y_i 的点积,我最好的选择是什么,其中 x 和 y_i 的长度约为 10k。

  1. 将 y 推入矩阵并使用优化的s/dgemv 例程?
  2. 或者尝试手动编码 SSE2 解决方案(根据 cpuinfo,我没有 SSE3)。

我只是在这里寻找一般指导,所以任何建议都会很有用。
是的,我确实需要表演。 谢谢你的光。

【问题讨论】:

  • 你使用的是哪个编译器?

标签: c optimization intrinsics


【解决方案1】:

我认为 GPU 是专门为快速执行此类操作而设计的(等等)。因此,您可能可以使用 DirectX 或 OpenGL 库来执行矢量操作。 D3DXVec2Dot 这也将节省您的 CPU 时间。

【讨论】:

  • D3DXVec2Dot 不使用 GPU。除此之外,只有在转换非常大的数据集或在 GPU 上使用非常“昂贵”的程序时,才能看到 GPGPU 程序的加速。这是由于设置 GPU 来完成工作,然后读回结果的成本。与 GPU 之间的每次数据传输都是非常昂贵的操作。
  • 如果浮点数足够好,很难击败 DirectX 的点积。
  • 当前的 CPU 也非常有能力进行这种处理。
【解决方案2】:

优化 BLAS 例程的替代方案:

  • 如果您使用 intel 编译器,您可以 可以访问英特尔MKL
  • 对于其他编译器,ATLAS 通常会提供不错的性能数据

【讨论】:

    【解决方案3】:

    对 SSE2 解决方案进行手工编码并不是很困难,并且会比纯 C 例程带来很好的加速。这将带来多少 BLAS 例程必须由您确定。

    最大的加速是通过将数据结构化为一种格式来获得的,这样您就可以利用数据并行性和对齐方式。

    【讨论】:

      【解决方案4】:

      我使用 GotoBLAS。这是高性能内核例程。比 MKL 和 BLAS 好很多倍。

      【讨论】:

      • gotoblas 存在许可问题。
      【解决方案5】:

      以下提供了使用 SSE 的 BLAS 级别 1(向量运算)例程。

      http://www.applied-mathematics.net/miniSSEL1BLAS/miniSSEL1BLAS.html

      如果您有 nVidia 显卡,您可以获得 cuBLAS,它将在显卡上执行操作。

      http://developer.nvidia.com/cublas

      适用于 ATI (AMD) 显卡

      http://developer.amd.com/libraries/appmathlibs/pages/default.aspx

      【讨论】:

        猜你喜欢
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多