dispatch してみる
と、思ったんだけど、単にdispatchするだけならあまりに簡単だったので先にdispatchしてみた。
#include <stdio.h> #include <Block.h> #include <dispatch/dispatch.h> int some_func(int a) { int i; for (i = 0; i< 1000000; i++) { a *= a ; a %= 15721; } return a; // 抜けてた。恥ずかしい過ぎる。 } #define N 1024 main() { int i; dispatch_queue_t dq; dq = dispatch_get_global_queue(0, 0); __block int result[N]; dispatch_apply(N, dq, ^(size_t a) { result[a] = some_func(a); }); for (i = 0; i< N; i++) { printf("%d, ", result[i]); } printf("\n"); }
some_funcに特に意味はありません。
em114-51-35-127% time ./dispatch >/dev/null ./dispatch > /dev/null 14.63s user 0.04s system 191% cpu 7.680 total em114-51-35-127% time ./nondispatch >/dev/null ./nondispatch > /dev/null 14.58s user 0.04s system 99% cpu 14.677 total
191% とかすばらしい。将来のマシンではこれが6400 % とか行くんだろうか。見てみたいよ Larabbe。
しかし余談なんだけど gccで -O有効にすると何番でやっても some_func()が木偶にされてしまう。どうしたもんか。
追記:
ああ、本当に馬鹿すぎる。some_func()何も返して無いじゃん。家帰ってから気がついた。そりゃデクにもされるよはずかしい。
というわけで追加。アーんど-O5の結果。
em114-51-35-127% time ./dispatch >/dev/null ./dispatch > /dev/null 8.11s user 0.04s system 188% cpu 4.336 total em114-51-35-127% time ./nondispatch >/dev/null ./nondispatch > /dev/null 8.11s user 0.04s system 97% cpu 8.362 total