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
めでたし、めでたし。
え、どんくらい速くなったかって?
そんなの気にするな。コードは短くなったろ?
ん、コードの見通しが悪くなった?
ごめん。