我正在寻找能快速将uint8的数组转换为int32(保持数字计数)的函数。在vDSP库中已经有这样一个函数将uint8转换为double:
vDSP_vfltu8D如何在目标-c (iOS,amd arch)上实现类似函数?纯C解也被接受。
发布于 2015-10-09 15:18:39
在这种情况下,根据上文的评论:
ARM的Neon /Vector是你要找的,但我不能百分之百肯定它在iOS上是受支持的。即使是这样,我也不会推荐。您在iOS上有一个64位的体系结构,这意味着您只能将进程的速度提高一倍(因为您正在转换为int32的)。
现在,如果有一个命令可以做到这一点的话。没有。有几个命令允许您在连续使用时,将uint8s加载到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/4s的循环开销。不会有多大作用的,但是嘿,这是件好事。
资料来源:我在Intel的SIMD/Vector工作,将C函数转换为在256位寄存器上优化。不幸的是,有些事情无法有效地完成。
https://stackoverflow.com/questions/33019534
复制相似问题