J

2004 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 12 |
2008 | 01 | 02 | 04 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
2014 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 02 | 03 | 04 | 05 | 06 | 07 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 06 | 07 | 09 | 11 | 12 |
2017 | 01 |

ホーム

日記内の"morihyphen.hp.infoseek.co.jp"へのリンクは切れてます。必要な場合はお手数ですが int.main.jp へ書き換えをお願いします。

TODO: ファイル名確認を忘れないこと > 自分

twitter

 

2017-01-06

一般市民が突然謎の世界に連れさられてバトルさせられるもの 00:35

最近読んでる漫画に、一般市民が突然謎の世界に連れさられてバトルさせられるものがそれなりの頻度で含まれていることに気付いた。

私漫画買うときあらすじとか一切見ないで買うので、別に狙って読んでるわけではないんですよ。

なんだろう、テンプレ化されているのだろうか。

大体以下のような特徴がある

  1. いきなり主人公が殺されるとか招待状が届いたりとか
  2. 目が覚めると謎の空間
  3. 勝利者はなんかメリットがあると言われる
  4. 生き残れるのはxx人だ、これはゲームだ殺し合えみたいに言われる


まあ、別にテンプレ化はいいんだ。内容がテンプレかどうかは、実際のところあんまり面白さとは関係ない。むしろテンプレに沿った内容にすることで、その作品の特徴がより目立つようになるというメリットも忘れてはいけないと思う。

そして、人間、どんなにひねくれた内容を楽しんだとしても最後には決めゼリフを叫んで必殺技が大ゴマで出てフィニッシュからの爆発みたいなのを期待しているもんだ。トラックにひかれて異世界転生してチートしたっていいじゃないか。


まあそれはそれとして、気付いたついでに、突然謎の世界に連れされて殺しあう系作品の感想でも書いておこうと思う。ネタバレは気にしたりしなかったりするので、ネタバレ嫌いな人は読まないでね。(好きな順に書いてます)


出会って5秒でバトル http://www.urasunday.com/fiveseconds/index.html

いきなり能力が与えられて、それの説明が出て、それで戦うという、能力バトルをするために設定をつくったみたいな設定のソリッドさがよい。まあでも3巻の新しい話はなんかチーム戦のかけひきみたいなのが出てきて、ソリッドさが失なわれてるという感じがある。

http://deago.web.fc2.com/01/index.html もとはweb漫画なのね。(今知った)


煉獄デッドロール http://comic-walker.com/contents/detail/KDCW_FS01000026010000_68/

みんな大好き賭ケグルイ河本ほむら先生原作のアレだよ。賭ケグルイみたいな感じで、人が集って一定のルールのもとでゲームをしていくみたいな感じ。

賭ケグルイみたいなインパクトの強いキャラが出てこないので、なんか少し寂しい感じがある。



天空侵犯

主人公の女の子が強いので見ていて良さがある。

なんか設定がゆるゆる増えていくので、なんか緊張感無くてふわふわした感じがある。


たとえ灰になっても

おっさんでも謎の世界に連れさられたら女の子になるという設定が必要無いのに付いてるのが良いと思った(こなみ)

1巻時点だとまだPart1が終わっていなくて主人公が特に活動しないのでよくわからない。


プラチナエンド

ちょっとテンプレからは外れるけど…

なんか相手がラスボスしかいないから、延々引き伸ばされてるみたいな手応えが…

確認してないけど小畑健絵で乳首が出てくるシーンがあったので良かったと思った記憶がある。


監獄実験

直接対戦するわけではないので少しテンプレからは外れている

なんか暗い内容だったからあんまり好きではなくて覚えてない。


トモダチゲーム

あんまり好きじゃなかったので特に書くことない



総括

なんかあんまり好きで読んでる感じのしない感想だな…それなりに好きなんだけど…

まあこういうのって、パート1,2 あたりは設定をフルに生かした感じがあって最初は面白いけど、だんだん設定が開示されていくにつれて普通の内容に収束していくから、読むほど印象が薄くなっていくみたいなのはかなりある。

トラックバック - http://d.hatena.ne.jp/w_o/20170106

2016-12-24

ApolloLake の gen9 09:05

そういやApolloLakeのやつGPU計測してなかった。

