2008年10月
GCCのOpenMPでboolの和をとると…
C++のOpenMPでは最大値が取れないと言ったら,「boolなら+で最大値取れるじゃん,嘘言うな.」と返ってきた.意味があるかどうかはさておき,確かに出来ることなので実際にやってみた.
ソースは次のとおり.bsにbool値を適当に入れて,それの和をbool変数rに得る計算をreduction(+:r)で並列化する.最後に結果の出力として r を吐き出す.コンパイルはg++に-fopenmpo付けてやった.
#include<iostream> #include<vector> int k = 2; int main(int argc, char *argv[]) { int n = 10000000; std::vector<bool> bs(n); for(int i = 0; i < n; i++) { bs[i] = i % k; } bool r = false; #pragma omp parallel for reduction(+:r) for(int i = 0; i < n; i++) { r += bs[i]; } int res = r; std::cout << res << std::endl; }
結果:逐次で動かすと1が返ってくるが,OpenMPで並列化したら8コア(スレッド)で8が返ってきた.
普通に考えればrはboolなのでintへの変換時に0か1にしかならないと思うのだけど…,なぜに8? そもそも逐次と結果違うってのもどうかと.なんとなくreductionの結果をとるときにrの型がboolでなくintとかにされている気がする.ま,詳しくはまた今度調べよう.
- Comments: 0
- TrackBack (Close): -