Objective-c: 将 uint8 数组转换为 int32

Objective-c: convert array of uint8 to int32

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

vDSP_vfltu8D

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

在那种情况下,根据上面的评论:

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

如果有一个命令可以做到这一点。没有。有一些命令可以让您在连续使用时将 uint8 加载到 64 位寄存器中,将它们移位并将其他字节归零,然后将它们存储为 int32秒。这些命令将有更多的开销,因为它需要几个操作来完成。

如果您真的想查看可用的命令,请在此处查看它们(同样,不确定 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 的循环开销。它不会做太多,但是,嘿,它是一些东西。

资料来源:我在 Intel 的 SIMD/Vector 团队工作,转换 C 函数以优化 256 位寄存器。不幸的是,有些事情无法有效地完成。