RX65N Envision Kit でレイ・トレーサーを走らせてみました。

M5Stack や、ESP32 では、定番のようなので、ソースを取得、元々 Arduino 用なので、改造して動かしてみました。

ESP32(160MHz) では13秒らしいですが、120MHzのRX65では7.7秒なので、かなり高速ですね。

※速度比較の為320×240でレンダリングしてます。

ソースコードは以下に・・

https://github.com/hirakuni45/RX/tree/master/RTK5_RAYTRACER

 

Parents
  • 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
    
    $
    
  • 自己レス
    FSQRT のマクロ、raytracer.hpp に使うとコンパイラのバグ? に当たるのか異常なパラメタが渡されてエラーになるので確認中。
Reply Children
No Data