Thanksgiving days to hang out(←旧ときどき日記) -2ページ目

Thanksgiving days to hang out(←旧ときどき日記)

日々の出来事や感じた事や思ったことを書いていきます。
できるだけ毎日書くように頑張ります。
気軽にコメントしてください^^

この記事はOpenCL入門―GPU&マルチコアCPU並列プログラミング for MacOS Windows Linuxを参考に書いている。

マンデルブロ集合の計算結果に応じて色分けされた画像を、ビットマップ形式のファイルとして生成するプログラム

マンデルブロ集合とは、複素平面上の集合が作り出すフラクタルである。(Wikipedia参照)

$Thanksgiving days to hang out(←旧ときどき日記)-マンデルブロ
↑マンデルブロ集合をxy平面に表したもの

どのような集合かというと
Thanksgiving days to hang out(←旧ときどき日記)-マンデルブロ平面
で定義される複素数列 {zn}n∈N が n → ∞ の極限で無限大に発散しないという条件を満たす複素数 c 全体が作る集合がマンデルブロ集合である。ただこれではただの数列なので、これを平面に表すために、
zn を点 (xn, yn) に、c を点 (a, b) にそれぞれ置き代えて、
Thanksgiving days to hang out(←旧ときどき日記)-マンデルブロ漸化式
とすればいい。

今回はこのマンデルブロ集合を計算し、その書く要素計算結果ごとに色分けし、最後に集合の画像を出力するというプログラムを作成する。

このプログラムを構成するクラスは
$Thanksgiving days to hang out(←旧ときどき日記)
となっている。

プログラムの流れ
1.Mainが
 -Mandelbrot
-VdcMapper
-ClHelper  を作成
2.VdcMapper, ClHelperによって取得した材料をMandelbrotがセットする
3.メインが計算命令
4.Mandelbrotがカーネル作成、メモリオブジェクト作成、カーネル引数の設定、実行リクエスト
5.Calc.cl発動(計算)
6.メインが計算結果を取ってくる
7.画像出力のためにColortableで色をつける
8.Bitmapに渡して、画像出力

そして今回の並列処理について説明する。マンデルブロ集合を求める計算をOpenCLデバイスにしてもらうことになるが、その際に考えなければいけないことが3点ある。
1.カーネル関数
2.インデックス空間の次元
3.ワークアイテムの数
OpenCLデバイスは.clファイルを処理するが、カーネル関数にどのような処理をさせるか、インデックス空間をどのようにとるか、ワークアイテムをどのようにPEに割り振るかを考えなければいけない。
ここ最近ブログ書いていなかった。
その原因は間違い無くTwitter。

