M5Stack や、ESP32 では、定番のようなので、ソースを取得、元々 Arduino 用なので、改造して動かしてみました。
ESP32(160MHz) では13秒らしいですが、120MHzのRX65では7.7秒なので、かなり高速ですね。
※速度比較の為320×240でレンダリングしてます。
ソースコードは以下に・・
https://github.com/hirakuni45/RX/tree/master/RTK5_RAYTRACER
makefile を拝見したところ g++ を使用して RXv1 の命令を吐かせているようですが、折角の RX65N なのだから RXv2 命令に正しく対応してる筈(よく知らん)の CC-RX を使うか、あるいは g++ を工夫して使用して 3オペランド命令や FSQRT 命令が活用されればいくらかのパフォーマンス向上は期待できるのでは。
3オペランド命令が使えない RXv1 と 使える RXv2 の極端な比較
$ cat -n 3ope.cpp 1 float mul(float, float a, float b) 2 { 3 return a * b; 4 } 5 6 float add(float, float a, float b) 7 { 8 return a + b; 9 } 10 11 float sub(float, float a, float b) 12 { 13 return a - b; 14 } $ rx-elf-g++ -Wall -Wextra -O2 -c 3ope.cpp && rx-elf-objdump -d 3ope.o 3ope.o: file format elf32-rx-le Disassembly of section P: 00000000 <__Z3mulfff>: 0: ef 21 mov.l r2, r1 2: fc 8f 31 fmul r3, r1 5: 02 rts 00000006 <__Z3addfff>: 6: ef 21 mov.l r2, r1 8: fc 8b 31 fadd r3, r1 b: 02 rts 0000000c <__Z3subfff>: c: ef 21 mov.l r2, r1 e: fc 83 31 fsub r3, r1 11: 02 rts $ rx-elf-g++ -mcpu=rx64m -Wall -Wextra -O2 -c 3ope.cpp && rx-elf-objdump -d 3op e.o 3ope.o: file format elf32-rx-le Disassembly of section P: 00000000 <__Z3mulfff>: 0: ff b1 23 fmul r2, r3, r1 3: 02 rts 00000004 <__Z3addfff>: 4: ff a1 23 fadd r2, r3, r1 7: 02 rts 00000008 <__Z3subfff>: 8: ff 81 32 fsub r3, r2, r1 b: 02 rts $
FSQRT 命令が使えない RXv1 と 使える RXv2 の極端な比較
$ cat -n fsqrt.cpp 1 #include <cmath> 2 3 #if defined(__RXv2__) 4 #define sqrtf(_x) \ 5 ({ \ 6 float _y; \ 7 __asm __volatile( \ 8 "fsqrt %1, %0\n" \ 9 : "=r"(_y) \ 10 : "g"(float(_x)) \ 11 ); \ 12 _y; \ 13 }) 14 #endif 15 16 float hoge(const float a[3]) 17 { 18 return sqrtf(a[0]) + sqrtf(a[1]) + sqrtf(a[2]); 19 } $ rx-elf-g++ -Wall -Wextra -O2 -c fsqrt.cpp && rx-elf-objdump -d fsqrt.o fsqrt.o: file format elf32-rx-le Disassembly of section P: 00000000 <__Z4hogePKf>: 0: 6e 6a pushm r6-r10 2: ef 17 mov.l r1, r7 4: ec 11 mov.l [r1], r1 6: 05 00 00 00 bsr.a 6 <__Z4hogePKf+0x6> a: ef 1a mov.l r1, r10 c: a8 79 mov.l 4[r7], r1 e: 05 00 00 00 bsr.a e <__Z4hogePKf+0xe> 12: ef 16 mov.l r1, r6 14: a8 f1 mov.l 8[r7], r1 16: 05 00 00 00 bsr.a 16 <__Z4hogePKf+0x16> 1a: ef a7 mov.l r10, r7 1c: fc 8b 67 fadd r6, r7 1f: fc 8b 71 fadd r7, r1 22: 3f 6a 05 rtsd #20, r6-r10 $ rx-elf-g++ -Wall -Wextra -O2 -mcpu=rx64m -c fsqrt.cpp && rx-elf-objdump -d fs qrt.o fsqrt.o: file format elf32-rx-le Disassembly of section P: 00000000 <__Z4hogePKf>: 0: fc a0 13 fsqrt [r1].l, r3 3: fc a1 14 01 fsqrt 4[r1].l, r4 7: fc a1 15 02 fsqrt 8[r1].l, r5 b: ff a1 34 fadd r3, r4, r1 e: fc 8b 51 fadd r5, r1 11: 02 rts $