Pythonならとりあえずリストみたいのがあって
a = [1, 2, 3]
みたいになるんだけど、C++だと
どこに置かれる?
何バイト使う?
いつ確保する?
いつ破棄する?
コピーする?参照する?
連続している?
キャッシュに乗る?
という話になってくる。
コードの向こう側にCPUとメモリが見えてくるんだよ。
「メモリ=構造」になるところでいえば
単なる最適化じゃないんだよね。データ構造を変えたら、プログラムが持っている「世界」の意味まで変わる。
AtraのLoihi的処理なんか、まさにC++と相性がいい
x は値。
&x はxが存在している場所。
p はその場所を持つ。
*p で、その場所にあるものへ接触する。
なので
「コピーされた20」じゃない。
同じ場所へ触ったからxが変わった。
この感覚は高級言語だけ触っているとなかなか表へ出てこないよね。
{ Sensor sensor; sensor.start(); }
んで上はRAII
生成 → 存在 → 接触 → 消滅
がスコープそのものに埋め込まれている。メモリ、ファイル、通信、ロックなどを「後で忘れずに解放しましょう」ではなく、オブジェクトの寿命そのものとして扱える。
だから、
物理的なメモリ
↑
データ構造
↑
オブジェクト
↑
概念
まで一本で繋がる。
論理空間:6400 × 6400 = 40,960,000座標があったとしても、
struct Trace { uint32_t pos; float strength; uint8_t sensor; };
みたいにして、「1痕跡を何バイトにする?」まで設計できる。こういうところが面白いんでだよね。そしてLoihi的なイベント駆動との相性もいい。
----------デモ------------
Atra_Loihi_Demo フォルダを開く → build_run_windows.bat をダブルクリックという 36セル があって、それぞれのセルの中に、
local x = 0~9 local y = 0~9
の座標を作っている。
だから全体としては、
6 × 10 = 60
なので、論理的には 60×60の座標空間なんだよね。ただし、今のコードでは 60×60=3600点を配列として持っているわけではないということ。
持っているのは基本的に、
std::array<Cell, 36>
という 36個のセル状態だけ。
各セルが持つのは今のところ、
spike trace active
くらい。
10×10の内部座標は、毎回全部保存しているのではなく、接触が起きたときに、
global位置 ↓ どのcellか ↓ そのcell内のlocal位置
へ変換している。
たとえば上の画面右に出ている、
cell[1,1] local(2,2) overlap=8x8 spike=0.64
これはかなり具体的に言うと、
「6×6=36セルからなる60×60の論理空間がある。その1つである cell[1,1] は10×10を担当している。そこへ30×30の青い画像が入り、cell[1,1] の local(2,2) から8×8だけ重なった。」
これが今、画面で起きていることね。
cell[1,1] = 10×10
0 1 2 3 4 5 6 7 8 9
0 □ □ □ □ □ □ □ □ □ □
1 □ □ □ □ □ □ □ □ □ □
2 □ □ ■ ■ ■ ■ ■ ■ ■ ■
3 □ □ ■ ■ ■ ■ ■ ■ ■ ■
4 □ □ ■ ■ ■ ■ ■ ■ ■ ■
5 □ □ ■ ■ ■ ■ ■ ■ ■ ■
6 □ □ ■ ■ ■ ■ ■ ■ ■ ■
7 □ □ ■ ■ ■ ■ ■ ■ ■ ■
8 □ □ ■ ■ ■ ■ ■ ■ ■ ■
9 □ □ ■ ■ ■ ■ ■ ■ ■ ■
(この黒い■が8×8)
全体
│
├─ 6 × 6 = 36個の cell
│
│ ├─ cell[0,0] → 10 × 10
│ ├─ cell[1,0] → 10 × 10
│ ├─ cell[2,0] → 10 × 10
│ │ …
│ └─ cell[5,5] → 10 × 10
│
└─ 全体の論理座標 = 60 × 60
6×6 = セルの個数(36セル)
10×10 = 1セルが担当する論理領域
60×60 = 6×10なので世界全体
30×30 = そこへ入れた青い画像
8×8 = 青が特定の10×10セルと重なった部分
オレンジ色は、青い画像が触れているセルを示している
(events this tick: 16)
「1セルが10×10を持つ」ように見せているけど、コード上で各セルに100個の点を配列として確保しているわけではなくて、 local(2,2) や 8×8 は接触したときに計算しているということ。
以前話していたAtraの、「4096万点を持つのではなく、4096万点が存在し得る空間を持つ」というのは、今回の小さいデモなら、「60×60=3600点を全部持つのではなく、3600点が存在し得る座標系を持っている」ということなんですよ。
発火したとこだけ記憶する。
「60×60の画像を記憶する」のとは発想が違うって事。
なんか、軽くなった感じするでしょ?
あちゃーーー!出来て失敗したと思ったのは
青を置きっぱなしにすると trace がどんどん上がる。
これは「接触が継続している間は連続入力される」モデルになっちゃったね。
もしAtraのように「発火したところだけ記憶する」の意味をもっと純粋に見せるなら、
青が移動した ↓ 新しく接触した場所だけ発火 ↓ 記憶 ↓ 静止 ↓ 新規発火なし
Cueでいえば、「青いところそのものがCue」というより、青い入力が動いて、過去の痕跡に触れることがCueになる
みたいな感じね。ま、でもなんとなく理屈はご理解いただけたでしょうか。
---------------------Research Note and Attribution Notice-----------------------
0 件のコメント:
コメントを投稿