いろいろ考えることはあるけど、なかなかブログに書こうとは思わない。これは良くない。思考ツールとしてはTwitterよりもブログのほうが圧倒的に素晴らしい。しかし利便性が高いがゆえにTwitterを使ってしまっている(´;ω;`)

Twitterの内容もある程度ブログでまとめることにする。驚愕の量だった。その量およそ6000字。駄文散文失礼。数字は日づけ。

4.17 知ってしまった世界
 オナニーした者がもうオナニーを知らないまま生きていくことが出来ないのと同様に、幸せについて考えることを知ってしまった者は、もう知らないには戻れない。悩みながらも考えぬきつつそれが正しいと信じて生きていくしかない。

5.3 自分にとって最高の生き方とは?
 ソクラテスは言った。『善く生きろ』と。自分が正しいと思ったことを貫き通す。それが善く生きることらしい。確かにわからんでもない。どのようにして生きるかなんて誰でも少なからず考える。
 その1つの指標として夢というものをもつ。夢とは、大人になればなるほど現実に押しつぶされて、夢を持たなくなる。多くはサラリーマン。就活なんてその最たる例でみんなサラリーマンになるためにES書いたりして頑張る。就活やる時点で夢なんて持ってるやつなんてほぼゼロに近い。ただ夢を持ってたほうが良いと言うつもりもない。夢なんてなくても良いと思ってる。むしろないほうが良いかもしれない。夢を持つことは、あまりにもリスクが高すぎる場合が多い。それに対し、大学でてリーマンになるのが一番リスクが低い。
 ここで考えなくちゃいけないのは、どちらのほうが幸せかということ。どっちが納得できるか。よく言う、貧乏でも夢を追ったほうが良いのか。それとも、仕事が趣味にならなくてもある程度の収入を得る仕事につく。どっちが幸せか。金と幸せは必ずしも一致しない。ぼくは、きっと一番大切なことは常に自分の夢ややりたいことを探し続けることじゃないかと思っている。もちろん夢が見つかったなら、それを追って見るのも良い。もし、なくても探し続けることが自分の幸せになるんじゃないかと。これは仕事だけではない。
 そしてまたぼくが思うのは、人に流されるんじゃなく、自分の中でありとあらゆる選択の可能性を考えた上で、自分が良いと思える道を選んだほうが良いということ。こーいうことを考えていくと多くの人の答えとして幸せな家庭を築くことって言う人が多いと思う。なんつーかこれは資本主義の弊害というか趣味を仕事にできない人間にはありがちのことじゃないかと。ある意味流されるっていう部分としょうがない部分もあるけど、本当に死ぬほど悩んで考えたんかとか思っちゃう。まぁそれも幸せだろうけど。恋愛は人生を善く生きるための最も効率の良い手段。誰でも手軽にできる。かつかなり面白い。世間からも認められている。この手段を使った方が良いのか。つまりそれは独身のことだけど。やっぱり使ったほうがいいんじゃね?っていう。でもそれをやると恋愛に満足してしまうがゆえに、夢なんてどーでもよくなってしまって適当な『幸せな家庭を築く』になっちゃうよね。それを心の底からそう思えてるのかもしれないが、もっとなんかあるじゃんって思う。お前の小さい頃から夢は幸せな家庭を築くことだったのかと。もっとあるじゃん。それをちゃんと考えようぜっていう話っすよ。
 適当に頑張るじゃやっぱりダメだって。努力することが幸せなんだっていうやつは絶対自分に嘘をついてる。もっと本気で最後まで考えろって思う。夢探しに時間かかってもええねん。いろんな事して分かることも多いかもしれないけど自分の中の根本的な興味はそう変わらんて。それをとにかく頑張るとか言って適当にやるんじゃねーよ。そこが一番大事だろ。全力で探せよ。頑張ってる自分に酔ってんじゃねーよ。人見下してんじゃねーよ。結局何が言いたいかって、お前の幸せは本当にそれか?お前は明日死ぬとしても、本当に後悔のないように生きれてるのか?ってこと。以上。

5.5 Twitterが残した産物
 沈黙は金。言わぬが花。ということわざがあるように、昔から何事も黙って実行することが美徳とされる文化が日本にはある。しかしながらTwitterはまさにその文化を真っ向否定するようなある種の文化を築いている。なぜこんなにも中高生をはじめとする学生または社会人に広まっているのか。Twitterではどんなことが呟かれているのか。
 自分が感じるものでは、おはよう、おやすみ、~なうというものが多い。そしてそれに対するリプライ。会話等々。ここでまた1つ疑問が。なぜメールではなくTwitterなのか。Twitterを始めとするSNSではそのネットのオープンな特性ゆえ出会い系サイトのような使われ方をしていることが問題になっている。男はいいが、女からすれば面倒極まりないとも思うのだがそうでもないということ実際に使ってみて感じる。
 ここで重要なキーワードとなるのが「かまってちゃん」の存在。私は、誰しも少なからずかまってちゃんだという考えだが、Twitterは非同期リアルタイムなゆえにいつでも誰でも人が存在する。自分のツイートをいつ誰が見ていてもおかしくはないということ。それに多くの人がハマっている。いつでも誰かいてかまってもらえる。それは誰だって良い。むしろ日常で接せず、自分のことを知らない人に話を聞いてもらいたいかもしれない。昔のような沈黙は金の時代は終わったのだ。日本人はもっと自分を認めてもらいたいっていう想いに溢れている。
 ただ前にも述べたようにそれが偏ってしまってはいけない。自由に公の場で発言することができる時代になったが、それを自分の快楽のためだけに利用すると泥沼にハマる。そうではなく、セルフマネジメントの力がこれから求められてきているではないか。
 あまりにも、Twitterという媒体が世にでるのは早すぎた。しっかりとなぜ自分はツイートをするのかを考えるべき。それはかまってほしいという理由でも良い。最低でもそれをわかった上で利用するべきだと思った。人間はもしかしたらもう成長しなくても良いのかもしれない。今のままでも充分楽しい。これ以上なにを求める。技術の進歩なんて金がかかるだけじゃないのか。それとも経済的になにか素晴らしい影響があるのか?努力があればもっと好景気で過ごしやすくなる気がする。技術の進歩って一体誰が求めてんだ?

5.7 信じたい世界
 やっぱり悩んで悩んで、何回も結論出して、それでも悩んで悩み抜いたやつが幸せになって欲しいだろ。そんな世界であって欲しいだろ。だからこそ、自分はどんな時も後悔しないように一生懸命考えるし、そのために行動してる。
 ただ多くの人は違うらしい。自分が良ければ良い。今が楽しければ良い。そんなんでいいのか?それともおれが間違ってるのか?どこが間違ってるのか言って欲しいわ。他人に論破されたいわ。本気で悩んだやつが幸せになると信じ続けながらも、自分の中でいろんな結論を出していくしかないだろ。そうじゃないとやってらんねーよ。

5.7 嘆き、叫び
 所詮言葉なんて使い捨てで、誰にも留められず誰の記憶にも残らない。人間の記憶はあまりにも曖昧で、どれが真実なのかなんて分からない。適当言ったもん勝ちっていうのはやっぱり正解で、つぶやきなんてどこまでいってもつぶやきに過ぎない。あまりにも陳腐。それに頼っている人間はもっと陳腐な存在。頭が良いってなんなんだろうな。おれの中で単純に記憶力が良い奴が頭良いと思ってるんだが、世の中には自分で考える力があるやつとか生きていく力がある奴のことを頭良いと言ってたりする。そんなん高学歴の人たちへの嫉妬心以外の何者でもないと思うんだがどうなんだろうか。
 酒と煙草と女で最強だろ。それ以上に望むものなんて本当にないかもしれない。
食欲、睡眠欲、性欲。この3つが満たされれば幸せなのか?金さえあればこの3つなんて簡単に実現出来んだろ。思ったより人生簡単に攻略できそうだ。
 人生に正解はない。あほか、だからって全てが正解ってこともねーんだよ。そんなん人それぞれだろ。あほか、だからお前がどう思ってんのか聞いてんだよ。受け売りの言葉に頼って分かった気でいるんじゃねーよ。自分で考えろ。自分の言葉で語れや。考えれば考えただけ前に進むって。

5.11 欲望に素直に、もっと純粋に
 良い世界だ。可愛いものは可愛いし、好きなことしたいと思えば、好きなことできる。美しいと言えるあなたの心が美しい。だからこそそんな風に世界は動いてる。人生は平等じゃないとかそんなレベルの話じゃない。不平等だから良い。不平等だからこそ、それを補うために努力するし人類は進歩していく。やりたいことをやるんじゃなくて、それは必然だったんだ。そう思ったら、なにしても良いじゃんとか思った。
 やっぱりAVの世界は奥が深いな。人間の欲望を如実に表している。こんな何が真実か分からない嘘だらけの世界で、そこだけは絶対的に疑いようのない真理がある。金と欲望が蠢く世界。その中で創られるべくして創られた世界がAVの世界だわ。あやふやなものに騙されんな。素直に前だけ見ればいいんだ。悩んで悩んで苦しんで、それでも悩み続けたやつが、やっぱり最後には幸せになってほしいじゃんか。てかそんな世界であってほしいじゃんか。だからこそ、悩むなら本気で悩め。それが一生懸命生きるってことだろ。

5.11 ツンデレ
 よくできてんなぁツンデレって。男は女の子にツンツンされるともっとその子のことが知りたくなっちゃう→さらにツンツン→男むかつく→女実は好きだったんだ→コロリ。でもその逆はないな。男より女のほうがサバサバしてるから最初の段階でツンツン男は嫌われる。その点やはりツンデレの女は多くの男から声かけられるぶんだけ強い。あーしかもかつ構ってちゃんだと最強じゃんか。ツンデレ×構ってちゃん=最強だわ。なんだこれ、自分で罠仕掛けて仕留めるなんてハンターじゃんか。ハンターハンターじゃんか。ハンター試験のときのヒソカ並みに最強じゃんか。ぱねーこえー。

5.13 思考せよ
 まじで女が言う「うるさい」ほどうるさいもんはない。年上がいう「また君の歳じゃわかんないだろうな」っていうのと同様に、その発言の時点で論点のすり替えが行われている。つまり思考の放棄。これだから女はバカって言われんねん。だから大人は子供に尊敬されないねん。どんなときも思考を続けろ。

5.14 意識高い学生
 インプットなんて誰でもできる。本好きな奴はいくらでもいる。重要なのは自分で咀嚼し、新しいものをクリエイトする力だ。処理すること自体は問題じゃない。考えるっていうのはそーいう事だ。常に生み出すことを意識しろ。古きを温めて新しきを知るとはまさにこのことだ。

5.15 だがそれが良い
 おれ甘いなぁ~絶対女の子に甘い。女はバカだと思っているがゆえにどーしても甘くなってしまっている気がする。そーいう意味で男のほうが対等にいれる気がする。どうしたもんかな。可愛い子には旅をさせろってやつだな。甘やかすのは優しさでも愛情でもなんでもない、怠惰だ。ただじっと見守るのも楽じゃない。

5.18 要は考えるか考えないか
 他人を批判することに対して、何も感じなくなったら終わりだろ。どこまでいっても相手のことを考えられないやつはやっぱり頭悪いと言わざる終えない。っていう批判。本当に自分のことは棚にあげて、話をするやつが多い。おれのことなんかどーでもいいだろ。自分でなんかしろや。つまらん人間ほど人のことをとやかく言う。胸くそ悪い。

5.27 純粋とは
 やはり童貞、処女=純粋っていうのは違う。貞操観念持ってるやつっていうのはもうその時点で偏見を持っている。純粋っていうのは偏見を持っていないまっさらな状態のこと。おれは純粋な気持ちで女の子とエロいことしたい。つまり、よくツイッターで純粋とかいってる奴がいるが、おれが一番純粋だわ。

5.28 OpenCLのジレンマ
 やっぱりOpenCLは要らないのかもしれない。ヘテロジニアスな環境なんて結局資本主義の産物みたいなもので全部政府がやっていれば問題なかった。それをカバーするためにOpenCLって言語があるだけに過ぎないかもしれない。いやでも企業競争があったからこれだけパソコンおよびHPCっていうものが発展してきたのかもしれない。一概にOpenCLはよくないとも言えない。ただ思ったより普及はしていない。やっぱCUDAかCUDA。

5.30 頭の中のメモ
 ネットの溜まり場。かまってちゃん。伴侶。Skype。line。生放送。アルファ。芸能人。JK。出会い厨。進学校。馴れ合い。暇人。廃人。2ちゃんねる。プログラマ。アプリ開発。爆撃。リア充。OpenCL。GPU。ヘトロジニアス。やりたいこと。ニート。院生。社会人。数学者。タイムライン。読書。意識高い。起業。Campus。美大。将来の夢。花屋。パン屋。可愛い。才能。努力。ゴミちゃん。かまわんよ。ビジネス。本当の価値。ポートフォリオ。投信。もの作り。Twitter。SNS。家族。テレビ離れ。日本。金。環境。教育。自己中。人それぞれ。批判。意見文。

6.14 刑事みたいな
 真実だけ追い求めていればきっといつかは、報われる。些細なことでも少しでも自分の想いがあればまた考えて、その答えを貫くことを明日に繋ぎ続けていけばきっと。

6.16 リーガルハイ感想
 今週のリーガルハイの最後の堺雅人の大演説は何回も聞いてもすごい。半端じゃない。説得っていうのは、論理的で見たくないものまで見なければならないゆえに残酷だ。すべてを求めることは幸せとは限らない。ただ誇りと信念を貫らぬき通したいならば、深い傷を負う覚悟で前に進まなければならない。
 だからこそ考え続けなければならない。馴れ合いで納得していてはダメなんだ。意味のわからない言葉に躍らされ分かった気になってはいけない。答えがないとわかっていても、真実を探し続けなければならない。それが戦うことであり、生きるってことだ。生半可な覚悟じゃたえられんよ。逃げだすな。

6.11 選択の連続、麻雀みたい
 幸せの先にあるのは、死のみ。嫉妬なんて自己中以外の何物でもない。自分以外の存在を支配することなんてできないし、するべきでもない。それは自己破壊だ。自分の幸せは自分しか決められないという当たり前のこと。多くはそれに気付いていない。現実を見ようとしない。決断は自分しかできないんだよ。

6.17 世の中は金が全てだ
 『世の中は金が全てだ』という言葉は「金が全てというのは、金で幸せを買える」って意味ではない。金っていうのは唯一無二の客観的指標。頑張った自分を称えてくれるのが、他人から称賛の証としての『お金』だ。そしてやっと自己満足でなくなる。『世の中(社会)は金が全て(結果)』なんだ。

6.19 金と愛
 金を積めばで慰めはいくらでも買える。ただそれで心が満たされることはない。そして、それが分かっていても人は安物のプレゼントに心動かされる。モノは金ではなく、心がこもったものだと思い込むことが容易いからだ。やはり無償の愛こそ必要なのではないか。本当の愛は金では買えぬ。
 相手の言うことを繰り返すだけで、安心信頼が勝ち取れるなら、そんなんロボットでもさせとけばいいわ。

6.20 人間=関数
 つまるところ人も関数みたいなものだ。人生様々な困難にぶち当たる。その問題に対してなんかしらの回答をだし続ける。正解も解答もない。ただひたすら人生の回答をだし続ける。それ以上でもそれ以下でもない。自分の答えを出せないのなら、楽しくないだろ。自分にとって最高の答えをだし続けるのみだ。そして、その答えあわせをしてくれるのが金だ。

6.20 とっくに絶望してるよ
 考えるのは確かにしんどいよ。辛いし苦しい。絶望的な悲しみが込み上げる。それでも分からんことがあったら悩み続ける。こわいじゃん。疑問を持ちつづけないとアイデンティティが崩壊しそうになるんだよ。自分の意見を持つっていうのはそういうことじゃないか。疑問に対するアンサーの積み重ねが、オリジナルを創る。オリジナルでいたいじゃない。
このコードはOpenCL入門―GPU&マルチコアCPU並列プログラミング for MacOS Windows LinuxのChapter 3を参考に、作成した


{

#include <stdio.h>
#include <time.h>
#include <CL/cl.h>

static void printPlatformInfo(const cl_platform_id platform_id);

/*---------------------------------------------------------------------------
*
*/
int main(int argc, char * const argv[])
{
  //時間計測
  clock_t t1, t2;

  t1= clock();

// プラットフォームIDを取得する
cl_platform_id platforms[10];
cl_uint num_platforms;
cl_int status;

status = clGetPlatformIDs(sizeof(platforms) / sizeof(*platforms),
platforms,
&num_platforms);
if (status != CL_SUCCESS) {
fprintf(stderr, "clGetPlatformIds failed with status %d\n", status);
return 1;
}

printf("Number of platform(s) : %d\n", num_platforms);
for (int i = 0; i < (int)num_platforms; i++) {
// プラットフォームIDについての情報を表示する
printPlatformInfo(platforms[i]);
}

t2 = clock();
printf("time = %f\n", (double)(t2 - t1) / CLOCKS_PER_SEC);

return 0;
}

/*---------------------------------------------------------------------------
* 引数で与えられたプラットフォームの情報を表示する
* platfomrm_id: 情報を表示するプラットフォームのID
*/
static void
printPlatformInfo(const cl_platform_id platform_id)
{
char buffer[1024];
size_t actual_size;
cl_int status;

// プロファイル
status = clGetPlatformInfo(platform_id, CL_PLATFORM_PROFILE,
sizeof(buffer) - 1, buffer, &actual_size);
printf("Platform profile : ");
if (status == CL_SUCCESS) {
buffer[actual_size] = '\0';
printf("%s\n", buffer);
} else {
printf("Error: clGetPlatformInfo failed with status %d\n", status);
}

// バージョン
status = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION,
sizeof(buffer) - 1, buffer, &actual_size);

printf("Platform version : ");

if (status == CL_SUCCESS) {
buffer[actual_size] = '\0';
printf("%s\n", buffer);
} else {
printf("Error: clGetPlatformInfo failed with status %d\n", status);
}

// 名前
status = clGetPlatformInfo(platform_id, CL_PLATFORM_NAME,
sizeof(buffer) - 1, buffer, &actual_size);

printf("Platform name : ");

if (status == CL_SUCCESS) {
buffer[actual_size] = '\0';
printf("%s\n", buffer);
} else {
printf("Error: clGetPlatformInfo failed with status %d\n", status);
}

// ベンダー
status = clGetPlatformInfo(platform_id, CL_PLATFORM_VENDOR,
sizeof(buffer) - 1, buffer, &actual_size);

printf("Platform vendor : ");

if (status == CL_SUCCESS) {
buffer[actual_size] = '\0';
printf("%s\n", buffer);
} else {
printf("Error: clGetPlatformInfo failed with status %d\n", status);
}

// 機能拡張
status = clGetPlatformInfo(platform_id, CL_PLATFORM_EXTENSIONS,
sizeof(buffer) - 1, buffer, &actual_size);

printf("Platform extensions: ");

if (status == CL_SUCCESS) {
buffer[actual_size] = '\0';
printf("%s\n", buffer);
} else {
printf("Error: clGetPlatformInfo failed with status %d\n", status);
}
}


 このプログラム自体はOpenCLデバイスで計算はしていない。OpenCL APIをつかった単なるC++のプログラム。OpenCLデバイスで計算させるためには、OpenCLにデータを飛ばさなければならないため一気に記述する量が多くになる。
 それが以下のような一般的なOpenCLプログラムの流れである。
1.コンテキストの作成(clCreateContext)
2.コンテキストに含まれるデバイス取得(clGetContextInfo)
3.コマンドキューの作成(clCreateCommandQueue)
4.プログラムオブジェクトの作成(clCreateProgramWithSource)
5.カーネルプログラムのビルド(clBuildProgram)
6.カーネルオブジェクトの作成(clCreateKernel)
7.メモリオブジェクトの作成(clCreateBuffer)
8.カーネル引数の設定(clSetKernelArg)、実行(clEnqueueTask)
9.メモリバッファから結果取得(clEnqueueReadBuffer)、表示

後ろに括弧で書いておるのがAPIである。このような様々なAPIを利用し、OpenCLデバイスデータを飛ばし計算させデータを取ってくる。僕自身のイメージとして基本的にOpenCLデバイスは本当に計算しかできない。だから、手取り足取りメモリを確保することからカーネルオブジェクトの作成、計算の結果の取得まですべてホストプログラム(CPU)がやれなければならない。

また、OpenCL独特のオンラインコンパイルについて記述する。その前にオフラインコンパイラについての説明から。
 オフラインコンパイル方式では,カーネルプログラムをOpenCLコンパイラによって予めコンパイルしておき,ホストプログラム中でOpenCL APIを用いて読み込む方式である.プログラム中でコンパイルを行う必要がなく,カーネルプログラムの起動で生じるラグが少ないことが利点である.しかし,移植性を高めたい場合には,様々なアーキテクチャに対応させたカーネルプログラムにしなければならないため,必然的にプログラムサイズが大きくなる.多くのデバイスのメモリ容量は少ないことが多いので,この点でオフライン方式は不利となる.また,現状ではオンラインコンパイルのみをサポートし,オフラインコンパイルをサポートしていない実装がいくつかある.(http://www.is.doshisha.ac.jp/report/2010/9/17/2010030001/index.htmlより引用)
 つまり、これが普通のコンパイル。ホストプログラムもカーネルプログラムも全部コンパイルして実行ファイルを作ってしまう。そしたら楽なんだけど、移植性は低くなっちゃうよねって話。

それとは反対のオンラインコンパイル
 オフラインコンパイル方式とは反対に,プログラム実行時にカーネルプログラムをコンパイルする方式がオンラインコンパイル方式である.デバイスのアーキテクチャに依存することなく,環境に応じて適応的にコンパイルできる点がオンライン方式の利点である.しかし,リアルタイム性が要求される組み込み用途,ソースコードを非公開にしたい場合などにはコンパイル分のオーバーヘッドが付くのでこの方式は適していない.現存のすべての実装で,この方式をサポートしている.(http://www.is.doshisha.ac.jp/report/2010/9/17/2010030001/index.htmlより引用)
 つまり、これがOpenCL独特のコンパイル方式。予めコンパイルしておくのはホストプログラムだけ。ホストプログラムだけから作った実行ファイルを実行時に、その実行環境にあった並列処理(?)でカーネルプログラムを処理してくれるというもの。計算量が莫大になればなるほどおそらく逐次より早く動くものと思われる。