gpt4 book ai didi

ios - 如何在 Xcode 中使用 C 代码进行优化

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:36 27 4
gpt4 key购买 nike

下面是一段这样的代码:

// example_3
int Add_8K_3(int* in, int* out, int b)
{
int i;
for(i=0;i<1024;i++)
{
int a0, a1;
a0 = *in++;
a1 = *in++;
*out++ = a0 + b;
*out++ = a1 + b;
}
return 0;
}

我通过 ARMCC 和 Xcode(通过 -O3)编译它。但是两种结果的表现却大不相同。 Xcode 中的循环数大约是 armcc 结果的 3 倍。 ARM 汇编代码

    {
Add_8K_3 PROC
ADD r0,r0,#4
MOV r3,#0x400
PUSH {r4} ;3264
|L1.12|
SUBS r3,r3,#1
LDR r4,[r0,#-4] ;3271
LDR r12,[r0],#8 ;3271
ADD r4,r4,r2 ;3271
STR r4,[r1],#8
ADD r12,r12,r2
STR r12,[r1,#-4]
BNE |L1.12|
POP {r4}
MOV r0,#0
BX lr
ENDP
}

Xcode 汇编代码

    {
_Add_8K_3:
.cfi_startproc
Lfunc_begin3:
.loc 1 77 0 @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:77:0
@ BB#0:
.loc 1 76 19 prologue_end @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:76:19
push {r7, lr}
mov.w lr, #0
Ltmp15:
@DEBUG_VALUE: i <- 0+0
mov r7, sp
@DEBUG_VALUE: Add_8K_3:in <- R0+0
@DEBUG_VALUE: Add_8K_3:out <- R1+0
@DEBUG_VALUE: Add_8K_3:b <- R2+0
LBB3_1: @ =>This Inner Loop Header: Depth=1
Ltmp16:
@DEBUG_VALUE: Add_8K_3:in <- R0+0
@DEBUG_VALUE: Add_8K_3:out <- R1+0
@DEBUG_VALUE: Add_8K_3:b <- R2+0
@DEBUG_VALUE: i <- 0+0
.loc 1 82 9 @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:82:9
ldr.w r12, [r0, lr, lsl #3]
Ltmp17:
@DEBUG_VALUE: a0 <- R12+0
add.w r3, r0, lr, lsl #3
.loc 1 83 9 @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:83:9
ldr.w r9, [r3, #4]
Ltmp18:
@DEBUG_VALUE: a1 <- R9+0
.loc 1 86 9 @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:86:9
add.w r3, r12, r2
str.w r3, [r1, lr, lsl #3]
add.w r12, r1, lr, lsl #3
Ltmp19:
.loc 1 79 20 @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:79:20
add.w lr, lr, #1
Ltmp20:
@DEBUG_VALUE: i <- LR+0
.loc 1 87 9 @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:87:9
add.w r3, r9, r2
str.w r3, [r12, #4]
Ltmp21:
.loc 1 79 9 @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:79:9
cmp.w lr, #1024
bne LBB3_1
Ltmp22:
@ BB#2:
movs r0, #0
.loc 1 93 5 @ /Users/Emedia/Desktop/testperformance/testperformance/core.c:93:5
pop {r7, pc}
Ltmp23:
Lfunc_end3:
}

我可能遇到的问题是Xcode 无法通过合适的 asm 代码解析“in[X]”。我的问题是:(1) 我如何编写 C 代码来生成 Xcode 可以将“in[X]”解析为像 arm 这样合适的 asm 代码的 asm 代码?(2) 有没有手册描述编译器与 clang 和 armcc 的区别,并告诉我如何编写高性能的 iOS C 代码。

谢谢。

最佳答案

虽然 Apple 的 LLVM 生成了不错的代码(比 GCC 好得多),但它仍然无法与一流的 ARMCC 相提并论。

事实上,ARMCC 真的非常好。

但是,您的示例非常简单,即使臭名昭著的 GCC 也不会失败。

你的代码搞砸了两件事:

  1. ARMCC 在 ARM 模式下完成工作,在 Thumb2 中完成 LLVM
  2. XCode 二进制文件仍然包含调试/分析信息。您应该更改相应的选项。

NEON 可以更快地处理示例函数,但对于 iOS 部署,您需要同时使用 AARCH32 和 AARCH64 版本,并且两者在语法和寄存器分配方面有很大不同。

如果您正在尝试学习 ARM 汇编以进行优化,请不要这样做。 AARCH64 的 ISA 是完全重构和简化的,这意味着即使是世界上最糟糕的编译器,如 GCC,也能够生成半途而废的代码。

但 NEON 是另一回事。这可能是值得的。 (但你必须同时编写 AARCH32 和 AARCH64 版本)

关于ios - 如何在 Xcode 中使用 C 代码进行优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19950052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com