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

时间:2015-10-08 15:04:49

标签: objective-c c accelerate-framework

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

@echo off
set var=RAAAAAAV.KKK9.Z01_YYYYMMDDhhmmss
set "var=%var:_="&rem %
set var

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

1 个答案:

答案 0 :(得分:2)

在这种情况下,根据上述评论:

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

现在,如果有一个命令可以做到这一点。没有。有一些命令允许您在连续使用时将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的循环开销。它不会做太多,但嘿,这是件事。

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