https://github.com/tanakamura/clminibench/tree/master/jni/linux

この CMakeLists.txt 使えば Linux でも動くようにしたから、まあなんかアレしといて。

dev = Intel(R) HD Graphics Broxton 1
enqueue kernel latency:135.280000 usec
enqueue kernel latency x16:70.048750 usec
enqueue memread latency:1.280000 usec
enqueue memwrite latency:4.830000 usec
memread bandwidth:3834.200666 MB/s
memwrite bandwidth:2063.307312 MB/s
global float1 read bandwidth:8.654418 GB/s
global float4 read bandwidth:9.002470 GB/s
float1 add latency:14.162898 clk
float2 add latency:14.445782 clk
float4 add latency:14.759183 clk
int1 add latency:0.061631 clk
int4 add latency:14.666319 clk
gmem load latency:170.041203 clk
constant load latency:169.978857 clk
gmem load latency uc:169.545412 clk
lmem load latency:135.856748 clk
mad1 throughput:117.800274 GFLOPS
mad1dep throughput:106.900008 GFLOPS
mad4 throughput:120.364875 GFLOPS

値あってるかどうかは全然検証してない。(いつもなんか値おかしいので真面目に見てはいけない)

(beignet だと名前が Broxton のままなのが唯一のみどころか)

トラックバック - http://d.hatena.ne.jp/w_o/20161224

2016-12-10

Knigts Landing とクロックダウンする石 part 2 (車 10) 01:24

昨日のまとめ

  • KNL はサイクル当たり2個の命令を実行できると資料にはある
  • 実際には1.69しか出ない

KNLのproduct briefによると、

http://www.intel.com/content/www/us/en/processors/xeon/xeon-phi-processor-product-brief.html

Frequency listed is nominal (non-AVX) TDP frequency. (略) For high-AVX instruction frequency, subtract 200 MHz

とあって、AVX負荷が高いと、1.3GHz から 200MHz 下がると書いてある。

今は、IPC=1.69 で、 1.69/2.0 = 0.845 ,クロックは 1.1/1.3 = 8.46 なので、200MHz 下がってるとすると計算は合う気がする。

が、これはおそらく現象を正しく表現していないように感じる。と、いうのは、今のLinuxでは、perf stat すると、実際に稼動したクロック数と、実時間から、プログラムが実際に動いたクロック数が取れるようになっているが、これで見てもクロックが下がっているようには見えない。

例えば、

#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

#define INSN()								\
    __asm__ __volatile__("vfmadd231ps %zmm0, %zmm0, %zmm0\n\t"		\
			 "vfmadd231ps %zmm1, %zmm1, %zmm1\n\t"		\
			 "vfmadd231ps %zmm2, %zmm2, %zmm2\n\t"		\
			 "vfmadd231ps %zmm3, %zmm3, %zmm3\n\t"		\
			 "vfmadd231ps %zmm4, %zmm4, %zmm4\n\t"		\
			 "vfmadd231ps %zmm5, %zmm5, %zmm5\n\t"		\
			 "vfmadd231ps %zmm6, %zmm6, %zmm6\n\t"		\
			 "vfmadd231ps %zmm7, %zmm7, %zmm7\n\t"		\
			 "vfmadd231ps %zmm8, %zmm8, %zmm8\n\t"		\
			 "vfmadd231ps %zmm9, %zmm9, %zmm9\n\t"		\
			 "vfmadd231ps %zmm10, %zmm10, %zmm10\n\t"	\
			 "vfmadd231ps %zmm11, %zmm11, %zmm11\n\t");


int main()
{
  signal(SIGALRM, exit);
  alarm(1);

  while(1) {
    INSN();
    INSN();
    INSN();
    INSN();
    INSN();
    INSN();
    INSN();
  }
}

こういうコードで perf stat とると、

$ perf stat ./a.out 

 Performance counter stats for './a.out':

       1001.998233      task-clock (msec)         #    0.999 CPUs utilized          
                 2      context-switches          #    0.002 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               117      page-faults               #    0.117 K/sec                  
     1,288,186,518      cycles                    #    1.286 GHz                      (50.06%)
   <not supported>      stalled-cycles-frontend  
   <not supported>      stalled-cycles-backend   
     2,200,109,120      instructions              #    1.71  insns per cycle          (75.06%)
        26,858,635      branches                  #   26.805 M/sec                    (75.02%)
            51,857      branch-misses             #    0.19% of all branches          (74.96%)

       1.002828425 seconds time elapsed

