【问题标题】:Adding two __m128 types via Accelerate framework通过 Accelerate 框架添加两个 __m128 类型
【发布时间】:2012-04-20 16:44:01
【问题描述】:


我需要使用 Accelerate 框架添加/mul/sub 两个 __m128 (float) 变量。但是,我找不到这样做的功能。所有 Accelerate 框架函数都采用 int__vector__ 类型而不是 float__vector__ 类型。我找到了划分'vdivf'的函数,但我也需要添加/mul/sub。

谁能告诉我,如何使用 Accelerate 框架添加/mul/sub 两个 __m128 (float) 变量?像这样:_mm_add_ps_mm_sub_ps_mm_mul_ps,但使用的是 Accelerate 框架 API。

【问题讨论】:

  • 您为什么觉得需要为此使用 Accelerate 框架?为什么不直接使用内在函数?
  • 我认为,如果Apple提供API来使用MMX、SSE等,使用这个API会更好。我需要支持 PPC 和 Intel 处理器系列,Accelerate 框架将自动处理 CPU 命令支持。另外,如果将来有什么改变,我认为使用 Accelerate 框架我需要做的改变更少。
  • 好的,但是你不想仅仅为单个向量调用 Accelerate 函数——这将是非常低效和毫无意义的——你需要处理合理大小的数组,否则函数调用开销将消除任何收益使用 SIMD。
  • 谢谢你,Paul,但接下来的问题是:我有一个用于 Windows 平台的 C++ 库,我需要至少使用 SSE2!代码更改。此代码使用_mm_add_ps 等函数,由于上述原因,我需要用Accelerate 框架中的模拟替换调用_mm_add_ps 等函数。你可以告诉我,有什么用呢?
  • 谢谢你,保罗,我希望我错过了一些东西,只是没有找到那个功能。

标签: sse2 accelerate-framework


【解决方案1】:

问题在于 Accelerate 是比使用 SSE2 内在函数更高级别的 API。 SSE 内在函数映射到单个指令,它们一次对一个向量进行操作。 Accelerate 提供了更高级别的函数 API,这些函数以更大的粒度运行,通常具有合理大小的数组。要移植现有代码,您应该坚持使用 SSE 内在函数,如果您确实需要 PowerPC 支持,那么您需要 #idef SSE 代码并为 ppc 构建编写等效的 AltiVec 实现。不过,我怀疑这是否值得付出努力 - Apple 大约在 7 年前停止销售 PowerPC Mac,因此现在 PowerPC 应用程序的市场一定非常小。

【讨论】:

    【解决方案2】:

    基本算术不需要 API:

    __m128 x, y;
    __m128 z = x + y;
    __m128 w = x - y;
    __m128 t = x * y;
    

    这些操作完全不需要 API,因此 Accelerate 没有。

    也就是说,如果您有使用 SSE 内在函数(_mm_add_ps 等)的现有代码,并且您确实在尝试进行“最少的代码更改”,那么您为什么要更改任何内容? SSE 内在函数在 OS X 上也能正常工作。

    【讨论】:

    • "你不需要 API 来做基本的算术" 你是什么意思?该操作会自动使用 SSE 指令吗?
    • @Lexandr:是的,他们会的。但是,正如我所指出的,如果您已经有使用内部函数的工作代码,不要更改它
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多