Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标c:将uint8的数组转换为int32_Objective C_C_Accelerate Framework - Fatal编程技术网

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

Objective c 目标c:将uint8的数组转换为int32,objective-c,c,accelerate-framework,Objective C,C,Accelerate Framework,我正在寻找能将uint8数组快速转换为int32的函数(保持数字计数)。 vDSP库中已经有这样一个函数,可以将uint8转换为double: vDSP_vfltu8D 如何在Objective-c(iOS、amd-arch)上实现类似功能?也接受纯C解决方案。在这种情况下,根据上述评论: ARM的Neon SIMD/Vector库是您需要的,但我不能100%确定它在iOS上是否受支持。即使是,我也不会推荐它。iOS上有64位体系结构,这意味着您只能将进程速度提高一倍(因为您正在转换为int3

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

vDSP_vfltu8D

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

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


ARM的Neon SIMD/Vector库是您需要的,但我不能100%确定它在iOS上是否受支持。即使是,我也不会推荐它。iOS上有64位体系结构,这意味着您只能将进程速度提高一倍(因为您正在转换为
int32
s)

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

如果您确实想查看可用的命令,请在此处查看它们(同样,不确定它们是否在iOS上受支持):

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];
}
//语法不正确的代码
对于(int i=0;i
虽然这是一个小的优化,但它消除了3/4的循环开销。这不会有多大作用,但是,嘿,这是一件了不起的事情


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

您尝试过什么?输出有什么问题?请发布代码?Stackoverflow是为了回答诸如“为什么它不编译?”和“为什么它不生成”之类的问题正确的输出?“对于此类问题,必须提供代码。问题的当前措辞将征求意见,而不是确定的答案。您希望值为4 uint8s->1 int32还是1 uint8->1 int32,带前导零?以清楚地了解所需的功能:这与的
相同吗(i=0;需要回答AlexKoren和chux提出的问题;请回答您的问题,以澄清转换的确切性质。@chux,是的,我正在寻找如何更快地完成转换,可能是使用向量处理器命令或其他什么。平台是iOS,arm架构。感谢您的回答,似乎无法直接访问Neon功能在iOS上。为什么它们在库中使用128位向量?这可能涉及到使用两个64位处理器内核吗?现在创建的许多处理器(我从Intel的角度讲,我猜这与其他处理器有些一致)都有128位和256位寄存器或虚拟寄存器。“我不建议这样做。你在iOS上有一个64位的体系结构,这意味着你只能将进程速度提高一倍(因为你正在转换为int32s)。”arm64(和一些armv7部件)有128b simd寄存器;此外,这些是超标量机器,使用ILP你不能只将“机器宽度”除以“结果大小”“以获得预期的矢量化加速。苹果的ARM实现绝对是为simd构建的。256b矢量并没有什么神奇之处;它们增加了潜在的加速,但对于128b矢量寄存器,这个特定的任务矢量化与256b矢量寄存器一样好。”。