ひびろぐ ver.2

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

Archive for 9月 8th, 2007


部屋の掃除の続きをしていて出てきたアーティファクト

 カ セ ッ ト テ ー プ 。

(未使用品も有り。)


既に録音・再生用デバイスを持っていない件。

カセットテープって不燃ゴミかしら?

追記:ゴミカレンダーにちゃんと不燃って書いてあったわ

StarOcean新作情報追加

これとかこれとか。

VIPで叩かれすぎてて笑った。


それにしても、正直リメイク版のグラフィックスはありえないな。原作と雰囲気が違いすぎるおかげで違和感が本気で酷い。

正直、1はSFCのリメイクだからこれはこれでいいのかなぁとか思わないこともない。ちょっと時代が違うので、今風に描き直したらこうなるかもしれない。良い意味で今風。……いや、でもムービーだけじゃなくてイベントフェイスグラフィックスでこの絵を見続けることになるのか……。むしろ、1には2以降で登場していない「奥義」という素敵システムがあるし、戦闘を中心にシステムの粗い部分が多かったので、その辺がどのようにいじられるか(面白いゲームになってくれるか)興味がある。ということにしておく。

2は本気でありえねぇ。クロードもレナも悪い意味で今風になってしまった。見た目が子供過ぎて駄目だ。とりあえず改悪フラグ立ちました。


え?4がPS3のみで提供???はいはいお疲れ様でした。

__device__な変数に初期値を与える方法を確認してみる

CUDA:

  1. __device__ int flags[2]={0,0};


こういう書き方が出来るのはわかっている。

ここで、配列の長さに#defineした値なんかを使っていると困る。具体的には

CODE:

  1. __device__ int buf[N];


なんて場合。


というわけで、とりあえず__device__メモリの確保と初期化について少しコードを書いてみた。

CODE:

  1. // 値の設定方法
  2. // 1:cudaMemcpyを利用する
  3. // 2:cudaMemsetを利用する
  4. #define TESTVERSION 1
  5.  
  6. #define N 128
  7.  
  8. // __device__変数のポインタををextern宣言しておく。
  9. // __global__関数経由で実体(Mallocされたメモリ)と関連付ける。
  10. // この方法で__global__関数以外の関数(__device__関数)からも
  11. // bufを利用することが可能になる。
  12. extern __device__ int* buf;
  13.  
  14. __global__ void gpu
  15. (int *mem0, int *_buf)
  16. {
  17.   int i;
  18.   buf = _buf;
  19.   for(i=0; i<N; i++){
  20.     mem0[i] = buf[i];
  21.   }
  22. }
  23.  
  24. void
  25. runTest(int argc, char** argv)
  26. {
  27.   CUT_DEVICE_INIT();
  28.  
  29.   // メモリ確保
  30.   int* h_mem0;
  31.   int* d_mem0;
  32.   h_mem0 = (int*)malloc(sizeof(int)*N);
  33.   CUDA_SAFE_CALL(cudaMalloc((void**)&d_mem0, sizeof(int)*N));
  34.   // 値を入れる必要性が無いのでコメントアウト
  35.   //CUDA_SAFE_CALL(cudaMemcpy(d_mem0, h_mem0, sizeof(int)*N, cudaMemcpyHostToDevice) );
  36.  
  37.   // __device__メモリ(buf)の確保と初期化
  38.  
  39.   int* h_buf=NULL;
  40.   int* d_buf=NULL;
  41.  
  42.   // その1:cudaMemcpyを利用する
  43. #if TESTVERSION == 1
  44.   CUDA_SAFE_CALL(cudaMallocHost((void**)&h_buf, sizeof(int)*N)); // 普通にmallocしてもOK
  45.   CUDA_SAFE_CALL(cudaMalloc((void**)&d_buf, sizeof(int)*N));
  46.   // 値のセット
  47.   int n;
  48.   for(n=0; n<N; n++){
  49.     h_buf[n] = n;
  50.   }
  51.   // データのセット
  52.   CUDA_SAFE_CALL(cudaMemcpy(d_buf, h_buf, sizeof(int)*N, cudaMemcpyHostToDevice) );
  53. #endif
  54.  
  55.   // その2:cudaMemsetを利用する
  56. #if TESTVERSION == 2
  57.   CUDA_SAFE_CALL(cudaMalloc((void**)&d_buf, sizeof(int)*N));
  58.   CUDA_SAFE_CALL(cudaMemset(d_buf,0,sizeof(int)*N));
  59. #endif
  60.  
  61.   dim3 grid(1,1,1);
  62.   dim3 threads(1,1,1);
  63.  
  64.   gpu<<<grid, threads>>>(d_mem0, d_buf);
  65.   CUDA_SAFE_CALL( cudaThreadSynchronize() );
  66.   CUT_CHECK_ERROR("Kernel execution failed");
  67.   CUDA_SAFE_CALL(cudaMemcpy(h_mem0, d_mem0, sizeof(int)*N, cudaMemcpyDeviceToHost) );
  68.   CUDA_SAFE_CALL(cudaFree(d_mem0));
  69.   CUDA_SAFE_CALL(cudaFree(d_buf));
  70.   if(h_buf){CUDA_SAFE_CALL(cudaFreeHost(h_buf));}
  71.  
  72.   int i;
  73.   printf("mem0:");
  74.   for(i=0; i<N; i++){
  75.     printf(" %d", h_mem0[i]);
  76.   }
  77.   printf("\n");
  78.  
  79.   free(h_mem0);
  80. }


まぁこんな感じ。

といいたいところだが、実は後者(#define TESTVERSION 2 の場合)に、cudaMemsetの第二引数を0じゃなくすると出力結果が無茶苦茶になってしまう。イージーミスか、バグか、仕様か、はてさて……???