|
|
||
SIMD | |
iPhone 3GS / touch 3G では、ARM の NEON SIMD 命令が使えて胸がときめきます。ほんの少し設定すれば Xcode からもつかえる。
"-march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon" を CFLAGS につけないといけないかなーと思ってたんですが、つけたのとついてないのとで、吐かれるアセンブリが変わらないんですよね。なぞ。もっと複雑な SIMD 書くと違ってくるのかも。要追求。
iPhone 3GS か touch 3G な実機でしか動きません。
gist: 222087 - sum by ARM NEON- GitHub
- (void) sum { uint4 x = {0,1,2,3}; uint4 y = {4,5,6,7}; //uint4 result = x + y; uint4 result = vaddq_u32(x, y); uint32_t a = *(uint32_t *)&result; uint32_t b = *((uint32_t *)&result +1); uint32_t c = *((uint32_t *)&result +2); uint32_t d = *((uint32_t *)&result +3); NSLog(@"result = (%u,%u,%u,%u)", a, b, c, d); // -> result = (4,6,8.10) }
結果:
% /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/otool -tV build/neon_01.build/Release-iphoneos/neon_01.build/Objects-normal/armv7/neon_01AppDelegate.o
....
-[neon_01AppDelegate sum]:
0000007c b580 push {r7, lr}
0000007e af00 add r7, sp, #0
00000080 b085 sub sp, #20
00000082 ed9f4b0c vldr d4, [pc, #48] ; 0xb6
00000086 ed9f5b0d vldr d5, [pc, #52] ; 0xbe
0000008a ed9f6b0e vldr d6, [pc, #56] ; 0xc6
0000008e ed9f7b0f vldr d7, [pc, #60] ; 0xce
00000092 ef266844 vadd.i32 q3, q3, q2
00000096 ed8d6b01 vstr d6, [sp, #4]
0000009a ed8d7b03 vstr d7, [sp, #12]
....