Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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
Android ARM(EABI)体系结构是否有任何特殊的C级编程技术?_Android_C_Gcc_Arm_Signal Processing - Fatal编程技术网

Android ARM(EABI)体系结构是否有任何特殊的C级编程技术?

Android ARM(EABI)体系结构是否有任何特殊的C级编程技术?,android,c,gcc,arm,signal-processing,Android,C,Gcc,Arm,Signal Processing,对于使用GCC和EABI的ARM-CPU目标的特殊C编程技术,我很感兴趣。我的应用程序包含大型数据阵列上的浮点密集型计算。主要目标是获得最快的可执行文件。我主要使用codesourcery和android ndk的arm eabi gcc版本。我也不想使用neon Intrinsic或对C代码进行任何更改,因为C代码与其他体系结构的编译器(如Intel compiler for IA32)不兼容。如果要保持可移植性,我的建议是不要使用浮点。大多数ARM芯片没有FPU,必须在软件中模拟操作 通常,

对于使用GCC和EABI的ARM-CPU目标的特殊C编程技术,我很感兴趣。我的应用程序包含大型数据阵列上的浮点密集型计算。主要目标是获得最快的可执行文件。我主要使用codesourcery和android ndk的arm eabi gcc版本。我也不想使用neon Intrinsic或对C代码进行任何更改,因为C代码与其他体系结构的编译器(如Intel compiler for IA32)不兼容。

如果要保持可移植性,我的建议是不要使用浮点。大多数ARM芯片没有FPU,必须在软件中模拟操作


通常,基准测试、更改和再次基准测试。任何性能优化如果没有彻底的前后性能测量都是徒劳的。

如果您想保持可移植性,我的建议是不要使用浮点。大多数ARM芯片没有FPU,必须在软件中模拟操作


通常,基准测试、更改和再次基准测试。在性能测量之前或之后没有任何性能优化是徒劳的。

< P>由于大多数ARM目标没有FPU,如果您想要最快的可执行文件,则应该考虑使用定点库。这篇Dobb博士的文章:很好地解释了CORDIC算法,并为本文讨论的库提供了完整的源代码。本文正是关于在没有FPU的ARM设备上加速数学密集型代码的。报告的结果通常是浮点实现的4倍加速,这是因为不使用矢量化的VFP(编译器不太可能支持矢量化,除非通过库代码提供5倍加速)对于软件实现来说非常好

注意:我使用了这个库,在log函数中发现了一个错误。通过在log\u two\u power\u n\u reversed[]数组初始化器的末尾添加一个0x0LL,可以更正此问题。我已与作者确认了这一更正。文章中代码的链接已断开,请访问:


编辑[OOS],抱歉文章和代码讨论了C++实现,使用运算符和函数重载广泛地使用固定类型尽可能透明。也许是一个很好的理由使用C++编译,但不是你所要求的。

< P>因为大多数ARM目标没有FPU,如果你想要最快的可执行文件,你应该考虑使用定点库。这篇Dobb博士的文章:很好地解释了CORDIC算法,并为本文讨论的库提供了完整的源代码。本文正是关于在没有FPU的ARM设备上加速数学密集型代码的。报告的结果通常是浮点实现的4倍加速,这是因为不使用矢量化的VFP(编译器不太可能支持矢量化,除非通过库代码提供5倍加速)对于软件实现来说非常好

注意:我使用了这个库,在log函数中发现了一个错误。通过在log\u two\u power\u n\u reversed[]数组初始化器的末尾添加一个0x0LL,可以更正此问题。我已与作者确认了这一更正。文章中代码的链接已断开,请访问:


编辑[OOS],抱歉文章和代码讨论了C++实现,使用运算符和函数重载广泛地使用固定类型尽可能透明。一个很好的理由也许是使用C++编译,但不是你要的。

< P>在没有FPU的CPU上实现性能最大化,也应该选择软浮点而不是硬浮点。这样,您的可执行文件将被链接到浮点库,而不是依赖内核捕获非法指令并在内核中模拟它们,这需要更多的时间,因为涉及到上下文切换

