【问题标题】:Objective-c: convert array of uint8 to int32Objective-c:将 uint8 数组转换为 int32
【发布时间】:2015-10-08 15:04:49
【问题描述】:

我正在寻找可以将 uint8 数组快速转换为 int32 的函数(保持数字计数)。 vDSP库中已经有这样一个函数可以将uint8转换为double:

vDSP_vfltu8D

如何在 Objective-c (iOS, amd arch) 上实现类似的功能?也接受纯 C 解决方案。

【问题讨论】:

  • 你试过什么?输出有什么问题?请贴出代码? Stackoverflow 是为了回答这样的问题:“为什么它不能编译?”和“为什么它不能产生正确的输出?”对于此类问题,必须提供代码。问题的当前措辞将征求意见,而不是明确的答案。
  • 您希望值是 4 uint8s -> 1 int32 还是 1 uint8 -> 1 int32,前导零?
  • 要清楚地了解所需的功能:这是否与for (i=0; i<N; i++) a_int32[i] = a_uint8[i] 相同但速度快?或者它是更奇特的东西?您的平台是 DSP 还是任何旧 CPU?
  • AlexKoren 和 chux 都提出的问题需要回答;请edit您的问题澄清转换的确切性质。
  • @chux,是的,我正在寻找如何更快地做到这一点,可能正在使用矢量处理器命令或其他东西。平台是iOS,arm架构。

标签: objective-c c accelerate-framework


【解决方案1】:

在那种情况下,基于上面的 cmets:

ARM 的 Neon SIMD/Vector 库正是您想要的,但我不能 100% 确定它在 iOS 上受支持。即使是这样,我也不会推荐它。您在 iOS 上拥有 64 位架构,这意味着您只能将处理速度提高一倍(因为您要转换为 int32s)。

现在,如果有一个命令可以做到这一点。没有。有一些命令可以让您在连续使用时将uint8s 加载到64 位寄存器中,将它们移位并将其他字节清零,然后将它们存储为int32s。这些命令将有更多开销,因为它需要执行多个操作。

如果您真的想查看可用的命令,请在此处查看它们(同样,不确定它们是否在 iOS 上受支持):http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489e/CJAJIIGG.html

iOS 架构并不是真正为这种处理而构建的。在大多数情况下,矢量命令仅在计算机具有 256 位寄存器时才有用,允许您一次加载 32 个字节并同时对它们进行操作。我建议您使用在循环中一次转换一个的常规方法(或者可能解开循环以消除一些开销,如下所示:

//not syntactically correct code
for (int i = 0; i < lengthOfArray; i+=4) {
    int32Array[i] = (int32)int8Array[i];
    int32Array[i + 1] = (int32)int8Array[i + 1];
    int32Array[i + 2] = (int32)int8Array[i + 2];
    int32Array[i + 3] = (int32)int8Array[i + 3];
}

虽然这是一个小优化,但它消除了 3/4 秒的循环开销。它不会做太多,但是,嘿,它是一些东西。

资料来源:我曾在英特尔的 SIMD/Vector 团队工作,将 C 函数转换为在 256 位寄存器上进行优化。不幸的是,有些事情无法有效地完成。

【讨论】:

  • 感谢您的回答,iOS 上似乎无法直接访问 Neon 功能。为什么他们在库中使用 128 位向量?会不会涉及到使用两个 64 位处理器内核?
  • 现在创建的许多处理器(我是从英特尔的角度说的,我猜这与其他处理器有些一致)具有选择的 128 位和 256 位寄存器或虚拟寄存器。
  • "我不推荐它。你在 iOS 上拥有 64 位架构,这意味着你只能将你的进程速度提高一倍(因为你正在转换为 int32s)。 arm64(和一些 armv7 部件)有 128b simd 寄存器;此外,这些是超标量机器,使用 ILP,您不能仅将“机器宽度”除以“结果大小”来获得预期的矢量化加速。 Apple 的 ARM 实现绝对是为 simd 构建的。
  • 256b 向量没有什么神奇之处;它们增加了潜在的加速,但是这个特殊的任务对 128b 向量寄存器的向量化和对 256b 向量一样好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多