アレな状況に陥ったので報告。本家forumで議論してきたほうがいいかもシレン。
CUDA:
- __global__ void
- test(int *value)
- {
- int id;
- id = blockIdx.x;
- if(id==0){
- value[0] = 1;
- }else if(id==1){
- value[1] = 2;
- }
- }
grid(2,1,1)な実行後のvalueは何になるか。
答えは
value[0] = 0
value[1] = 0
……いや、それはおかしいだろう。
実は、例えば以下のように書くと想定どおりの答えが得られる。
CUDA:
- __global__ void
- test(int *value)
- {
- int id;
- id = blockIdx.x;
- if(id==0){
- value[0] = 1;
- }else if(id==1){
- value[id] = 2;
- }
- }
これで答えは
value[0] = 1
value[1] = 2
となる。
CUDA:
- __global__ void
- test(int *value)
- {
- int id;
- id = blockIdx.x;
- if(id==0){
- value[id] = 1;
- }else if(id==1){
- value[1] = 2;
- }
- }
でもいいや。
CUDA:
- __global__ void
- test(int *value)
- {
- int id;
- id = blockIdx.x;
- if(id==0){
- value[0] = id;
- }else if(id==1){
- value[1] = 2;
- }
- }
なんてのもありらしい。
あくまで予想なんだけど、ifブロックの中で変数idが使われていないという理由で、コンパイラがid変数を最適化の課程で殺しているんじゃないだろうか。だとしたらコンパイラのバグだよなぁ……。
やっぱ本家にゴルァかな?勘違いかもしれないので一日熟成させよう。