2009年12月22日火曜日

ボトルネック

最近8coreのワークステーションを使う機会があったのですが、そのCPUのパワーを引き出すことの難しさを身をもって経験しました。大量のデータを処理したかったのですが、HDDがボトルネックになって、全然CPUが活躍させられないのです。

これからの時代、より大量のデータを処理する局面が増えてくると思うのですが、いかにデータをCPUに流してやるかが重要なんですね。SSDとかだともっとましになるだろうし、または分散ファイルシステムにしてMapReduce的なことをするのも向いてるのかなあという印象です。

以前までのやってた研究だと、データはほんの少しでほとんどがいかに計算を速くするかを問題にしていたので、新鮮な経験でした。

2009年12月18日金曜日

Fedora12のevinceで日本語表示

最近UbuntuだけでなくFedoraも使うようになったが、FedoraはUbuntuに比べると日本語対応が弱いようで結構苦労する。標準では日本語のPDFも見られないし、日本語のLaTeXもレポジトリにないし。

今日はFedora 12上のevinceで日本語を表示する方法が判明したのでメモとして書いておく。

  1. evinceのインストール: 多分標準で入る
  2. popplerのサイトからpoppler-data-x.y.z.tar.gzの最新版をダウンロード
  3. poppler-dataを展開
  4. Makefileのprefixを/usrに変更
  5. "prefix = /usr/local" => "prefix = /usr"
  6.  (rootで) make install
これで日本語フォントの埋め込まれたPDFは読めるようになった。ただ埋め込まれていないPDFに対応するにはさらに設定が必要な気がする。手元にそんなPDFファイルがなかったので確認していないけど。

2009年12月14日月曜日

ひさしぶりに

前回の投稿から結構経ってしまいました。この間に就職活動でさんざん苦労したものの、無職確定寸前でなんとか就職が決まって、その後関東に引越したりしました。

すっかりブログのことは忘れていましたが、先日研究室の後輩と飲んだときに、なぜか教えていなかったこのブログのことを知っているという話になって驚きました。そんなこんなで、読者がいるならまたボチボチ再開しようかなあという気がしてきました。

ただ、ネタをどうしようかなあという感じです。

2009年7月9日木曜日

C++によるrubyの拡張

現在研究中のプログラムをライブラリ化して簡単に使えるように ruby の binding がうまくいくかを試してみようと思った。README.EXT.ja や Programming Rubyを参考に簡単なものを作ってみたが予想外に苦労するはめになった。それは、クラスにメソッドを登録するところで、以下のようなコードでもエラーが出るのだ。

VALUE initialize(VALUE self){
return Qnil;
}
...
void Init_something(void){
....
rb_define_method(klass, "initialize", initialize, 0);
....
}


エラーメッセージ
error: invalid conversion from ‘VALUE (*)(VALUE)’ to ‘VALUE (*)(...)’


これは rb_define_method の引数の型が合わないことが原因で、reinterpret_cast を使って対処することにした。この方法が分かるまで本当に面倒だった。
#define RB_FUNC(f) reinterpret_cast<VALUE (*)(...)>(f)

void Init_something(void){
....
rb_define_method(klass, "initialize", RB_FUNC(initialize), 0);
....
}

2009年5月25日月曜日

C++の前方宣言

C++には前方宣言というのがあって、うまく使うとヘッダファイルのインクルード関係を整理できる。なんとなく使っていたが、今日一つはまった点をメモ。

下に例を載せているが、クラス定義の中で前方宣言したクラスの変数を定義する際は、ポインタやテンプレート変数ならばいいけれども、そのまま使うことはできない。vectorのテンプレート変数にする分には問題ない。

ここらへんはごまかして勉強したのでダメですね。


// case1: OK

class A; // 前方宣言

class B{
A *a;
};



// case2: OK

class A;

class B{
std::vector<A> a;
};



// case3: OK

class A;

template<class T=A>
class B{
T a;
};



// case4: NG

class A;

class B{
A a;
};

2008年10月7日火曜日

FreeBSDでsincos

glibcではsincosを使うことができるが, FreeBSD上ではlibcに入っていないので使うことができない. 以下のようなインクルードファイルを作ってやれば一応使える. 以前どこかのページで見て使っていたのだが, どこのページだったかは失念してしまった.
inline void sincos(double t, double *s, double *c){
asm("fsincos;" : "=t" (*c), "=u" (*s) : "0" (t) : "st(7)");
// *s = sin(t); *c = cos(t)
}

2008年6月8日日曜日

FreeBSD上でのCPUの使用率の計測方法

FreeBSDでCPUの使用率をチェックするために, fluxboxのドック用の自作アプリを使っているのだが, 最近 7-stable のソースの更新をしたところ, そのアプリが動かなくなった. 元々, xosview のソースを流用していて, それでは kvm を使って使用率を取得していたが, どうも仕様が変更になったらしい. 試しに, xosview を入れてみるとやはり動かなかった.

そこで, powerd.c のソースを参考にして, sysctl を使ってCPUの使用率を取るように変更した. 簡単に解説すると, まず, 前処理として, Management Information Base (MIB) を取得しておき, 使用率を取る際はその MIB を使って sysctl(3) を使う. プログラムの一部だけだが, 以下のようになった.

#include <sys/resource.h>
#include <sys/types.h>
#include <sys/sysctl.h>

static int cp_time_mib[2];

/* 前処理. 1回だけ行う. */
void preprocess(void){
int len = 2;
if (sysctlnametomib("kern.cp_time", cp_time_mib, &len))
{
perror("lookup kern.cp_time");
exit(1);
}
}

/* CPUの使用率を百分率で返す */
double cpu_getusage(void)
{
long cpu, nice, system, idle, used, total;
long cpu_time[CPUSTATES];
size_t cpu_time_len;

cpu_time_len = sizeof(cpu_time);
if (sysctl(cp_time_mib, 2, cpu_time, &cpu_time_len, NULL, 0))
{
perror("sysctl error");
exit(1);
}

cpu = cpu_time[CP_USER];
nice = cpu_time[CP_NICE];
system = cpu_time[CP_SYS];
idle = cpu_time[CP_IDLE];

used = cpu + nice + system;
total = used + idle;
return 100.0 * used / (double) total;
}