C++ Advent Calendar 2013 9日目 「Boost.AsioとBoost.Coroutineで脱コールバック」

本記事は C++ Advent Calendar 2013 9日目として書かれました。 はじめに お久しぶりです。 @fjnli です。 そういえば、去年はC++関係のAdvent Calendarを書いていませんでした。 最近C++をあまり触っておらず、BoostとかC++14とかのフォローがあまりできて…

Ariel AdC 11日目 ぷろぐらみんぐ言語ありえる

はじめに 本記事は Ariel Advent Calendar 2011 : ATND の11日目です。12日にオーバーランしてますが、11日目です。ごめんなさい。 ぷろぐらみんぐ言語ありえる まずは定番のHello worldをありえるで書いてみましょう。 ありえるありありえるありありえるあ…

Boost.Container stable_vector

はじめに 本記事は partake.in 7日目です。 stable_vector Boost 1.48からBoost.ContainerというSTL互換のコンテナライブラリが採用されました。基本的にはboost::container::vectorやboost::container::stringといったSTL互換のクラスが提供されていますが…

C++11時代のthreading

C++

始めに 本記事は C++11 Advent Calendar 2011 : ATND の6日目です。 std::thread C++11時代のthreadの基本は std::thread です。おもむろに #include をしましょう。std::threadはコンストラクタで渡された関数オブジェクトを別スレッドで実行します。 #incl…

libclangでMPIの関数を抽出してみた

手作業だとめんどくさいし、間違えそうだということでlibclangを使ってみました。こんなファイルstub.cを用意して、 #include <mpi.h> mpi_extractorに食わせると、MPI関数の名前、返り値の型、引数の型がCSVで出力されます。 $ ./mpi_extractor stub.c MPI_Abort,i</mpi.h>…

Asioでepollを使うのをやめる