1.286 GHz とか出ている。

これは、CPU_CLK_UNHALTED の値から計算して出しているはず。CPU_CLK_UNHALTEDは、省電力機能によるクロック変動にあわせて変動するので、もしAVX-512に負荷をかけてクロックが下がるならば、これも下がって欲しいところだ。CPU_CLK_UNHALTEDが固定値だとしたら、rdtscとほぼ変わらないので、存在意義があやしくなる。


また、前世代のKNCでは、コア当たり最低2スレッド立てないとフル性能出ないという問題があったので、それと似た問題があるかもと思って試すものの、

#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <omp.h>

#define INSN()								\
    __asm__ __volatile__("vfmadd231ps %zmm0, %zmm0, %zmm0\n\t"		\
			 "vfmadd231ps %zmm1, %zmm1, %zmm1\n\t"		\
			 "vfmadd231ps %zmm2, %zmm2, %zmm2\n\t"		\
			 "vfmadd231ps %zmm3, %zmm3, %zmm3\n\t"		\
			 "vfmadd231ps %zmm4, %zmm4, %zmm4\n\t"		\
			 "vfmadd231ps %zmm5, %zmm5, %zmm5\n\t"		\
			 "vfmadd231ps %zmm6, %zmm6, %zmm6\n\t"		\
			 "vfmadd231ps %zmm7, %zmm7, %zmm7\n\t"		\
			 "vfmadd231ps %zmm8, %zmm8, %zmm8\n\t"		\
			 "vfmadd231ps %zmm9, %zmm9, %zmm9\n\t"		\
			 "vfmadd231ps %zmm10, %zmm10, %zmm10\n\t"	\
			 "vfmadd231ps %zmm11, %zmm11, %zmm11\n\t");


int main()
{
  signal(SIGALRM, exit);
  alarm(1);

  omp_set_num_threads(2);

#pragma omp parallel for
  for (int i=0; i<2; i++) {
    while(1) {
      INSN();
      INSN();
      INSN();
      INSN();
      INSN();
      INSN();
      INSN();
    }
  }
}
$ numactl -C 0,64  perf stat  ./a.out  # 手元だと0と64が同じコアなので。

 Performance counter stats for './a.out':

       2003.569207      task-clock (msec)         #    1.996 CPUs utilized          
                 2      context-switches          #    0.001 K/sec                  
                 1      cpu-migrations            #    0.000 K/sec                  
               190      page-faults               #    0.095 K/sec                  
     2,561,111,631      cycles                    #    1.278 GHz                      (50.04%)
   <not supported>      stalled-cycles-frontend  
   <not supported>      stalled-cycles-backend   
     2,201,434,021      instructions              #    0.86  insns per cycle          (75.01%)
        27,798,335      branches                  #   13.874 M/sec                    (75.02%)
           171,238      branch-misses             #    0.62% of all branches          (74.99%)

       1.003819386 seconds time elapsed

2スレッドで、IPC=0.86、 コア当たりは、1.72 しか出ていない。


なんかめんどくなってきたので結論を書くと、二個目のFPUだけクロックが落ちて動いているように見える。

Agner先生が Knights Landing のレイテンシ/スループット出してるけど、

http://agner.org/optimize/instruction_tables.pdf


FP0 でしか実行できないvplzcntd とかは、

#define INSN()								\
    __asm__ __volatile__("punpcklbw %xmm0, %xmm0\n\t"		\
			 "punpcklbw %xmm1, %xmm1\n\t"		\
			 "punpcklbw %xmm2, %xmm2\n\t"		\
			 "punpcklbw %xmm3, %xmm3\n\t");		\

IPC 1.0 出る。


FP1 でしか実行できないkortestw … あれkortestw は asm で実行したらIPC 1.0 出るんだが…よくわからん…もういいや…(完)

トラックバック - http://d.hatena.ne.jp/w_o/20161210

2016-12-09

Knigts Landing とクロックダウンする石 part 1 (cdr 9) 23:54

そもそもinstruction-bench まともにしたのは、KNLで計測したかったからなのだけど、KNL はマニュアルどおりの性能が出ていないという現象が観測できる。