当然,如果您有一个带有硬件浮点单元的CPU,您应该使用硬浮点来利用它


幸运的是,EABI允许两种类型的可执行文件和库和平共存。

要在没有FPU的CPU上实现性能最大化,还应该选择软浮点而不是硬浮点。这样,您的可执行文件将被链接到浮点库,而不是依赖内核捕获非法指令并在内核中模拟它们,这需要更多的时间,因为涉及到上下文切换

当然,如果您有一个带有硬件浮点单元的CPU,您应该使用硬浮点来利用它


幸运的是,EABI允许两种类型的可执行文件和库和平共存。

唉,为了在智能手机当前使用的所有ARM处理器中获得最佳的数字运算性能,最好的方法可能是对
r每个ARM架构:无fpu芯片的缩放整数算法或较慢的软浮点,带流水线VFP硬件的芯片的可重叠浮点,以及支持霓虹灯的芯片的并行非便携式霓虹灯内置电路。您可能需要对所有这些进行编码,并在检测到CPU体系结构后使用运行时计算例程选择。

唉,要在当前用于智能手机的所有ARM处理器中获得最佳的数字运算性能,最好的方法可能是针对每种ARM架构做一些完全不同的事情:对于无fpu的芯片,可缩放的整数算法或较慢的软浮点;对于具有流水线VFP硬件的芯片,可重叠的浮点;对于具有霓虹灯功能的芯片,可并行化的非便携式霓虹灯内部电路。您可能需要对所有这些进行编码,并在检测到CPU体系结构后使用运行时计算例程选择。

我的目标CPU的每个CPU都有FPU Cortex A8、A9。@psihodelia:在这种情况下,ARM在C代码级别上可能没有任何特定的功能,除了说您的编译器可能不会生成利用SIMD指令的代码外,库可能会这样做,但这不是给定的;您需要调查并可能优化汇编程序中的某些操作。我使用的一个库使用收敛算法实现了sqrt,尽管硬件直接支持该函数!即使您有一个FPU,但对性能感兴趣,您也应该尝试在定点中进行计算。与高级SIMD指令相比,VFP指令集非常有限。此外,还存在意外的VFP性能缺陷,例如,当编译为VFP时,选择两个浮点值中较小的一个的简单函数会导致vcmpe/vmrs/b{cond}序列,从而导致很长的CPU暂停。另请参阅建议:与条件执行相比,使用高级SIMD值选择操作比使用等效的VFP更有效。我的目标CPU的每个CPU都有FPU Cortex A8、A9。@psihodelia:在这种情况下,在C代码级别上可能没有关于ARM的任何特定信息,除了说您的编译器可能不会生成利用SIMD指令的代码外,库可能会这样做,但这不是给定的;您需要调查并可能优化汇编程序中的某些操作。我使用的一个库使用收敛算法实现了sqrt,尽管硬件直接支持该函数!即使您有一个FPU,但对性能感兴趣,您也应该尝试在定点中进行计算。与高级SIMD指令相比,VFP指令集非常有限。此外,还存在意外的VFP性能缺陷,例如,当编译为VFP时,选择两个浮点值中较小的一个的简单函数会导致vcmpe/vmrs/b{cond}序列,从而导致很长的CPU暂停。另请参阅建议:与条件执行相比,使用高级SIMD值选择操作比使用等效的VFP更有效。对于Android,VFP硬件相当常见。NDK的目标是软FP armv5te和硬FP armv7-a。您没有说您的目标设备是什么。@fadden:不同的处理器,有些支持NEON SIMD指令,有些没有浮点协处理器。主要是ARMV5、v6、v7和A8/A9。对于Android,VFP硬件相当常见。NDK的目标是软FP armv5te和硬FP armv7-a。您没有说您的目标设备是什么。@fadden:不同的处理器,有些支持NEON SIMD指令,有些没有浮点协处理器。主要是ARM v5、v6、v7和A8/A9。