Linux環境下でのBoost.Asioは、標準でepoll_reactorを使用します(AsioではIO多重化を行うクラスをreactorと呼んでいます)。しかしながら、epollは登録できるfile descriptorの種類がselectよりも狭いという仕様上の問題があります。例えばファイル(regular f…

夏休み終ったけどbjam始めてみます 4日目

夏休みはもう終ってしまいましたが、bjamはたまーに使っています。 C++のソースコードをコンパイルするだけなら、bjamは最短なのではないでしょうか。 …と思いましたがmake最短ですね…。 boost使いたいです 3日目に書いた方法でboostを使ってもいいのですが…

夏休みなのでbjam始めてみます 3日目

0xの使い方やライブラリ回りは、プロのbjammerことid:Flast先生に教えてもらいました。 複数のソースから1つの実行ファイルを作りたい 単に依存関係を並べればいいようです。Jamroot: exe a : a.cpp b.cpp ;$ $BOOST_ROOT/bjam release ...found 13 targets.…

夏休みなのでbjam始めてみます 2日目

1日目と同日公開ですが、2日目です。はい。デフォルトのvariantがdebugなので、ぼーっとしてると遅いバイナリを作ってしまいそうで怖いですね。3日目に続くかは謎です。 variantオプション bjamはデフォルトでdebugモードでビルドされます。ビルドモードを変…

夏休みなのでbjam始めてみます 1日目

bjamが欲しいので、まずはboostをダウンロードして展開し、bjamをビルドします。そして、boostを展開したディレクトリをBOOST_ROOT環境変数に定義しておきます。BOOT_ROOTはbjamの動作上も必要です。 $ export BOOST_ROOT=/path/to/boost $ cd $BOOST_ROOT $…

ZeroMQとfork(2)ではまった

僕はかなりはまったのですが、ZeroMQのcontextはfork(2)で複製できません。以下のようなコードを書くと死にます。forkする前にcontextを破棄するか、preforkしておく必要があります。URLを忘れたのですが、MLでもpreforkしておいてよみたいな流れだったので…

Boost.Phoenixのうーん?

phoenix::letの中で、引数(_1, _2, arg0, arg1系)は参照できず、コンパイルエラーになります。になって、引数がどっかにいってしまう。">*1この挙動はとても不便ですが、仕様としてこうなのか、実装がバグっていてこうなっているのかはわかりません。 void f…

Boost.Serializationの出力形式としてMessagePackを使えるようにしてみた

Boost.ArchiveのMessagePackバックエンドに用いた実装です。まだ試作段階ですが、Boost付属のSerialization用テストは一通り合格しているので、とりあえず動くと思います。ソースコードはgithubにあります。なお、ビルドツールはwafを使用しているため、ビル…

clang のライブラリの方で遊んでみた

clang のコンパイラではなく、ライブラリの方で遊んでみた。使用した clang(+LLVM) のバージョンは Subversion レポジトリより取得した r127064 。ちょっと古いが気にしない。clangのライブラリの方のドキュメントが見つけられなかったので、主にclang tutor…

Boost.勉強会 #4で発表しました

Boost.勉強会 #4 : ATND で発表してきました。資料は Boost.勉強会#4 Boost.Proto にあります。他の方の発表資料については、id:thincaさんがいい感じにまとめてくれています。感謝。さて、僕はBoost.Protoネタで発表をしてきたわけですが、前半後半と分けた…

gccのインラインアセンブラでレジスタに別名をつける

x86

register __m128* tmp asm ("xmm0"); asm volatile ( "pxor %[tmp], %[tmp]" : [tmp] "+x" (tmp) ); なんだかまわりくどいですね…。このコードは、 pxor %xmm0, %xmm0 に展開されます。

MOVDQUの特性について

x86

IntelのOptimization Manualの2.2.5.1 Efficient Handling of Alignment Hazardsによると、Nehalem系CPUからMOVDQUの性能が向上したとあるので、実験してみました。4パターンのmovを実行して速度差を見ます。alignedはアクセス先のアドレスが16バイトアライ…

Boost.Protoぺろぺろ

最初に このエントリは C++ Advent Calendar jp 2010 : ATND 16日目の記事です. Boost.Protoぺろぺろ Boost.ProtoとはBoostに含まれているExpression Template(ET)のためのライブラリです.Xpressiveや,Spirit,Phoenix v3のベースとなっています.このエ…

CURANDライブラリを使う [Device API]

CUDA Toolkit 3.2から,CURANDという疑似乱数ジェネレータライブラリが導入されました.GPUによる乱数の生成を行えるライブラリです.CURANDは,2つのAPIカテゴリから構成されています. Host API ホストからの使用を目的としたAPI群.Device APIの上に構築…

CURANDライブラリを使う [Host API]

CUDA Toolkit 3.2から,CURANDという疑似乱数ジェネレータライブラリが導入されました.GPUによる乱数の生成を行えるライブラリです.CURANDは,2つのAPIカテゴリから構成されています. Host API ホストからの使用を目的としたAPI群.Device APIの上に構築…

fstabをUUID指定にする方法

Blogは一ヶ月overぶりです。生きてます。最近のUbuntuでは、/etc/fstabのパーティションの指定にUUIDを使うようになっています。そのため、従来の/dev/sda1といった指定でたびたび発生していた問題が解消されています。例えば、HDDが増えた時にsdaがsdbにな…

[CUDA] GPUデバイスからprintfする

CUDA Toolkit 3.1からデバイスからprintfを発行できるようになりました.ただし,Device Capability 2.0以降のデバイスでなければサポートされていないので,GTX480といったいわゆるFermiアーキテクチャのカードが必要です. #include <stdio.h> __global__ void test</stdio.h>…

Oven meets Boost.Spirit.Karma

Boost.Spiritは元々が*1がパーサージェネレータであったこともあり、Qiが一番有名であると思いますが、Boost.Spirit一家にはKarmaという次男坊(?)がいます。Spirit.KarmaはSpirit.Qiの逆で、データから文字列を生成するコンビネータ郡です。Performance of N…

Boost.Buildで複数のバージョンのgccを切り替えて使う方法

$ bjam toolset=gcc のようにして実行をすると、システムデフォルトのgcc, g++が使われます。しかしながら、複数のgccのバージョンを切り替えてビルドやテストを行いたいケースもあります。autoconfによるビルドを採用しているソフトウエアならば、一般的に…

tupleのサイズ

ちょっと気になる所があったので, std::tuple (C++0x) boost::tuple boost::fusion::vector について大きさを調べてみました.fusion::vectorはタプルというよりも,タプル+αという感じですが….コンパイラによっても差が出そうだなーと思いつつも,VCがす…

AES-NIについて(頓挫)

最近のIntel CPUにはAES-NIと呼ばれるAES暗号化を加速させるための専用命令群が実装されています。対応CPUは、32nmプロセスで製造されたi7, i5となっています。いろいろややこしいので、詳しくはIntelのサイトかwikipediaなどを参照してください。最終的には…

BrainfuckをJITしてみた

C++

BFだとJITしやすいので作ってみた。簡単な最適化をしています。add/sub [rdi], immの直後にcmp [rdi], 0が来るのは無駄でしかないので、そこの最適化ぐらいはしてみたいですね。http://gist.github.com/518146ソースコードは400行ほどあるのでgist上に置いて…

Parsecで簡単な電卓を作ってみた

LanguageDef と TokenParser と ExpressionParser を使ってみたかったので。。。空白の扱いについて、ごちゃごちゃ書く必要がなくて楽でいいですね。 module Main (main) where import Text.ParserCombinators.Parsec as Parsec import qualified Text.Parse…

CairoとSDLを組合せてつかう

cairoの描画フロントエンドとしてSDLを使ってみた。ちょっと画面に表示させるだけなのにCocoaだのなんだのを使うのが面倒だったので…。見た感じ、cairo image surfaceとSDL surfaceを比較すると、cairoの方がピクセルフォーマットに対する許容度が低かったの…

GF100のキャッシュの性能

Motivation GTX480に代表されるGF100およびGTX460などのGF104にはL1, L2キャッシュが搭載され、メモリアクセスに関する制限が緩和されました。何も考えずに書くとGT200系では性能が出なかった場合でも、十分な性能が発揮されることがあります。そこで、定数…