link もっと前
   2020年 7月 18日 -
      2020年 7月 9日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

link permalink

link 編集する

北極送り

GitHub が北極にコードを保存する取り組み(私のソースコードが北極送りに? "GitHub" アカウントに謎のラベルが付与されたとの報告が多数 - やじうまの杜 - 窓の杜)をしているそうです。面白いこと考えますよね。


GitHub Arctic Code Vault Contributor

気づいたら自分の GitHub アカウントにも Arctic Code Vault Contributor と出ていました。有名な OSS には関わってないし縁がないと思っていましたが、どうやら Linux にコントリビュートしていたので出てきたっぽいです。いわれてみると Linux も GitHub にミラーされてました。

未来人は現代人を理解できるだろうか?

現代人をもってしても 1000年前の文字の解読(例: ヒエログリフ、前 3200年〜4世紀、19世紀頃に解読された)はとても苦労したこと、解読されていない古代文字がまだまだあることを考えれば、現代文字や文明を遺しても未来人が理解不能で終わってしまう可能性もあるわけです。

少なくとも未来文明は現代文明より遥か上の水準に発展していないと、仮に現代文字や文明を発見できても、真に理解するのは難しいでしょう。

こんなことを考えると、実は Code Vault の取り組みは「地球の未来は今より進んでいるはず」という信頼や願望が前提になっていることが見て取れます。人類か、それ以外の生命体か、誰の手に渡るかわかりませんが、SF 的なロマンがありますよね。

[編集者: すずき]
[更新: 2020年 7月 23日 12:53]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

link 編集する

GCC を調べる - その 16 - 自動ベクトル化を有効にする

目次: GCC を調べる - まとめリンク

GCC には自動ベクトル化(tree-vectorize)機能があります。ループ処理を自動的に SIMD 命令に置き換えるために使われているようです。現状の GCC が可変長のベクトル長に対応しているかどうかはわかりません。未対応ならば可変長のベクトル長に対応する実装が必要になりますが、非常に難しそうです。

可変長のベクトルの扱いはひとまず横に置くとして、RISC-V のベクトルを「とても長い固定長の SIMD」とみなして自動ベクトル化を動かします。

自動ベクトル化を有効にするコード

// gcc/config/riscv/riscv.c

/* Implement TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_MODES.  */

static unsigned int
riscv_autovectorize_vector_modes (vector_modes *modes, bool)
{
  if (TARGET_VECTOR)
    {
      modes->safe_push (V64SImode);
      modes->safe_push (V32SImode);
    }

  return 0;
}

...

#undef TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_MODES
#define TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_MODES riscv_autovectorize_vector_modes

自動ベクトル化を有効にする方法は簡単で、これだけです。

テスト用の int 配列をコピーする関数

void *cpy(void *dst, const void *src, int n)
{
	int *d = dst;
	const int *s = src;
	int i;

	for (i = 0; i < n / sizeof(*d); i++) {
		d[i] = s[i];
	}

	return dst;
}

この関数がベクトル化あり、なしでどのように変わるか見ます。

自動ベクトル化の結果

