たけおか ぼちぼち日記

たけおか ぼちぼち日記

思いついたらメモ

これは、 Lisp SETF Advent Calendar 2018 - Qiita の DEC/21 の記事として書きました。


setcar! でググると、レンタカー屋さん と、バスなどを作ってる会社 が出てきた(^^;
なるほどっ!


純粋関数型が好きな 意識の高い人々からは、極めてバカにされている Lisp の setf などですが…
実際、副作用は良くないよね。並列化の邪魔だ。
(私は、TK80で遊び始めた頃から並列計算が好きです)

だが…
私は、setcar! (rplaca), setcdr! (rplacd) を使う。断じて使う。
(私はCommon Lispを書くことが多いので、rplaca/rplacd/setf を使う)


Lispで、プログラミング言語の実行系をつくるのは、誰もが、しばしば(バシバシと)行っているであろう。

・いにしえの素朴なLisp インタープリタを作るとき…
変数などのバインディング状況を環境として作り、その環境をリストでつないでいくであろう。

バインディングの表現方法によるが、変数の内容が更新された時、setcdr! (か、setcar!) を使うことになるであろう。
実現方法が素朴であり、それなりの実行速度を求め、かつ、プログラマが楽をしたければ。(^^;

また、関数呼び出しから戻るとき、
(C言語的な表現ならば、スタックを巻き戻すとき)
環境リストの新しいものを切り捨てて、古い方の環境を最新にする。
これも、環境リストの表現方法によるが…
環境リストの最新を保持する cons の carかcdr を set! する(つまり、setcar! か setcdr!する)
ことになるであろう。(環境リストを単純な変数で保持していたら、その変数にset!するだけだが)
大域脱出などで、環境リストを、いきなりたくさん縮めたいときに、setcdr! したい気持ちが高まる(であろう、たぶん…きっと…)。



・Prologインタープリタを Lispで作るとき…

Prologの変数は、双方向代入であり…
ず〜っとアンバウンド(未代入)の変数の値が、どんどん呼びだされた後の節の中で決まり(バインドされ)、
それが呼び出し側(環境リストでいうと浅い側の環境の中)の変数に反映されなければならない。
これは、もう、環境リスト中の変数の値を、set!(インタープリタの中では、setcdr!ぐらい)を、行うしかないっ!
(凡人の脳では)

そして加えて…
Prologが素晴らしいのは、バックトラックが行われた場合、
上記のような変数のバインディングは、キレイさっぱりと、忘れてしまわなければならないことである。
その実現を、素朴な凡人脳でプログラムすると、
環境リストの途中を setcdr! して、
忘れてしまいたいバインディングを保持した環境を、切り離してしまうことであろう。

うほほ〜い、setcar!/setcdr! 最高〜\(^^)/


・Schemeの setcar!/setcdr! が rplaca/rplacd でないのは…
私は、
「SchemeにMAC Lisp上に書かれていたものがあって、関数名がMAC Lispとぶつからないようにしてたのじゃないかな〜」
と、勝手に想像してます。



・ちなみに、Common Lisp の setfは、私の中では…
- 値を得る直前に、寸止めして、参照場所を見るだけとして堪え、
- そこに値をぶち込む
という行為に、
マゾ感覚(寸止めで我慢) と、
サド感覚(最後に、値をぶち込む)
の両者を感じ、大変に感情を揺さぶられる 魅惑的な機能として位置づけられている。
また、setfは、純粋関数に反した背徳的な行為であることも、その魅力を、指数関数的に増大させている。


もう、私は、setf/rplaca/rplacd 無しでは、退屈すぎて、クリスマスも自宅で寝るしかないのである。
(setf/rplaca/rplacd があっても、クリスマスは自宅で寝ると思われるが…)

これは、関西Lisp アドベント・カレンダの 2017年12月2日です。

 

  • 基本Lisp小咄

    Lisperには紅茶好きが多い(?)

    LisperA: 「foodp ?」(和訳: 飯に行かない? ) 
    LisperB: 「T」(yes) 
    飯屋に行き、一通り飯を食い終わったところにウエイトレスが来て、
    ウエイトレス: 「Coffee?」(コーヒーはいかが?)
    Lispers: 「T」
    少し後、紅茶(ティー)が運ばれてきた…

 

  • どうして CAR は、左の要素を取るのか
         「クルマ(Car)は左」というじゃろ。
                 ただし、日本とイギリス限定 (^^;
                 (このネタは、竹内郁雄さんの文章で読みました)
 
  • 「ラムダ文字山」
 

a>

 
  • 火星のラムダ文字山
 

 
お粗末
 

 
 
 

関西Lisp のネタのために、usim を引っ張り出してきた。

古いオリジナルのものをそのままmakeしても、動作した。(64bit Linux用に、ちょっと直した)

 

g000001さんのusimの記事"http://g000001.cddddr.org/3700105594"にある 

この GitHub: ams/mit-cadr から、 download Zip で得たものも簡単に動いた。

 

OSは、Ubuntu 16.04LTS 64bit。

 

usimは、32bit で make して吉。

 

ubuntu x86_64 の場合、32bit コンパイル環境を入れる
 $ sudo apt-get install libc6-dev-i386
 $ sudo apt-get install libsdl1.2debian:i386

そして、Makefile をちょっと変更。

 

--------

*** Makefile.org    2017-04-02 17:15:10.000000000 +0900
--- Makefile    2017-10-09 22:00:15.842199400 +0900
***************
*** 34,41 ****
  endif
  
  ifeq ($(OS_NAME), Linux)
! DISPLAY = X11
! KEYBOARD = OLD
  endif
  
  #----------- code ------------
--- 34,43 ----
  endif
  
  ifeq ($(OS_NAME), Linux)
! #DISPLAY = X11
! DISPLAY = SDL
! #KEYBOARD = OLD
! KEYBOARD = NEW
  endif
  
  #----------- code ------------
***************
*** 77,83 ****
  ifeq ($(DISPLAY), X11)
  LFLAGS = -m32
  ifeq ($(OS), LINUX)
! USIM_LIBS = -L/usr/lib/x86_64-linux-gnu -lX11 -lpthread
  else
  USIM_LIBS = -L/usr/X11R6/lib -lX11 -lpthread
  endif
--- 79,86 ----
  ifeq ($(DISPLAY), X11)
  LFLAGS = -m32
  ifeq ($(OS), LINUX)
! #USIM_LIBS = -L/usr/lib/x86_64-linux-gnu -lX11 -lpthread
! USIM_LIBS =
  else
  USIM_LIBS = -L/usr/X11R6/lib -lX11 -lpthread
  endif
***************
*** 90,97 ****
  #CFLAGS= -O3 -march=pentium3 -mfpmath=sse -mmmx -msse $(DEFINES) -Walle
  #CFLAGS = -O3 -fomit-frame-pointer -mcpu=i686 -g $(DEFINES)
  #CFLAGS= -O3 -mfpmath=sse -mmmx -msse $(DEFINES) -Walle
! CFLAGS = -mfpmath=sse -mmmx -msse -DMAP_SITE_TREE_DIRECTORY $(DEFINES) -g
! LFLAGS = -ldl -L/usr/lib
  USIM_SRC += Files.c glob.c
  USIM_HDR += Files.h glob.h
  USIM_LIBS += -lrt
--- 93,103 ----
  #CFLAGS= -O3 -march=pentium3 -mfpmath=sse -mmmx -msse $(DEFINES) -Walle
  #CFLAGS = -O3 -fomit-frame-pointer -mcpu=i686 -g $(DEFINES)
  #CFLAGS= -O3 -mfpmath=sse -mmmx -msse $(DEFINES) -Walle
! #CFLAGS = -mfpmath=sse -mmmx -msse -DMAP_SITE_TREE_DIRECTORY $(DEFINES) -g
! #CFLAGS = -mfpmath=sse -mmmx -msse -DMAP_SITE_TREE_DIRECTORY $(DEFINES) $(M32) -g
! CFLAGS = -O4 -mfpmath=sse -mmmx -msse -DMAP_SITE_TREE_DIRECTORY $(DEFINES) $(M32)
! #LFLAGS = -ldl -L/usr/lib
! LFLAGS = $(M32) -ldl -L/usr/lib
  USIM_SRC += Files.c glob.c
  USIM_HDR += Files.h glob.h
  USIM_LIBS += -lrt
***************
*** 110,116 ****
  M32 = -m32
  
  ifeq ($(DISPLAY), SDL)
! USIM_LIBS = /usr/lib/libSDL-1.2.so.0.7.0 -lpthread
  endif
  
  endif
--- 116,123 ----
  M32 = -m32
  
  ifeq ($(DISPLAY), SDL)
! #USIM_LIBS = /usr/lib/libSDL-1.2.so.0.7.0 -lpthread
! USIM_LIBS = /usr/lib/i386-linux-gnu/libSDL-1.2.so.0 -lpthread
  endif
  
  endif

---------------------------------------

そしてmake すれば、OK。

 

$ ./usim で、起動する。

 

 

 

<hr>

 

XBee をだいぶ前に、入手して、少し遊んでいた。

だが、End Device APIだか、End Device AnalogIOだったか、ADC を読み込んで、自動的に送出する ファームウェア を焼いたら、ちっとも通信できなくなった… orz

 

そして、ファームウェアの更新(元に戻す)も、できなくなった…

 

急に思い立って、真面目にググって見つけたのが…

「Bootloader to force XBee reflash」

http://www.digi.com/wiki/developer/index.php/Bootloader_to_force_XBee_reflash

 

これでうまく、ファームウェアを焼き直せた。

 

僕の XBee は、XB24-Z7CIT-007 

 

要するに…

DTR (9ピン), DIN(3ピン) を GND に落として、reset する。

僕の場合、それで、Bootloader が起動した。

シリアル端末を、115200bps, 8bit, non-parity で、つないでおけば、boot loaderの起動メッセージが見えて、判る。

 

その後、X-CTU を起動して、強制的にファームウェア更新を行えば、良し。

 

 

「Bootloader to force XBee reflash」の内容、正確には…

DTR (9ピン), DIN(3ピン) を GND に落として、reset する。

シリアル端末を、115200bps, 8bit, non-parity で、つないで、

"B", 「CR」

を打ち込むと、boot loader が起動すると、書いてある。

 

 

ま、とりあえず、ATコマンドで遊べるように戻ったので、めでたい。

 


Raspi2 の浮動小数点演算性能 OpenMP 使用編

先日、Raspi2 の1 コアの浮動小数点演算性能を Linpack で測った

OpenMP を使用する Linpack がある。
古いのかも知れないが、 http://people.inf.ethz.ch/arbenz/book/Chapter4/ から、

http://people.inf.ethz.ch/arbenz/book/Chapter4/ompsgefa.tar
を得た。
CBLASやBLASのルーチンが必要なので、上記ページからリンクのある、CBLASなどをゲットして、
適当にmake した。

gcc, gfortranは、4.8.2 を使用した。
gcc, gfortran のオプションは下記
CFLAGS = -O4 -fopenmp -march=armv7-a -mfpu=vfpv3-d16
FFLAGS = -O4 -fopenmp -march=armv7-a -mfpu=vfpv3-d16

Raspbian 標準の gcc,gfortran 4.6.3も計測したが、今回は、単精度に関わらず、4.8.2 に負けていた。
(結果の表の、末尾に gcc,gfortran 4.6.3 omp_tread=4 の結果を掲げてある)

Raspi2 は 4 coreである。
OMP thread を1 ~ 4 まで変えて、計測してみた。
システム・クロックは1000MHz

計測結果は、Google表計算で
https://docs.google.com/spreadsheets/d/1HV3aaqAxxXxustCJjhZsqLiypWJ_kZGGwEeE2aybEh0/edit?usp=sharing



結局、
OpenMP で 4 thread だと、1threadの 2.13倍ぐらい。
Raspi2は、1 core Linpack で 166 MFlops 程度だったので…
4thread (4 core) 時は、
166 MFlops × 2.13 = 352.76 MFlops ぐらいの
実効性能であろうか。




Aitendo に行くと、特売品を買ってしまう。
今日は、液晶漏れ(?)だかの、FSTN液晶[COG128X64-18P7565]を100円で買ってしまった。
(今回は、LCDにコネクタ基板がついている シリアルFSTN液晶モジュール(128x64/SPI) [18P7565-2P] 100円を買った)
そもそも、先日に、Aitendoの下記のWebページで、簡単に動きそうなことを読んでいたものだった、だがしかし…
びんぼうでいいの with LCD [U3RLCD18P7565]
シリアルFSTN液晶モジュール(128x64/SPI) [18P7565-2P]
FSTN液晶モジュール(128x64) [COG128X64-18P7565]

下の写真は、苦労の末、動いているもの
動作中



しかし、この びんぼうでいいの(Arduino) と接続する情報が、えらい酷いもので…
安定の、Aitendo クオリティ。100円で、長時間、楽しめる(^^;

当該ページに、ある結線のうち、一つは、VSS(GND)ではなく、オープン(N.C)にしておくべきものであった。(下図)
結線、修正版

今回、N.Cにしたものは、なにか、意味のある線かも知れないが、調べる気もしなく、得体が知れないので、もう、N.Cでいいや。



コントラストと、しきい値抵抗を、適切に設定すると、結構キレイに映る。
その情報は、下記。


------ ST7565.cpp.patch

*** ST7565.cpp.org 2015-02-28 17:42:20.000000000 +0900
--- ST7565.cpp 2015-03-01 01:27:20.000000000 +0900
***************
*** 421,427 ****
_delay_ms(10);

// set lcd operating voltage (regulator resistor, ref voltage resistor)
! st7565_command(CMD_SET_RESISTOR_RATIO | 0x6);

// initial display line
// set page address
--- 425,432 ----
_delay_ms(10);

// set lcd operating voltage (regulator resistor, ref voltage resistor)
! // st7565_command(CMD_SET_RESISTOR_RATIO | 0x6);
! st7565_command(CMD_SET_RESISTOR_RATIO | 0x2); /*take@takeoka.net*/

// initial display line
// set page address
***************



-----------examples/st7565lcd/st7565lcd.pde.patch

*** examples/st7565lcd/st7565lcd.pde.org 2013-03-11 20:49:20.000000000 +0
900
--- examples/st7565lcd/st7565lcd.ino 2015-03-01 01:30:00.000000000 +0900
***************
***************
*** 27,37 ****
Serial.print(freeRam());

// turn on backlight
! pinMode(BACKLIGHT_LED, OUTPUT);
! digitalWrite(BACKLIGHT_LED, HIGH);

// initialize and set the contrast to 0x18
! glcd.begin(0x18);

glcd.display(); // show splashscreen
delay(2000);
--- 29,43 ----
Serial.print(freeRam());

// turn on backlight
! // pinMode(BACKLIGHT_LED, OUTPUT);
! // digitalWrite(BACKLIGHT_LED, HIGH);

// initialize and set the contrast to 0x18
! // glcd.begin(0x18);
! glcd.begin(0x10); /*contrast ,
! and check st7565_command(CMD_SET_RESISTOR_RATIO | 0x2);
! take@takeoka.net*/
! glcd.st7565_command(CMD_SET_RESISTOR_RATIO | 0x2);/*take@takeoka.net*/

glcd.display(); // show splashscreen
delay(2000);




Raspberry Pi 2を動かした
Dhrystone など、整数性能は、クロック比程度の性能向上。
Raspi1は、ARM11@700MHz で、Raspi2 は、ARM Cortex-A7@1000MHz。
ARM11は、なかなかいい機械だったので、Cortex-A7と比べてもあまり見劣りしない。

浮動小数点演算 性能が気になる。
組込みCPUなので、期待をしてはいけないが…
Raspi1 の FPU は、ARMの VFP で、ショート・ベクトルとか言っているが、
どないもこないも、遅いしろものであった…

Raspi2 のFPUは、また別物。

Raspbian 標準の gcc (gcc 4.6.3) に
CFLAGS = -O4 -mfp=3 -march=armv7-a -mfpu=vfpv3-d16
で、linpack を make。

システムクロックは、1000MHz と 標準の700MHz で計測。



--- 1000MHz ---

take@raspi2% ./linpackc_sp
Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.58 86.21% 10.34% 3.45% 156952.375
128 1.16 91.38% 0.00% 8.62% 165836.516
256 2.32 88.79% 1.72% 9.48% 167415.844
512 4.62 89.18% 3.46% 7.36% 164286.562
1024 9.27 87.59% 3.02% 9.39% 167415.984
2048 18.54 88.03% 2.10% 9.87% 168317.594

Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.58 89.66% 0.00% 10.34% 169025.500
128 1.16 83.62% 0.00% 16.38% 181223.141
256 2.32 87.50% 4.74% 7.76% 164286.656
512 4.63 89.20% 2.16% 8.64% 166228.547
1024 9.27 88.57% 2.48% 8.95% 166622.547
2048 18.54 88.24% 3.13% 8.63% 166032.109

Enter array size (q to quit) [200]:

take@raspi2% ./linpackc_dp
Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.78 87.18% 5.13% 7.69% 122074.074
128 1.54 89.61% 4.55% 5.84% 121232.184
256 3.09 91.59% 2.59% 5.83% 120815.578
512 6.19 90.79% 2.75% 6.46% 121441.566
1024 12.36 91.10% 2.91% 5.99% 121023.523

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.77 90.91% 2.60% 6.49% 122074.074
128 1.55 91.61% 2.58% 5.81% 120401.826
256 3.10 90.97% 2.58% 6.45% 121232.184
512 6.20 90.97% 3.06% 5.97% 120608.348
1024 12.40 91.05% 2.66% 6.29% 121023.523

Enter array size (q to quit) [200]:







--- 700MHz ---

take@raspi2% ./linpackc_sp
Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.64 90.63% 1.56% 7.81% 148971.734
128 1.29 88.37% 2.33% 9.30% 150245.031
256 2.57 87.94% 2.72% 9.34% 150889.688
512 5.14 88.13% 3.11% 8.75% 149924.641
1024 10.28 88.42% 2.63% 8.95% 150245.156

Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.65 89.23% 4.62% 6.15% 144087.297
128 1.30 89.23% 1.54% 9.23% 148971.484
256 2.59 88.03% 2.70% 9.27% 149605.656
512 5.19 91.71% 2.12% 6.17% 144383.328
1024 10.37 90.26% 2.12% 7.62% 146794.453

Enter array size (q to quit) [200]:



take@raspi2% ./linpackc_dp
Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.86 93.02% 2.33% 4.65% 107186.992
128 1.72 92.44% 2.33% 5.23% 107844.581
256 3.45 91.01% 2.90% 6.09% 108510.288
512 6.87 90.83% 3.20% 5.97% 108846.233
1024 13.75 92.95% 1.38% 5.67% 108426.626

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.86 93.02% 0.00% 6.98% 109866.667
128 1.74 91.38% 1.72% 6.90% 108510.288
256 3.47 89.63% 4.03% 6.34% 108176.410
512 6.95 90.65% 3.02% 6.33% 108010.241
1024 13.90 90.86% 2.66% 6.47% 108176.410

Enter array size (q to quit) [200]:





コア1つで、この性能なら、組込みCPUとしては、まぁ速い。
4コアなので、OpenMP とかで並列に動けば、まぁまぁいいかも知れない。
だが、キャッシュの食い合いとか、内部のバンド幅のせいで、性能が出ないかも知れない。

OpenMP版Linpack も動かしたが、Flops 値が、今は出せていない。



上記で使用したコンパイラ

take@raspi2% gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-14+rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-14+rpi1)






2015/FEB/27 追記

kkojimaさんのコメントにより…
gcc-4.8 に
CFLAGS = -O4 -march=armv7-a -mfpu=vfpv3-d16
で、linpack を makeし計測。

システムクロックは、1000MHzで計測。
単精度はそこはかとなく遅い気がする(700MHzでは、はっきりと遅い)。
が、倍精度は、速いようだ。
これがコンパイラの力か…
でも、単精度が遅くなったら、アカンやん…うーん

--- 1000MHz ---

take@raspi2% ./linpackc_sp
Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.57 87.72% 0.00% 12.28% 175786.672
128 1.15 88.70% 2.61% 8.70% 167415.891
256 2.31 88.31% 4.33% 7.36% 164286.578
512 4.60 88.91% 2.39% 8.70% 167415.844
1024 9.20 88.70% 2.83% 8.48% 167018.266
2048 18.41 88.21% 2.82% 8.96% 167815.422

Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.58 84.48% 6.90% 8.62% 165835.672
128 1.16 87.07% 3.45% 9.48% 167416.609
256 2.32 88.79% 3.45% 7.76% 164287.234
512 4.65 89.25% 2.80% 7.96% 164287.094
1024 9.28 88.04% 3.02% 8.94% 166425.469
2048 18.57 88.21% 3.02% 8.78% 166031.844

Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.58 87.93% 3.45% 8.62% 165839.250
128 1.17 86.33% 2.56% 11.11% 169024.250
256 2.32 87.50% 3.45% 9.05% 166623.000
512 4.64 88.58% 2.80% 8.62% 165836.562
1024 9.29 89.13% 1.94% 8.93% 166228.250
2048 18.57 88.37% 2.85% 8.78% 166032.328

Enter array size (q to quit) [200]: q



take@raspi2% ./linpackc_dp
Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.73 91.78% 1.37% 6.85% 129254.902
128 1.46 90.41% 2.05% 7.53% 130212.346
256 2.92 89.04% 2.40% 8.56% 131675.406
512 5.84 90.07% 2.91% 7.02% 129492.940
1024 11.68 89.81% 2.65% 7.53% 130212.346

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.73 89.04% 4.11% 6.85% 129254.902
128 1.46 90.41% 2.74% 6.85% 129254.902
256 2.92 89.73% 3.42% 6.85% 129254.902
512 5.84 89.90% 2.74% 7.36% 129971.657
1024 11.68 89.64% 3.00% 7.36% 129971.657

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.74 89.19% 4.05% 6.76% 127381.643
128 1.47 91.84% 0.68% 7.48% 129254.902
256 2.94 89.12% 3.40% 7.48% 129254.902
512 5.89 90.15% 2.55% 7.30% 128781.441
1024 11.78 89.81% 2.63% 7.56% 129136.211

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.74 90.54% 1.35% 8.11% 129254.902
128 1.47 88.44% 4.08% 7.48% 129254.902
256 2.94 88.44% 3.74% 7.82% 129731.857
512 5.89 89.64% 2.89% 7.47% 129017.737
1024 11.77 89.97% 2.63% 7.39% 129017.737

Enter array size (q to quit) [200]: q


take@raspi2% gcc-4.8 -v
Using built-in specs.
COLLECT_GCC=gcc-4.8
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.8/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Raspbian 4.8.2-21~rpi3rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.8.2 (Raspbian 4.8.2-21~rpi3rpi1)







OpenEL というものがあり…
OpenELの概要
OpenELの概要 2

OpenELというのは、 JASA((社)組込みシステム技術協会) などが絶賛 推進中の規格で、
ロボット用ハードウェアの下まわりを抽象化するレイヤ。
ROSやRTミドルウェアの下位の層を抽象化して、ミドルウェアやアプリケーションの移植性を高める。

あたくしは、JASAの役員などを拝命しており、OpenELのユーザとしてぼちぼちと遊んでいる。


あたくしは、かねてより、 Multi ThreadなBASICインタープリタを作っている。
これは、裸のマイコンに入れて、対話的にI/Oを叩いたり、
マルチ・スレッドで、多数のI/Oを制御するプログラムを簡単に書けるようにするプログラミング言語である。

この MultiThread BASICに、DCモータ制御のプリミティブを追加した。
そのプリミティブは、OpenEL の DCモータ・コンポーネントを介し、DCモータの制御を行う。
OpenELのDCモータの初期化などは、暗黙のうちにBASIC処理系がやってしまう。
よって、追加したのは、

oeltrq ポート,トルク値

だけである。
内部では、OpenELの
elMotorSetTorque_I32(ポート, トルク値 );
を呼び出している。
トルク値が 0~33で逆転、34~66で停止、67~100で正転。
模型用のDCモータは単純な制御しかできませんから。(電圧を変えるとか、パルスで制御とかもできるでしょうが)
BASICインタープリタはC言語で書いてあり、移植性は高い。
DCモータ制御もOpenELを通している。
よって、OpenELをサポートしたプラットフォームならば、
すぐにMultiThread BASICを移植し、BASICからDCモータを制御することが可能である。


せっかくなので、応用例として、
フォトダイオードで、黒い線を読み取って、走る
ライントレーサを作った。
ライントレーサwith BASIC+OpenEL


土台は、タミヤの、壁づたいに走るネズミ。
オリジナルは、メカのタッチセンサで、右に走るか、左に走るかを決める。
タミヤのネズミ

上記を、光センサとマイコン(BASIC+OpenEL)で作り直して、
黒い線を中心に左右に振りながら、進むようにする。簡単。


あたくしは、1970年代前半の小学校の時に、NHK教育TVの「みんなの科学」でライントレーサをみて、
「マイキット150」の CDS とリレーで、作った。
まだ、マイクロ・プロセッサもなければ、デジタルIC TTL 74シリーズも、アマチュアにはほとんど知られていない頃の話だ。
「マイキット150」は、部品取りになった側面もあるが、楽しいオモチャだった。
あたくしは、「電子ブロック」よりも、圧倒的に「マイキット」派である。
「マイキット150」の太陽電池は、今でも大切に取ってある。


ライントレーサは、極めて簡易な装置なので、BASICのプログラムも簡単である。

-- ライントレーサのBASICソース
5 'PIC32 OpenEL Motor ADC
6 'oeltrq 0,50:oeltrq 1,50
10 do
20 if &@<40 oeltrq 0,1:oeltrq 1,50:goto 50
30 oeltrq 0,50:oeltrq 1,1:goto 50
50 while 1
-- EOF

上記中の "&@"は、フォト・ダイオードを接続したADコンバータからの入力を読み込む引数なし関数である。


MultiThreadBASIC+OpenELが動いているチップは、
PIC32MX250 (MIPSコア@50MHz、ROM128KB, RAM32KB)
秋月で360円

である。

PIC32MX220 (MIPSコア@40MHz、ROM32KB, RAM8KB)
秋月で250円

は、残念ながらROMが足りないので、
マルチ・スレッドではない普通のTiny BASICにOpenELをつないで動かしている。
ライントレーサは、このPIC32MX220のシングル・スレッドBASICでも動く。





回路図
回路図(2014/OCT/11追記)



映画「舞妓はレディ」が、まわりの人に評判がいい。
なので、京都で「舞妓はレディ」を観てきた。

オードリーヘプバーンの「マイフェアレディ」のパクリ。
(あたしが割と好きな映画だ。オードリーヘプバーンが、歌が下手で口パクとかも楽しい)
日本でミュージカルとか、ようやるわ。
悪くはなかったが… 歌わなくても、ストーリー持つやろ。
とはいえ、私には、真ん中あたりが、もたつき感があり、寝るかと思たわ。

「京都で、雨は、だいたい盆地に降る?」というのが、「スペインでは、雨は主に平地に降る」のオマージュでよろしかったなぁ。



言語の映画ということで、ちゃんと京都弁をしゃべってるかチェックや。
(あたくしは、大阪生まれの尼崎育ちやっ。京都では呑んでるだけ)

岸辺一徳は、京都の旦那とかやらせても、いつも似合ってるなぁ。そもそも京都人らしいしな。
(沢田研二も京都人やで。と書いても、そのつながりである「ザ・ タイガース」が若い人には分からんやろwww)

29歳まで舞妓(本当は舞妓は18歳まで)をやってるという役の田畑智子は、祇園の料亭の娘らしい。ドラマ「ファーストクラス」でも、怖くて上手い関西弁喋ってたし。

竹中直人は、芝居は上手いが、京都弁は残念。なんでもかんでも竹中直人を使うのは、いかがなものだろう。

言語学の先生で、どの地方の言葉でも操るという長谷川博己だが、全然、喋れてなかったで。
そこの学生で、京都のお茶屋の息子という濱田岳は、酷かった。京都弁をしゃべれる役者を使うべきやろ。

その他の脇を固めてる人は、ちゃんとした花街らしい言葉をしゃべってた。なかなかやるなー

ヒロインは、最後はちゃんと京都花街弁を喋ってた。
本物の舞妓ちゃんも、ほぼ地方出身者なので、練習すれば、普通、喋れるようになるのだろう。



「下八軒」という「上七軒」をもじった場所が舞台だが、
街のイメージは、祇園東。
ちなみに、上七軒の方が格は高いそうだが、西陣が不景気なので…
あたくしは、とても若いときに、上七軒のビアガーデンの只券を西陣の旦那からもらって、行ったきり。


舞台の街は、セットだが、「祇園東」のこのあたり をイメージして作ったと思われ。

祇園東の白川の橋のあたり。
東側に橋。西側に、小さいお堂がある。東から橋を渡ってきたら、よろしいよ。
南側の橋の辺りが、風情がある。



節分の祇園は、「おばけの日」で、コスプレするのは本当。
祇園のクラブのホステスも多少コスプレする。
(紋付で正装してはる芸子はんも居はる)

だいぶ前の節分の日に、錦の超絶に安い立ち飲み(ただし客筋はとても良い)で有名な「松川酒店」に、
友人の社長と呑みに行ったら…
芸子はんを ぎょうさん連れた旦那が呑みに来てはった。旦那は、「裸の大将」のカッコしてた。よう似合てはった(2月やのに)。

ちなみに、江戸の芸者さんと、銀座のホステスは、節分は、紋付で正装するのみらしい。