C++たのしいPython今夜コードを書いているすべてのヒトへプロフィールAuthor:辻真吾(つじしんご)www.tsjshg.infoいまは、大学の研究室を主な拠点に、色々やってます。このブログはPythonの話題が中心ですが、どちらかというと日々の仕事で使う知識を、自分のためにメモしたものです。万が一どなたかの役に立てば光栄です。githubgoogle-code-prettify管理者ページこのブログをリンクに追加するMacOSXのインテルコンパイラでOpenMP折角たくさんコアがあるけど、並列プログラミングは面倒だという方に指示されているのかどうか解りませんが、OpenMPを使ったときのメモを。++i){...などとすると、マルチコア化されるという魔法のような話です。スレッド数は環境変数OMP_NUM_THREADSで設定できます。Compiler11.0があったので、これでコンパイルしました。trapというエラーが・・・/opt/intel/Compiler/11.0/056/libに、libiomp5.dylibがあったので、LD_LIBRARY_PATHに追加すればいいのか?と思ってやってみるも失敗。あり?と少し悩みましたが、iccのコンパイルオプションに、-static-intelを追加すればOKです。なんか、とりあえずマルチスレッドで動いてます。8コアMacProなので、5コアくらい使って5倍になったらいいかなというところです。trapBoostのprogram_optionsで、たとえば以下のようにしてvmを用意したとします。vm);notify(vm);vm["data"]などとして、コマンドライン引数にアクセスしますが、これがあらかじめ指定されたものではないと、冒頭のエラーが出ます。自分でもよく忘れるので、こうしてGoogleに覚えておいてもらおうとメモしてみました。top↑MacOSX10.5で64bitのBoostライブラリをbuildするC++もSTLやBoostを使うと、横着なプログラムが書けるので好きなのですが、ちょっとしたシミュレーションなどでぼけーっと適当なプログラムを書いていると、実行時のメモリ消費量が4Gを超えてしまい、code=12でmallocエラーが出てしまって、寂しい思いをしたりします。optionsなので動作に関係はないのですが・・・)を使っていて、これを32bitでビルドしていると、リンクできずにコンパイルに失敗します。いうわけで、Boostのビルドが必要なライブラリの64bit版がほしくなって、作ってみました。--prefix=/usr/local/lib/x86_64これで、自動的にtools/jam/src/bin.macosxx86/bjamがbuildされます。bjamを使ってもよいのですが、せっかくMakefileがあるので、これを変更します。2行目のBJAM_CONFIG=を、以下のように変更します。installでOKです。できるファイルは、32bit版と同じ名前になるので、ディレクトリで分けておいた方がいいかもしれません。/usr/local/lib/x86_64/libとなって、なんか、かっこ悪いですが・・・ちなみに、BoostのPython関係のライブラリのビルドには失敗します。Pythonが64bitじゃないからかなーと勝手に思っていますが、原因を究明する元気がありません。32ビット版使えばいいし。top↑boost.program_optionsとboostのbuildC++でコマンドラインから起動するプログラムを作っていると、やっぱり引数をパースしてくれるライブラリが欲しくなります。探したら、さすがboost。boost.program_optionsを使えばよいようです。続くなんとなく、見ればわかると思います。add_optionsで追加するとき、最初に書くのが正式名称で、カンマで区切って省略形です。プログラムの中でアクセスするときは、正式名称で。省略形は、1文字のみです。省略形では、スペースや=などを使わず続けて書くことが出来ます。boost_optionsを使おうと思うと、boostをビルドする必要があります。Unix系OSとCygwinでは簡単です。/usr/localなどにboostのヘッダファイルをインストールしている場合など、書き込み権限があるか確認してください。configureのオプションでインストール先を変更することも可能です。私は、MacOSでsudoつけただけですが。/usr/local/lib/libboost_program_options.aでコンパイル出来ます。コマンドライン引数のヘルプを半ば自動で生成してくれるので楽です。header)ちなみに、Pythonで似たようなことを実現してくれるモジュールに、getoptとoptparseモジュールがありますが、optparseの方が現代的(オブジェクト指向由来の発想)なので、後者のほうがいいでしょう。top↑random_sampleがない・・・Pythonでは、どうしても速度が出ないところを最近、C++で書いてます。8年ぶりに触ってみると、STLが当たり前になったり、Boostが便利だったりで、かなり心地いいですが、どうしても方言みたいなものが出てきてしまいます。はまったので、メモっておきます。vectorをかき混ぜるのに、random_shuffleという関数が、algorithmの中に定義されています。その他、random_sampleとrandom_sample_nというのもあるように見えるのですが、実はこれは、SGIによる拡張らしく、標準ではないらしい。4.1.3で、試したのは、algorithmの代わりに、ext/algorithmをincludeする方法です。うまくいきますが、なんだかなー。誰も教えてくれないし。C++は世界が巨大すぎるか?時代は、Dなんじゃないでしょうか?そのうち触ってみます。