ひびろぐ ver.2

Google検索したときの見た目を考慮してブログ名を変更してみた。馬鹿かと阿呆かと。

Archive for 10月 11th, 2007


[weblog]痛いニュース(ノ∀`):アニメ「ヤッターマン」が30年ぶりに復活…来年1月より月曜夜7時枠で放送

[weblog]次期Java 6、Direct3Dの概要が明らかに - WindowsでのSwing 2D描画を高速化 | エンタープライズ | マイコミジャーナル

次期Java 6、Direct3Dの概要が明らかに - WindowsでのSwing 2D描画を高速化 | エンタープライズ | マイコミジャーナル


まぁ当然やるよなぁ.FLASHでも似たようなもの出るんじゃね?もうあるかもしれんが.

[weblog]地デジ録画の新ルール名を「ダビング10」に統一

地デジ録画の新ルール名を「ダビング10」に統一


ダビングテンきたー。

これは期待。10回ってのもまぁ期待なんだけど、むしろ

なお、新運用ルールでは、アナログ接続経由のコピーも見直される予定。従来は録画済みの番組をアナログ出力する際には「録画不可」となっていたが、ダビング10以降は回数制限なしのコピーが許可される。

とか書いてあるのが期待。

正直、画質はちょっと落ちてもいいから、扱いやすくなって欲しい私。

ニコニコでエコノミーな動画に慣れると、少しくらいの画質劣化は気にならなくなるよね!

[weblog]セブン-イレブン:弁当の包装簡易化…プラスチック削減 - 毎日jp(毎日新聞)

セブン-イレブン:弁当の包装簡易化…プラスチック削減 - 毎日jp(毎日新聞)


すげえ気になる。

何が気になるって、容易にクラッシュしそうなんだけど大丈夫なんだろうか?というのが気になる。

いやマジで大丈夫なのかしら?

昨夜と今夜の深夜アニメ

・昨夜

カイジ#2:

なにこのいきなり死亡フラグ。

珍しく先の展開が気になるアニメ。

あと番組終わりのほうの実写の水着のおねーちゃんが出てくるコーナーは全力で要らない。アカギのときといい、ホント日テレは空気読んでないなぁ。

ネウロ#2:

つまんね。コレはダメだ。原作ってもっとクレイジーじゃなかったっけ?

ラビリンス#2:

かわいい男の子アニメってことでいいんですかこれは。

全くもって面白くない。駄目な魔探偵ロキ。ちなみに魔探偵ロキはダメ漫画、アニメ版は知らない。

どうでもいいけど、粉塵爆破を知らない警官(下っ端じゃないよなこの服装、刑事だったか?)とか意味が。


・今夜

レンタルマギガ#1:

惜しい。

なんかCMでバトルアニメ感を匂わせていたしアニメ冒頭もそんな感じだったんだけど、後半gdgdに。周辺人物のアクションが格好いいのに、特殊能力を開放した?主人公がいまひとつ格好良くないとかしょんぼり。

まぁ気にはなったので次回も見ておく予定。

ネギま実写版#2:

1回目を見てネギ先生だけそれっぽいなぁ、っつーか男の子が一番かわいいとか(ry、って思ったんだけど、調べたら女の子だった件。まぁそうじゃないと不味いシーンがいくつかあったので納得。

2回めは全力でgdgdでダメダメ。コレは酷い。ただ、胡散臭い特殊映像はちょっと面白かった。

あと、キャラクターの記号化が甘くて全然キャラがわからない件。原作ほとんど読んでないけどアニメ1期はある程度?みてある私。そのうち中途半端に見てある2期をどうにかして補完するか。


ゼミ資料書いて論文書きながら寝るよ!

CUDAでの__device__なclassについて

__device__なclassを作るとどうなるかというお話。

普通に使えたらかなり便利じゃね?

とりあえず、

CUDA:

  1. __global__ void
  2. test(int *value)
  3. {
  4.   value[0] = hoge.func() - hoge.func2();
  5. }


なんてのを用意しておいてみる。

CUDA:

  1. class CHoge
  2. {
  3. public:
  4.   int value;
  5.   CHoge(){
  6.     value = 99;
  7.   }
  8.   ~CHoge(){
  9.   }
  10.   int func()
  11.   {
  12.     return 98;
  13.   }
  14.   int func2()
  15.   {
  16.     return value;
  17.   }
  18. }hoge;


でどうか。

結果は、hoge.func()とhoge.func2()の両方で

"cuda.cu", line 78: error: calling a host function from a

__device__/__global__ function is only allowed in device emulation

mode

value[0] = hoge.func() - hoge.func2();//value;

^

"cuda.cu", line 78: error: calling a host function from a

__device__/__global__ function is only allowed in device emulation

mode

value[0] = hoge.func() - hoge.func2();//value;

^

2 errors detected in the compilation of "/tmp/tmpxft_00007432_00000000-3.ii".

となり、関数が呼べない。まぁそりゃそうだろう。

ちょっと問題を縮小し、最低限の記述に落としてみる。

CUDA:

  1. class CHoge
  2. {
  3. public:
  4.   int func()
  5.   {
  6.     return 98;
  7.   }
  8.   int func2()
  9.   {
  10.     return 99;
  11.   }
  12. }hoge;


これでも同じエラー。

CUDA:

  1. class CHoge
  2. {
  3. public:
  4.   __device__ int func()
  5.   {
  6.     return 98;
  7.   }
  8.   __device__ int func2()
  9.   {
  10.     return 99;
  11.   }
  12. }hoge;


これだとうまく動いて-1が得られる。なるほど。

ちょっと趣向を変えて。

CUDA:

  1. class CHoge
  2. {
  3. public:
  4.   __device__ int func()
  5.   {
  6.     return 98;
  7.   }
  8.   __device__ int func2()
  9.   {
  10.     return 99;
  11.   }
  12. };
  13. class CHoge hoge1;
  14. class CHoge hoge2;
  15.  
  16. __global__ void
  17. test(int *value)
  18. {
  19.   value[0] = hoge1.func() - hoge2.func2();
  20. }


  • 1。ふむ。

……あれ?classの実体宣言には__device__つけていないんだけど、いいのかなぁ?


classに変数を持たせてみる。

CUDA:

  1. class CHoge
  2. {
  3. public:
  4.   int value;
  5.   __device__ int set(int n)
  6.   {
  7.     value = n;
  8.     return value;
  9.   }
  10.   __device__ int func()
  11.   {
  12.     return 1;
  13.   }
  14.   __device__ int func2()
  15.   {
  16.     return value;
  17.   }
  18. };
  19. class CHoge hoge1;
  20. class CHoge hoge2;
  21.  
  22. __global__ void
  23. test(int *value)
  24. {
  25.   hoge1.set(10);
  26.   hoge2.set(20);
  27.   value[0] = hoge1.func2() + hoge2.func2();
  28. }


すると、

"cuda.cu", line 62: error: identifier "hoge1" is undefined

(hoge1.value) = 10;

^

"cuda.cu", line 63: error: identifier "hoge2" is undefined

(hoge2.value) = 20;

^

"cuda.cu", line 64: error: identifier "hoge1" is undefined

(value[0]) = (((hoge1.value)) + ((hoge2.value)));

^

"cuda.cu", line 64: error: identifier "hoge2" is undefined

(value[0]) = (((hoge1.value)) + ((hoge2.value)));

^

4 errors detected in the compilation of "/tmp/tmpxft_000074c1_00000000-4.i".

……あれ?

CUDA:

  1. __device__ class CHoge hoge1;
  2. __device__ class CHoge hoge2;


に変更したら、今度は

"cuda.cu", line 62: warning: expression has no effect

(hoge1.value; }

^

"cuda.cu", line 63: warning: expression has no effect

(hoge2.value; }

^

というwarnigのみになり、実行結果も30と正しそうな感じに。

まぁなんだ、要するにインライン展開されまくりなんだろうな、きっと。

とりあえず関数も持てる構造体、程度には使えると。

(ええと、C++の場合は構造体に関数持たせられるんだっけ?そういえば。)

次。

class CHoge

にコンストラクタやらデストラクタやらを追加してみる。

CUDA:

  1. CHoge()
  2.   {
  3.     value = 1;
  4.   }


これで

"/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/cstdlib", line 178: internal error:

can't generate code for non empty constructors or destructors on

device

div(long long __n, long long __d)

^

1 catastrophic error detected in the compilation of "/tmp/tmpxft_00007555_00000000-3.ii".

Compilation aborted.

意味がわからんエラーが出る。まぁコンストラクタやデストラクタはダメだよって言われてるわけだな。

残念ながらコンストラクタを__device__にしても状況は変わらないし、int value;を__device__にしても

"cuda.cu", line 45: error: memory qualifier on data member is not allowed

__attribute__((__device__)) int value;

^

とかエラーが変わるのみ。


うーん。

流石にまともにclassらしくclassを活用することはできなさそうだ。ちょっと残念。

それにコンストラクタとかが使えないのは微妙に不便だ。

コンストラクタっぽいことをする妥当なアイディアとしては、classを__device__に持っていることが前提だけど、初期化用の__device__関数を利用するのがいいのかな。

CUDA:

  1. class CHoge
  2. {
  3. public:
  4.   int value;
  5.   __device__ int set(int n)
  6.   {
  7.     value = n;
  8.     return value;
  9.   }
  10.   __device__ int func()
  11.   {
  12.     return 1;
  13.   }
  14.   __device__ int func2()
  15.   {
  16.     return value;
  17.   }
  18. };
  19. __device__ class CHoge hoge1;
  20. __device__ class CHoge hoge2;
  21.  
  22. __global__ void init()
  23. {
  24.   hoge1.set(10);
  25.   hoge2.set(20);
  26. }
  27.  
  28. __global__ void test(int *value)
  29. {
  30.   value[0] = hoge1.func2() + hoge2.func2();
  31. }
  32.  
  33.  
  34. 以下、ホスト側
  35.  
  36.   // 変数の初期化のために一度GPUを動かしてみる
  37.   dim3 threads0(1, 1, 1);
  38.   dim3 grid0(1, 1, 1);
  39.   init<<<grid0, threads0>>>();
  40.  
  41.   // 本番?の実行
  42.   dim3 threads(THREAD_X, 1, 1);
  43.   dim3 grid(BLOCK_X, 1, 1);
  44.   test<<<grid, threads>>>(d_sd1);



それにしてもなんだこのグダグダのエントリ。まとまりわりい。