cudaで bool を int にする

CUDA でプログラミングをしているとき、条件によってアクセスする配列を
変えたいときがある。

if(条件){
  result[1][threadID] = 値;
}  
else{
  result[0][threadID] = 値;
}

で、ご存知のように CUDA では if による分岐は悪である。
できるだけ、if 分岐しない方が速くてよい。

ここで、「条件」の bool 値を配列の添字にしたくなる。

true → 1
false → 0

としたい。

そうすると、先のコードは以下のようになり、
if文がなくなって、幸せになれる。

int index = 条件;
result[index][threadID] = 値;

が、C言語では、false は 0、true は 0 以外とされているので、
なんか良くない予感がする。

が、時代はC++である。
C++では、bool の結果を int 型にすると
false は 0, true は 1 になるよう言語仕様にあるので、イケてそうだ。

でも CUDAで本当にそうなっているか、信用ならんので確かめてみた。

結果から言うと、なっていた。大丈夫である。
以下、検証コード

#include <iostream>

__global__ void boolToInt(int * result){

  result[0] = (20>10);
  result[1] = (10>20);

}


using namespace std;
int main(){
 int result_cpu[2];


 int* result_gpu;
 cudaMalloc((void**) &result_gpu, sizeof(int) * 2);

 dim3 grid, threads;

 boolToInt<<<grid, threads>>>(result_gpu);

 cudaMemcpy(result_cpu, result_gpu, sizeof(int)*2, cudaMemcpyDefault);

 std::cout <<"true =" << result_cpu[0] << std::endl;
 std::cout <<"false=" << result_cpu[1] << std::endl;


 cudaFree(result_gpu);

 return 0;
}

んで実行結果、

true =1
false=0

めでたし、めでたし。

え、どんくらい速くなったかって?
そんなの気にするな。コードは短くなったろ?

ん、コードの見通しが悪くなった?
ごめん。