GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
以上の各ボードを使用して、下記のスケッチを動作させ、円周率を10進数で小数点以下1000桁分求めてパフォーマンスを較べてみた。
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) #if defined(ARDUINO) && ARDUINO >= 100 #include <Arduino.h> #else #include <WProgram.h> #endif #define _ARDUINO_AVR_ 1 #elif defined(__SAM3X8E__) #include <Arduino.h> #define _ARDUINO_DUE_ 1 #elif defined(__RX__) #include <rxduino.h> #define _GR_SAKURA_ 1 #elif defined(__RL78__) #include <RLduino78.h> #define _GR_KURUMI_ 1 #else #error unknown target. #endif #define DIGITS 1000 #define BUFBITS (int(/*log(10)/log(2)*/3.32192809489 * DIGITS) + 1) static uint8_t buf[(BUFBITS + 7) / 8]; static uint8_t pi_dig16(unsigned n); void setup() { Serial.begin(9600); unsigned long start = millis(); for (int i = 0; i < ((BUFBITS + 3) / 4); i++) { if ((i & 1) == 0) { buf[i / 2] = pi_dig16(i) << 4; } else { buf[i / 2] |= pi_dig16(i); } } unsigned long time = millis() - start; Serial.println("PI = 3."); int c = 0; for (int i = 0; i < DIGITS; i++) { for (int j = (BUFBITS + 7) / 8 - 1; j >= 0; j--) { c += 10 * buf[j]; buf[j] = c % 256; c /= 256; } Serial.print(c); if ((i + 1) == DIGITS || i % 50 == 49) { Serial.println(); } else if (i % 10 == 9) { Serial.print(" "); } } Serial.println(); Serial.print(time); Serial.println("msec."); } void loop() { } #define main _main #if _ARDUINO_AVR_ #define lrintf lrint #define floorf floor #undef __AVR__ #endif #if _GR_SAKURA_ #define _STDINT_H #endif /* このコメントより下に、 http://www.mikrocontroller.net/articles/4000_Stellen_von_Pi_mit_ATtiny2313 で公開されてる pi.c の内容をコピペする */
結果は以下の通り。
以下、所感。
以前、値段に釣られてついウッカリ買ってしまったがホッタラカシになってたマイコンボードが出てきたのでラインナップに追加。
合わせてスケッチも修正。
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) #if defined(ARDUINO) && ARDUINO >= 100 #include <Arduino.h> #else #include <WProgram.h> #endif #define _ARDUINO_AVR_ 1 #elif defined(ARDUINO) && defined(__SAM3X8E__) #include <Arduino.h> #define _ARDUINO_DUE_ 1 #elif defined(__RX__) #include <rxduino.h> #define _GR_SAKURA_ 1 #elif defined(__RL78__) #include <RLduino78.h> #define _GR_KURUMI_ 1 #elif defined(ENERGIA) #include <Energia.h> #if defined(__MSP430G2452__) || defined(__MSP430G2553__) #define _LAUNCHPAD_VALUELINE_ 1 #elif defined(__LM4F120H5QR__) #define _LAUNCHPAD_STELLARIS_ 1 #else #error unknown target. #endif #else #error unknown target. #endif #define DIGITS 1000 #define BUFBITS (int(/*log(10)/log(2)*/3.32192809489 * DIGITS) + 1) #if !_LAUNCHPAD_VALUELINE_ static uint8_t buf[(BUFBITS + 7) / 8]; #endif static uint8_t pi_dig16(unsigned n); void setup() { Serial.begin(9600); unsigned long start = millis(); for (int i = 0; i < ((BUFBITS + 3) / 4); i++) { #if !_LAUNCHPAD_VALUELINE_ if ((i & 1) == 0) { buf[i / 2] = pi_dig16(i) << 4; } else { buf[i / 2] |= pi_dig16(i); } #else pi_dig16(i); #endif } unsigned long time = millis() - start; Serial.println("PI = 3."); #if !_LAUNCHPAD_VALUELINE_ int c = 0; for (int i = 0; i < DIGITS; i++) { for (int j = (BUFBITS + 7) / 8 - 1; j >= 0; j--) { c += 10 * buf[j]; buf[j] = c % 256; c /= 256; } Serial.print(c); if ((i + 1) == DIGITS || i % 50 == 49) { Serial.println(); } else if (i % 10 == 9) { Serial.print(" "); } } #endif Serial.println(); Serial.print(time); Serial.println("msec."); } void loop() { } #define main _main #if _ARDUINO_AVR_ #define lrintf lrint #define floorf floor #undef __AVR__ #endif #if _GR_SAKURA_ #define _STDINT_H #endif #if _LAUNCHPAD_VALUELINE_ #define lrintf (int)rintf #define stdout (0) #define fputc(x, y) ((void)x, (void)y) #define fflush(x) ((void)x) #endif /* このコメントより下に、 http://www.mikrocontroller.net/articles/4000_Stellen_von_Pi_mit_ATtiny2313 で公開されてる pi.c の内容をコピペする */
結果。
RL78 のコンパイラの比較で、float の処理を固定小数点に変更したことで新たに分かった事柄もあったので、こっちも固定小数点でのテストを行うことにした。
GR-PEACH のデータを追加。
GR-PEACHクッソ速くて笑った。
しかしSAKURAとは周波数比を考えれば。
しかしSAKURAとの価格比を考えると、、、
Arduinoに負けているKURUMIはもっと頑張ってほしい。
> Arduinoに負けているKURUMIはもっと頑張ってほしい。
KURUMI の float版の速度が Arduino と較べて振るわないのは、Arduino で使用しているライブラリはアセンブラで書かれててカリカリにチューニングされているのに対し、KURUMI の使ってるツールチェーン GNURL78 の浮動小数点演算ルーチンが GNU の C で汎用に書かれているやつだからですね。ルネサス純正の CC-RL や IAR の売り物の製品では最適化されたコードが使われているようでもっと良い数字が出てます。
ご参考『RL78 コンパイラ頂上決戦 ~GNU ルネサス IAR 三つ巴の戦い~』http://japan.renesasrulz.com/gr_user_forum_japanese/f/110/p/628/10916.aspx#10916
ルネサスも(特に海外では) GCC は開発ツールのひとつとして推してるんだし、CC-RL 用のこの辺のコードを GNU に提供するとかして欲しいところですね。
積み基板であった Galileo のデータを追加。