タグ「scheme run-scheme xemacs」が付けられているもの

xemacs で run-scheme

  • 投稿日:
  • カテゴリ:

ubuntu 8.10 で emacs が動きません。ので、xemacs を使っています。xemacs の scheme モードのキーが、emacs と違っているのでメモ。 (xemacs 21.4)

(1) run-scheme で gosh の起動

C-u M-x run-scheme
とすると、コマンド名を聞かれるので

Run Scheme: gosh -i
とします。goshの引数 -i は必要。

(2)schemeモードへ移行

拡張子 .scm のファイルを開くと、勝手に scheme モードになりました。(なにも設定していなくても)

(3) scheme モードのキーバインディング。

オリジナルの解説はここです↓
日本語
http://www.ueda.info.waseda.ac.jp/~ichibe/pub/members.tripod.co.jp/zzyyb/mit/doc-ja/user_7.html
英語
http://www.ps.uni-sb.de/courses/info-i/scheme/doc/user/user_10.html

C-x C-e	← カーソルの前のS式評価
M-o	← 現在のバッファ(全部)の評価

この2つで充分ですが、ついでに上のリンクから他のキーも再掲すると

M-o	← 現バッファの評価(xscheme-send-buffer)
M-z	← 現定義を評価(xscheme-send-definition) 
	   C-M-x も同じ。
C-M-z	← 現リージョンの評価(xscheme-send-region)
C-x C-e	← カーソルの前の式を評価 (xscheme-send-previous-expression)
	   M-RET も同じ。
C-c C-s	← `*scheme*' バッファに移動(xscheme-select-process-buffer)
C-c C-y	← 最後の評価式を、現ポイントにヤンク(xscheme-yank-previous-send)
	   `*scheme*' バッファでのみ動作。

なかなか便利です。

割り込みコマンド

C-c C-c ← 中止。Scheme で C-g 入力と同じ(xscheme-send-control-g-interrupt) 
C-c C-x ← 中止。Scheme でC-c C-x 入力と同じ(xscheme-send-control-x-interrupt)
C-c C-u ← 中止。Scheme で C-c C-u 入力と同じ(xscheme-send-control-u-interrupt)
C-c C-b ← 中止。Scheme で C-c C-b 入力と同じ(xscheme-send-breakpoint-interrupt)
C-c C-p ← 再開。Scheme で (continue) を評価するのと同じ(xscheme-send-proceed)

C-c C-c 以外は、意図不明。MIT-Schemeだと意味があるのかも?

for(int i=0; i<200; i++)
  a[i] = b[i] * c[i]

ループアンロールは

for(int i=0; i<200; i+=4) {
  a[i  ] = b[i  ] * c[i  ]
  a[i+1] = b[i+1] * c[i+1]
  a[i+2] = b[i+2] * c[i+2]
  a[i+3] = b[i+3] * c[i+3]
}

で、ストリップマイニングは

for(int i=0; i<200; i+=4)
  for(int j=0; j<4; j++)
    a[i+j] = b[i+j] * c[i+j]

ループアンロールは、ループ回数を減らすのが目的。ループのオーバヘッドが減る。

ストリップマイニングは、大きいループを小さいループに分けるのが目的。キャッシュのヒット率が上がる。(この例だとヒット率は全然変わらないけれど 、、、→ 大きい2次元配列でストリップマイニングでヒット率上がる例がある)

(もちろん、どっちもループの結果は同じ。式の実行順も同じ。しかし、プログラムの表現はかなり違う。何かを変化させているのだが、なんだろう?概念が固まらない。名前はついているか?)

ストリップマイニングとブロック化は同義語。

ベクトル化について。

1.ループアンロール → ベクトル化。

2.ストリップマイニング → ベクトル化。

この例ではどっちにしても結果は同じ。

for(int i=0; i<200; i+=4)
  *(__m128 *)&a[i] = _mm_mul_ps( *(__m128*)&b[i], *(__m128*)&c[i] );

1. と 2. で結果が違う例?2次元配列の2重ループとか?