https://github.com/tanakamura/instruction-bench/blob/master/knl.log#L120

KNL は VPU を2個持っていて、サイクル当たり2個のFMAを実行できるということになっているが、 vfmaps のIPCは、1.67-1.68程度しか出ていない。

最初は分岐とかがデコーダを圧迫してるのかと思ったのだけど、add とかのスカラはIPC 2.0近くいってるんだよね。これの問題は、デコーダではなくて、FPUのほうに問題あることがわかる

(もう今日が終わりそうなので明日に続く)

トラックバック - http://d.hatena.ne.jp/w_o/20161209

2016-12-06

instruction-bench (car 6) 23:48

あれ解説書いてなかったっけ…昔書いた気がするんだけど。

https://github.com/tanakamura/instruction-bench

命令毎のスループット、レイテンシを計測する。

AVX512f まで対応してます。

まあ他にもツールはあるのだけど、exe一個になってると楽かなと思って作った(という文章を昔に書いたはずだ)。

Linux なら make するだけでよい。Windows はもう長いこと試していないのでわからない。

Linux なら、rdtsc ではなく、perf_event インターフェースを使ってCPU_CLK_UNHALTED を取ってるので、省電力機能の影響受けないで計測できる。(ので、VMではないLinuxで計測するのをお勧めする)

その他、過去のバージョンで気になってた箇所 (例えば http://d.hatena.ne.jp/w_o/20130602#1370161374 で書いてるmulx2のレイテンシを埋められないとか) はほぼ解消してて、今はbench.cppに入っている命令で残課題は無いはず。

命令を追加したいときは、

https://github.com/tanakamura/instruction-bench/blob/9d5b21ac4f3062fdd736eea0f3ebaab1cfc02ddb/bench.cpp#L727

GEN(Xmm, "xorps", (g->xorps(dst, src)), false, OT_FP32);

のように、GEN マクロに入れたい命令をつっこむとよい。

最初のXmmは使うレジスタの種類。pmovmskb のように、複数種類を取る命令は…どうしよう…特に考えてない。

次の文字列は結果表示用なのでなんでもいい。

次に命令を書く。これは中身はXbyakなので、Xbyakの書式にあわせて書く。


dst, src レジスタは、スループット計測する時は、別のレジスタが割り当てられる。レイテンシ計測する時は同じレジスタが割り当てられる。

次のfalseはアレなのでfalseで良いです。そのうち消します。(昔はxorpsで依存を切る場合はtrueにしてたけど、KNLでxorpsが重いので使わないようにした)

OT_FP32 はレジスタ消去時にxorps,xorpd,pxorを使うとかの変化がある。あんまり影響ないので気にしなくていいです。


メモリアクセスのように、レイテンシ計測用に依存を作るコードを入れたい場合は、GEN_latency を使う。

https://github.com/tanakamura/instruction-bench/blob/9d5b21ac4f3062fdd736eea0f3ebaab1cfc02ddb/bench.cpp#L735

GEN_latency(Xmm, "loadps",
            (g->movaps(dst, g->ptr[g->rdx])), // スループット
            (g->movaps(dst, g->ptr[g->rdx + g->rdi])); (g->movq(g->rdi, dst)); , // レイテンシ
            false, OT_INT);

rdxレジスタは、2MBアラインされてるゼロ初期化されたメモリを指すので、メモリを使いたい場合はこれを使う。

rdiレジスタは一時レジスタとして空いてるので好きなように使っていい。上のだと、依存を作るのに使っている。(rdx の指すメモリはゼロ初期化されているので、rdi は必ずゼロになる。ポインタを変えないで、ロード命令の間に依存を作っている)



いくつか結果を取ってるので観賞用に

https://github.com/tanakamura/instruction-bench/blob/master/hsw.log Haswell

https://github.com/tanakamura/instruction-bench/blob/master/bdw.log Broadwell

https://github.com/tanakamura/instruction-bench/blob/master/skl.log Skylake

https://github.com/tanakamura/instruction-bench/blob/master/knl.log Knights Landing

https://github.com/tanakamura/instruction-bench/blob/master/glm.log Goldmont

トラックバック - http://d.hatena.ne.jp/w_o/20161206