最近8coreのワークステーションを使う機会があったのですが、そのCPUのパワーを引き出すことの難しさを身をもって経験しました。大量のデータを処理したかったのですが、HDDがボトルネックになって、全然CPUが活躍させられないのです。
これからの時代、より大量のデータを処理する局面が増えてくると思うのですが、いかにデータをCPUに流してやるかが重要なんですね。SSDとかだともっとましになるだろうし、または分散ファイルシステムにしてMapReduce的なことをするのも向いてるのかなあという印象です。
以前までのやってた研究だと、データはほんの少しでほとんどがいかに計算を速くするかを問題にしていたので、新鮮な経験でした。
2009年12月22日火曜日
2009年12月18日金曜日
Fedora12のevinceで日本語表示
最近UbuntuだけでなくFedoraも使うようになったが、FedoraはUbuntuに比べると日本語対応が弱いようで結構苦労する。標準では日本語のPDFも見られないし、日本語のLaTeXもレポジトリにないし。
今日はFedora 12上のevinceで日本語を表示する方法が判明したのでメモとして書いておく。
今日はFedora 12上のevinceで日本語を表示する方法が判明したのでメモとして書いておく。
- evinceのインストール: 多分標準で入る
- popplerのサイトからpoppler-data-x.y.z.tar.gzの最新版をダウンロード
- poppler-dataを展開
- Makefileのprefixを/usrに変更
- (rootで) make install
"prefix = /usr/local" => "prefix = /usr"
2009年12月14日月曜日
2009年7月9日木曜日
C++によるrubyの拡張
現在研究中のプログラムをライブラリ化して簡単に使えるように ruby の binding がうまくいくかを試してみようと思った。README.EXT.ja や Programming Rubyを参考に簡単なものを作ってみたが予想外に苦労するはめになった。それは、クラスにメソッドを登録するところで、以下のようなコードでもエラーが出るのだ。
エラーメッセージ
これは rb_define_method の引数の型が合わないことが原因で、reinterpret_cast を使って対処することにした。この方法が分かるまで本当に面倒だった。
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のテンプレート変数にする分には問題ない。
ここらへんはごまかして勉強したのでダメですね。
下に例を載せているが、クラス定義の中で前方宣言したクラスの変数を定義する際は、ポインタやテンプレート変数ならばいいけれども、そのまま使うことはできない。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) を使う. プログラムの一部だけだが, 以下のようになった.
そこで, 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;
}
登録:
投稿 (Atom)