//★★自動ベクトル化、あり

                d[i] = s[i];
   100b8:       1202e007                vlw.v   v0,(t0)
   100bc:       10038393                addi    t2,t2,256
   100c0:       f0038793                addi    a5,t2,-256
   100c4:       10028293                addi    t0,t0,256
   100c8:       0207e027                vsw.v   v0,(a5)
        for (i = 0; i < n / sizeof(*d); i++) {
   100cc:       fee296e3                bne     t0,a4,100b8 <cpy+0x44>
   100d0:       00661293                slli    t0,a2,0x6
   100d4:       02568963                beq     a3,t0,10106 <cpy+0x92>
   100d8:       959a                    add     a1,a1,t1
   100da:       932a                    add     t1,t1,a0
                d[i] = s[i];
   100dc:       0005a383                lw      t2,0(a1)


//★★自動ベクトル化、なし

                d[i] = s[i];
   10080:       0005a303                lw      t1,0(a1)
        for (i = 0; i < n / sizeof(*d); i++) {
   10084:       0591                    addi    a1,a1,4
   10086:       0291                    addi    t0,t0,4
                d[i] = s[i];
   10088:       fe62ae23                sw      t1,-4(t0)
        for (i = 0; i < n / sizeof(*d); i++) {
   1008c:       fe759ae3                bne     a1,t2,10080 <cpy+0xc>
        }

        return dst;
}
   10090:       8082                    ret

ソースコードではベクトル型を使っていませんが、自動ベクトル化により 256バイト(= 64要素)ずつ処理され、vlw.v, vsw.v 命令が使われるようになったことがわかります。

[編集者: すずき]
[更新: 2020年 7月 16日 10:17]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

link 編集する

OpenCL と ICD

OpenCL は複数のベンダーのデバイスを同時に扱うことができます。ICD(Installable Client Driver)というそうです。ICD は GPU などのデバイスを制御し、アプリケーションと ICD の間に ICD ローダーが存在します。


アプリケーション、ICD ローダー、ICD の関係


Debian でのライブラリ名

Debian Testing では ICD ローダーとして ocl-icd-2.2.12 が使われています。

Debian Testing の ICD loader
$ apt-cache search ocl-icd-libopencl1

ocl-icd-libopencl1 - Generic OpenCL ICD Loader

ローダーのソースコードは GitHub(リンク)にあります。

先程、図示したもの以外にも ICD はいくつか実装があります。現時点の Debian Testing では下記が提供されていました。

  • pocl-opencl-icd: 主に CPU 向け
  • beignet-opencl-icd: 比較的古い Intel GPU 向け
  • intel-opencl-icd: 比較的新しい Intel GPU 向け、Testing にしか存在しない
  • mesa-opencl-icd: AMD GPU 向け
  • nvidia-opencl-icd: nVidia GPU 向け、ソースコードは公開されていない

Intel は ICD のソースコードを完全にオープンにしています。NVIDIA は公開していません。AMD もないのかな?

ICD のロード手順

動作を追ってみたいと思います。アプリケーションには clinfo を使います。ocl-icd は環境変数 OCL_ICD_DEBUG=15 に設定すると、動作時に詳細なログを出力します。デバッガで追うのと併用するとわかりやすいです。

  • clinfo: clGetPlatformIDs() を呼ぶ
  • ocl-icd: _initClIcd() -> _initClIcd_real() -> __initClIcd()
  • ocl-icd: _find_num_icds(): /etc/OpenCL/vendors の *.icd ファイルを見る(*.so へのパスが書いてある)
  • ocl-icd: _load_icd(): *.so を dlopen()
  • ocl-icd: _find_and_check_platforms(): 後述

ローダーが走査するディレクトリは /etc/OpenCL/vendors がハードコードされていますが、環境変数 OPENCL_VENDOR_PATH で変更できます。

ICD のロードの中心となる処理は _find_and_check_platforms() です。

  • dlsym() で clGetExtensionFunctionAddress() のアドレスを得る
  • clGetExtensionFunctionAddress() で clIcdGetPlatformIDsKHR() のアドレスを得る
  • clGetExtensionFunctionAddress() で clGetPlatformInfo() のアドレスを得る
  • clIcdGetPlatformIDsKHR() でプラットフォーム数とプラットフォームの情報を得る

プラットフォームは説明が難しいですが、OpenCL API の実体+任意のドライバ固有のデータとでも言いましょうか。変数の型は cl_platform_id * 型です。cl_platform_id は少なくとも先頭のメンバは struct _cl_icd_dispatch *dispatch でなければなりません。dispatch の後ろには他の情報が入っていても問題ないようです。

cl_platform_id と dispatch

// ocl-icd/ocl_icd_loader.c

static inline void _find_and_check_platforms(cl_uint num_icds) {
  cl_uint i;

...

    cl_platform_id *platforms = (cl_platform_id *) malloc( sizeof(cl_platform_id) * num_platforms);
    error = (*plt_fn_ptr)(num_platforms, platforms, NULL);

...

    for(j=0; j<num_platforms; j++) {
      debug(D_LOG, "Checking platform %i", j);
      struct platform_icd *p=&_picds[_num_picds];
      char *param_value=NULL;
      p->extension_suffix=NULL;
      p->vicd=&_icds[i];
      p->pid=platforms[j];    //★★pid = platform ID のことらしい

      /* If clGetPlatformInfo is not exported and we are here, it
       * means that OCL_ICD_ASSUME_ICD_EXTENSION. Si we try to take it
       * from the dispatch * table. If that fails too, we have to
       * bail.
       */
      if (plt_info_ptr == NULL) {
        plt_info_ptr = p->pid->dispatch->clGetPlatformInfo;    //★★dispatch メンバが存在することを前提としている

      
// ocl-icd/khronos-headers/CL/cl.h

typedef struct _cl_platform_id *    cl_platform_id;


// ocl-icd/(build-dir)/ocl_icd_loader_gen.h

struct _cl_platform_id { struct _cl_icd_dispatch *dispatch; };    //★★dispatch 以外は特に規定がなさそう


// ocl-icd/(build-dir)/ocl_icd.h

struct _cl_icd_dispatch {
#ifdef CL_VERSION_1_0
  CL_API_ENTRY cl_int (CL_API_CALL*clGetPlatformIDs)(
    cl_uint          /* num_entries */,
    cl_platform_id * /* platforms */,
    cl_uint *        /* num_platforms */
  ) CL_API_SUFFIX__VERSION_1_0;
#else
  CL_API_ENTRY cl_int (CL_API_CALL* clUnknown0)(void);
#endif

#ifdef CL_VERSION_1_0
  CL_API_ENTRY cl_int (CL_API_CALL*
  clGetPlatformInfo)(
    cl_platform_id   /* platform */,
    cl_platform_info /* param_name */,
    size_t           /* param_value_size */,
    void *           /* param_value */,
    size_t *         /* param_value_size_ret */
  ) CL_API_SUFFIX__VERSION_1_0;
#else
  CL_API_ENTRY cl_int (CL_API_CALL* clUnknown1)(void);
#endif

...

//★★こんな調子で関数ポインタの定義が延々と続く

先頭の dispatch はたくさんの関数ポインタが並んだ巨大な構造体です。アプリケーションから見ると OpenCL の API は ocl-icd が提供しているように見えますが、ocl-icd の API 実装は dispatch の関数ポインタを呼ぶラッパー関数であり、関数ポインタと、OpenCL API 実装の本体を提供するのは各 ICD の役割です。

[編集者: すずき]
[更新: 2020年 7月 15日 20:37]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

link 編集する

MAD Tower Tycoon コンプリート

MAD Tower Tycoon でゾーン方式のエレベータの作り方を悩んで色々やっていたら、いつのまにかレベル 100、実績コンプリートしていました。ゲーム内時間は表示されないので詳しくはわかりませんが、おそらく 700日くらい?


MAD Tower Tycoon 実績コンプリート

The Tower と比べて色々思うところはありますが、総合的にみれば面白いと思います。

序盤だけ金欠になりやすいですが、難易度はかなり低めですし、ビル建築シミュレーション初めての方にオススメしたいゲームです。

高層ビルを作りたい

MAD Tower Tycoon は住人を追尾する機能があり、ビルの住人が困っていないか把握するのに便利です。基本的には目的地に行って、家に帰る(住人の場合)、もしくはビルから出る(ゲストの場合)だけですけど、大きなビルを作ると変な行動が目立ちます。

  • ビルの端から端まで歩いて、わざわざ遠いエレベーターで乗り換え
  • 近所のレストランを無視して、わざわざ遠いレストランに行く

前回(2020年 7月 10日の日記参照)も書きましたが、MAD Tower Tycoon はゾーン方式のエレベーターを作る方法がわかりません。今はメンテナンス施設の射程(上下 6F に効果がある)の関係で、7階+ 8階(※)おきに乗り換え階を作っています。

どうもこの方式だと 40階くらいで限界っぽいです。乗り換えに時間が掛かりすぎて、目的地に行くだけで半日費やしている気の毒な住民がいます。彼らはなぜか不満は言いませんが、見ていると不憫です……。

救いとしては MAD Tower Tycoon はビルの横幅がめちゃくちゃ広く取れるので、45階もあれば、レベル100、五つ星ビルが余裕で作れることです。だけど、やっぱり The Tower にあやかるなら、100階建て目指したいですよね?

(※)効率重視ならば 7F, 14F 乗り換えが最適ですが、スカイロビーを作成できるのは 15F からなので、あえて 14F を空きフロアにして、15F 乗り換えにしています。

どうしても The Tower と比較してしまう

MAD Tower Tycoon は、The Tower とかなり似ているがゆえに、つい比較してしまいます。

良いところ

  • エレベータ乗り換えがロビー階以外でも可能
  • 何度でも乗り継げる(1F → 7F → 15F → 23F のような乗り継ぎが可能)
  • かなり上の階でも階段で行ける(The Tower は確か 4F くらいしか上らない)

悪いところ

  • エレベータの通過階設定ができない(今、一番困っている制限)
  • 一度上に行ってから、下に行く乗り換えが不可能(1F → 15F → 7F みたいな乗り換えはしないようだ)

ゾーン方式のエレベーターが作れたら、高層ビルに効率的に人を運べるようになって、もっと面白くなるはずなのに。もったいないよ〜。

[編集者: すずき]
[更新: 2020年 7月 12日 19:53]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

link 編集する

STATIONflow コンプリート

STATIONflow の実績をコンプリートしました。「ラッキーセブン」と「東京」は自動化マクロを組まないと取れませんでした。


STATIONflow 実績コンプリート

本来、このゲームにハマって色々なマップをずっと遊んでいたらいつのまにか取れていた、というタイプの実績ですが、申し訳ないことに、私はそこまでの情熱がなかったです。

ゲームやったらわかりますけど、この 2つの実績だけ条件設定が異常すぎます。

  • 1日の利用者数は最大 17,000人程度(全出入口&乗り場が最大レベルの駅)
  • 1390万人達成には単純計算でゲーム内時間 800日程度
  • STATIONflow の 1日は最速でも 15分、普通に遊ぶと 30分〜1時間くらい
  • 最速でも 200時間は必要

実績の条件(総利用者数 700万人、1,390万人)がいかに異常かがわかると思います。

自動化

自動化の方法は簡単で、PowerShell で Enter キーを 3秒に 1回送るマクロを組んで、会社行っている間や夜間に放置するだけです。2週間くらいで取れました。

STATIONflow は放置しても悪いイベントが起きない(=駅が壊れない)優しい仕様になっているため、自動化+放置が可能でしたが、他のシミュレーションゲームだと偶発的に悪いイベントが起きるため、この方法は使えません。

まあ、明らかに製作者の想定した取り方ではないし、こんな方法で実績取っても嬉しくないし、無理に実績取るのは今後はやめておきます。

[編集者: すずき]
[更新: 2020年 7月 12日 01:01]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

link 編集する

MAD Tower Tycoon 楽しい

最近 Steam で買った、MAD Tower Tycoon(開発: Eggcode)で遊んでいます。


MAD Tower Tycoon

ビル建築&経営シミュレーションゲームです。プレイヤーはビルを拡張していって、テナントや住居を作ります。テナントには住人やゲストが押し寄せてきますので、住人のストレスを溜めないように、メンテナンス施設を足したり、階段、エスカレーター、エレベーターでうまく捌き、儲けを出して、ビルをさらに拡張させるというゲームです。

The Tower の後継者?

ビル建築&経営シミュレーションの名作は The Tower(開発: OPeNBooK)だと思います。The Tower は続編が出なくなって久しく寂しかったですが、MAD Tower Tycoon はかなり The Tower に近い作りです。

後追いだけあって基本的に The Tower より良くなっていますが、残念な部分もあって、

  • 上階に伸ばすときの建設が面倒くさい
  • 中盤から金が余りまくる
  • オフィス、住宅からの変な苦情(人通りが多い)
  • 横移動のストレスがない、もしくは非常に低い
  • エレベーターは速いが、自由度が低い

難易度は最近の風潮で優しめだとしても、最後のエレベーターの劣化は残念です。

エレベーターの変な仕様

エレベーターは The Tower のキモで、説明書でも詳しく説明していました。MAD Tower Tycoon のエレベーターの場合は、

  • エレベータのカゴ数が最大 3 で少ない
  • 通過階の設定ができない(降車専用ならある)

特に後者の制限が厳しくて、ゾーン方式(※)エレベーターが実質建設不可能で、高層ビルを作るには厳しい仕様となっています。

(※)エレベーターを複数基用意して、1つ目は 1〜5階のみ、2つ目は 5〜10階のみなど、一部の階しか止まらないエレベーターを作る方式のことです。現実でも高層ビルでよく見かけます。

むりやりゾーン方式エレベーターを作るとどうなる?

バグなのか仕様なのかわからないですが、MAD Tower Tycoon ではバルコニーでフロアをぶち抜いて、スカイブリッジを作ると、どことも繋がらない孤立したフロアを作れます。


普通の四角いビルを作成


バルコニーを作成


バルコニーを破壊すると、スカイブリッジが完成

孤立したフロアにエレベーターだけを設置することで、実質的に乗車降車禁止階にできます。


スカイブリッジ経由で利用してくれない

ところがこの乗車降車禁止エレベータを作っても、なぜか住人は一切利用してくれません。訳が分かりません。どうしたら良いんでしょうか??

オープンブックの紆余曲折

The Tower 開発元の OPeNBooK は合併と名前変更を繰り返しています。合併相手は 9003, inc で、AQUAZONE という熱帯魚育成&水槽シミュレーションで名を馳せたベンダーです。

1993                                          2000
OPeNBooK  ---,    1996                   ,--> オープンブック(The Tower の版権を持つ)
             +--> オープンブック 9003 ---+--> シノミクス
9003, inc ---'
1990

Wikipedia を見るとこんな経歴でした。お互い、元の鞘に収まったという感じがします。合併したけどやることがなかったんですかね?

[編集者: すずき]
[更新: 2020年 7月 12日 00:56]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

link 編集する

ノート PC の発熱を抑える方法 - その 2

前回(2020年 6月 29日の日記参照)、ノート PC の発熱を抑えるために CPU のクロック上限を抑える設定をしました。

前回は TurboBoost だけ無効化する方法がわかりませんでしたが、ググっていたら割と簡単に TurboBoost を無効化できることがわかりました。

レジストリエディタで、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00\be337238-0d82-4146-a960-4f3749d470c7
の Attributes という DWORD 値を 1 から 0 or 2 に変更します(※)。

すると下記の「プロセッサ パフォーマンスの向上モード」オプションが出現しますので、無効を選択します。


TurboBoost を無効化すると、最大のプロセッサの状態を 100% にしても、ベース周波数の 1.6GHz までしか周波数が上がらなくなります。これは良い感じだ。

  • 〜60%: 0.99GHz
  • 〜65%: 1.10GHz
  • 〜71%: 1.19GHz
  • 〜76%: 1.30GHz
  • 〜82%: 1.39GHz
  • 〜87%: 1.49GHz
  • 〜100%: 3.36GHz → 1.59GHz

(※)私は Surface Pro で CPU クロックが最大に張り付くという問題(フォーラムへのリンク)の解決策に載っていたものを見つけたのですが、どうも昔の Windows 8 で消えた設定らしい(ASCII.jp : Windows 8.1で消えた詳細な電源管理項目を表示する!より)です。

[編集者: すずき]
[更新: 2020年 7月 9日 23:48]

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2020年 7月 18日 -
      2020年 7月 9日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 8/8 14:57

カレンダー

<2020>
<<<07>>>
---1234
567891011
12131415161718
19202122232425
262728293031-

最近のコメント 5件

  • link 20年08月06日
    hdk 「言い訳がいいですね。実際にもし石膏ボード...」
    (更新:08/08 14:57)
  • link 20年07月28日
    すずき 「乗る用事はないし、乗ろうと思って、いつも...」
    (更新:07/30 22:19)
  • link 20年07月28日
    hdk 「さすがに月イチくらいは動かしてあげてくだ...」
    (更新:07/30 21:40)
  • link 20年06月28日
    すずき 「コメントありがとうございます。私もやって...」
    (更新:07/12 00:53)
  • link 20年06月28日
    匿名 「「階段抜き」「ノンエスカレーター」「効率...」
    (更新:07/11 18:26)

最近の記事 3件

link もっとみる
  • link 20年08月08日
    すずき 「[車検] 車検証と検査証票(フロントガラスに貼るステッカー)が届き...」
    (更新:08/08 14:35)
  • link 20年08月07日
    すずき 「[Wikipedia] Wikipedia に寄付しました。といっ...」
    (更新:08/08 14:24)
  • link 20年08月06日
    すずき 「[エアコンが落ちそうで怖い] Twitter で「これ便利」と紹介...」
    (更新:08/08 14:24)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報