« December 2005 | Main | February 2006 »

2006.01.15

今日の日記

2週間ほど、わけあって、連絡が取りにくい状況です。
ではでは

| | Comments (0) | TrackBack (0)

2006.01.11

捜し物続き

hello worldを書いてみると、あれ、これも_ないじゃん
>nm a.out | grep main
0804852c T main

もう一度エラーメッセージを確認してみると、_関係ないな。
usr/lib/crt1.o(.text+0x81): In function `_start':
: undefined reference to `main'
arith01.o(.text+0xd): In function `std::__verify_grouping(char const*, unsigned int, std::string const&)':
: undefined reference to `std::string::size() const'


というわけで、試行錯誤しながらここまで。
> g++ -v -L/home/natu/system_data/systemc-2.1.v1/lib-linux/ -lsystemc arith01.o > & log.txt
-v オプションでリンカに渡したコマンド表示できるのか。

Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.2 [FreeBSD] 20040728
/usr/bin/ld -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/home/natu/sy
stem_data/systemc-2.1.v1/lib-linux/ -L/usr/lib -lsystemc arith01.o -lstdc++ -lm -lgcc -lc -lgcc /usr/lib/crtend.o /usr/l
ib/crtn.o
arith01.o(.text+0x1cc): In function `sc_main':
: undefined reference to `sc_dt::sc_signed::sc_signed(int)'
arith01.o(.text+0x1dd): In function `sc_main':
: undefined reference to `sc_dt::sc_signed::sc_signed(int)'
arith01.o(.text+0x1ee): In function `sc_main':
: undefined reference to `sc_dt::sc_signed::sc_signed(int)'
arith01.o(.text+0x287): In function `sc_main':
: undefined reference to `sc_dt::sc_signed::operator++(int)'
arith01.o(.text+0x375): In function `sc_main':
: undefined reference to `sc_dt::sc_signed::operator--(int)'
arith01.o(.text+0x44e): In function `sc_main':
: undefined reference to `sc_dt::sc_signed::operator++()'
arith01.o(.text+0x51d): In function `sc_main':
: undefined reference to `sc_dt::sc_signed::operator--()'
arith01.o(.gnu.linkonce.t._ZN5sc_dteqERKNS_9sc_signedEi+0x10): In function `sc_dt::operator==(sc_dt::sc_signed const&, i
nt)':
: undefined reference to `sc_dt::operator==(sc_dt::sc_signed const&, long)'
arith01.o(.gnu.linkonce.t._ZN5sc_dt9sc_signedpLEi+0x10): In function `sc_dt::sc_signed::operator+=(int)':
: undefined reference to `sc_dt::sc_signed::operator+=(long)'
arith01.o(.gnu.linkonce.t._ZN5sc_dt9sc_signedmLEi+0x10): In function `sc_dt::sc_signed::operator*=(int)':
: undefined reference to `sc_dt::sc_signed::operator*=(long)'
arith01.o(.gnu.linkonce.t._ZN5sc_dt9sc_signedD1Ev+0xb): In function `sc_dt::sc_signed::~sc_signed()':
: undefined reference to `vtable for sc_dt::sc_signed'
arith01.o(.gnu.linkonce.t._ZNK5sc_dt9sc_signed5printERSo+0x38): In function `sc_dt::sc_signed::print(std::ostream&) cons
t':
: undefined reference to `sc_dt::sc_signed::to_string(sc_dt::sc_numrep, bool) const'
arith01.o(.gnu.linkonce.t._ZN5sc_dt9sc_signedaSEi+0x10): In function `sc_dt::sc_signed::operator=(int)':
: undefined reference to `sc_dt::sc_signed::operator=(long)'
GNU ld version 2.15 [FreeBSD] 2004-05-23
Supported emulations:
elf_i386_fbsd

あと、sc_dtさえ突破したら動きそうな気がした。

| | Comments (0) | TrackBack (0)

捜し物は何ですか?

上手くリンクできない方のFreeBSDのライブラリでさらに調べてみた。

nm libsystemc.a | grep main
000003a0 T _ZN7sc_core13sc_cor_pkg_qt8get_mainEv
00000004 b _ZN7sc_core8main_corE
sc_main.o:
00000000 T main
sc_main_main.o:
U sc_main
U remainder
U remainder

うはwwww
シンボルにアンダーバーついてないじゃん。
どうしたら、アンダーバー無しでコンパイルできるんだ。

| | Comments (0) | TrackBack (0)

2006.01.09

main()関数みーつけた。

確認のために、cygwinのライブラリでmainのエントリーが
あるか試してみる。相変わらず、gnuのツールは取っつきが悪い。
ライブラリアンに相当するコマンドがnmと分かれば、後は楽。

> nm libsystemc.a | grep main
0000054e T __ZN13sc_cor_pkg_qt8get_mainEv
00000018 b _main_cor
sc_main.o:
U ___main
00000000 T _main
U _sc_main_main
sc_main_main.o:
U _sc_main
00000014 T _sc_main_main
U _remainder
U _remainder
こんな感じで、sc_main.oの中に_mainのエントリーがありますね。
上の出力のTのマークがテキストエリアのsymbol、Uがundefinedな
symbolらしい。つまり、Tの部分が関数の入り口で、Uの部分が
関数の呼び出しかな。(ポインタの取得という考えもあるけど)

grepで特定の行だけ抜き出しているので、想像の範囲ですが
_mainから、_sc_main_mainを呼び出し、そこから、_sc_mainを
呼んでいる感じ。

| | Comments (0) | TrackBack (0)

2006.01.08

俺のmainはそこにある。

FreeBSDでのエラーを追いかけると、main関数が見つかりません
との事。そういえば、sc_main()って誰が呼び出すんだ。
もしかして、main()のエントリーて、ライブラリの中にあるのか!
んで、crt0からの飛び先がないから怒られいるみたい。

まさに、奇襲。理の外。
ああ、俺のmain()はそこにある。

すいません、さっきまでアカギみてました。

| | Comments (0) | TrackBack (0)

SystemCのregtestsの続き。

問題切り分けの為に、別PCのCygwinで走らせてみた結果
ですが、若干エラーがでるのと、eventの所で試験が
終わらない。まだ、2.1には対応していない予感。

んで、試験が終わると、なぜかファイルが削除されている。
困った。とはいえ、arith00までは上手くいってるんだから
同じ gccだし、ここから追いかけよう。

| | Comments (2) | TrackBack (0)

2006.01.06

今日の発見

ぺんぎん草さんのWeb
PDAを使った英語の勉強など参考にしています。
1年以上更新が止まったかと思っていたのですが、引っ越しだった
ようです。
http://d.hatena.ne.jp/penguins/


そして、航天機構 水城さんのWeb

http://www2a.biglobe.ne.jp/~mizuki/book/review/bookrev.htm
1ヶ月でそれだけ本は読めないだろう、というような濃い本のレビューが
てんこもり。それにしてもすごい。

はっと気がつく表現もあり、読みふけってしまいました。
http://www2a.biglobe.ne.jp/~mizuki/book/review/bk020923.htm#HANDP
なるほど、割り込み時に最大のパフォーマンスを発揮するアーキテクチャが
あってもいいですね。関数の呼び出しも全部割り込みで処理しちゃえば
いいのか。

これが一番笑った。
http://www2a.biglobe.ne.jp/~mizuki/book/review/bk001016.htm#GDB

| | Comments (2) | TrackBack (0)

お正月の日記

お正月の今田が出ているクイズ番組を見る。
「萌え萌え」にポーズがあるなんて初めてしった。
絶対領域が普通に分かってしまった自分に萎え。

娘がタケモトピアノを聞くと泣きやむ。大発見と
思ったら有名だったようでがっくり。

ドラゴン桜が良かったです。
高校三年生から、人生が別れていく気がした。
今までは、運動会でも、修学旅行でも、みんなで
同じイベントを共有していたのが、受験からは
それぞれの道を歩き始める。
ずっと友達だと思っていた人たちと2度とあわない
現実。試験当日の孤独と緊張感などが、鮮明に
フィードバック。
ごくせんよりも楽しめました。

| | Comments (0) | TrackBack (0)

UTK Q and A

Q:新歓はいつまでですか?
A:ずっと

| | Comments (0) | TrackBack (0)

年末年始の成果

ふぃー。娘が一歳になっただけで、突然勉強の時間が取れなく
なってしまった。昼間娘と遊ぶとそれだけでくたくた。


検証の本 3冊 (残り1冊)
C++の本 1冊
SystemC関連 1冊
英語のソフトウェア開発の本 1冊 (半分くらい)
ドラッガーを英語で 1冊
全然仕事と関係の無い本 2冊
ジオスの教材 リスニングの達人 5冊 (終了!)

全体的には予想していた3割程度

| | Comments (2) | TrackBack (0)

SystemC on FreeBSD その2

regtestsをダウンロードしてくる。
2.1の所からはダウンロードできないので、2.0.1から落としてきましょう。

んで、例によって、FreeBSDなんかサポートしてませんが何か?
と言われるので、スクリプトをこつこつを直していくく。
環境をlinuxとだまし討ちして、
$cxx = "gcc";
$rc_cc = "gcc";
これくらいで行けそうな気がするのだが、arith01.cppのリンク時にエラー

/usr/home/natu/system_data/systemc-2.1.v1/lib-linux/libsystemc.a(scfx_pow10.o)(.text+0xec4): In function `global constru
ctors keyed to _ZN5sc_dt10scfx_pow10C2Ev':
: undefined reference to `std::ios_base::Init::Init()'
/usr/home/natu/system_data/systemc-2.1.v1/lib-linux/libsystemc.a(scfx_pow10.o)(.text+0xeb4): In function `__tcf_0':
: undefined reference to `std::ios_base::Init::~Init()'
/usr/home/natu/system_data/systemc-2.1.v1/lib-linux/libsystemc.a(scfx_pow10.o)(.eh_frame+0x12): undefined reference to `
__gxx_personality_v0'
こんな感じでてんこ盛りエラー。ちなみに、arith01.cppのコンパイルは成功
している。

んと、多分リンカに与えるオプションで、必要なライブラリが
指定されていないだけの気がする。

問題の切り分けのために、別PCのcygwinでやってみる。
すげー。
自動で、全部テストしてるよ。
夢にまで見た自動単体テストが今僕の手の中に!

cygwinでも同じようにgcc使っているので、時間を作ってリンカの
コマンドをおってみよう。

今日はここまで。

| | Comments (0) | TrackBack (0)

popcount続き

最初に謝っておきます。今日もぐだぐだです。

電車の中で気になった点が有り、ちょっと調べてみる。
popcountの回路って、adderが7つも使われたが、もしかして全部LUTで
生成した方が速くね。

というわけで実験してみようとおもったけど、8bit幅じゃハードマクロの
DSP48にアサインされていない。しょうがないので、32bitに拡張。
これでも、アサインされていない。ちなみ回路は、Virtex4 lx25-12。
あと、ピンのsetupとか入ってくると話がそれるので、入力で一段FF追加。

(この辺りからぐだぐだ)

回路はこんな感じ

まずは、assignでローテートのデータを作る。
assign rot0 = data_reg[31:0];
assign rot1 = {data_reg[30:0], data_reg[31]};
assign rot2 = {data_reg[29:0], data_reg[31:30]};
assign rot3 = {data_reg[28:0], data_reg[31:29]};

で、1CLKでこれだけの演算をさせる。
popcount <= -(
rot0 + rot1 + rot2 + rot3 + rot4 + rot5 + rot6 + rot7 + rot8 + rot9 +
rot10 + rot11 + rot12 + rot13 + rot14 + rot15 + rot16 + rot17 + rot18 + rot19 +
rot20 + rot21 + rot22 + rot23 + rot24 + rot25 + rot26 + rot27 + rot28 + rot29 +
rot30 + rot31);

ローテートを全部足し込んで、最後に反転。
無理矢理、DSP48を使わせるために、論理合成のoptionでDSP48をONにする。

で結果。
DSP48 option ON にしたとき、 26.504ns 37MHz
DSP48 option AUTO にしたとき 13.652ns 73MHz

何がしたかったかというと、「意味も分からずに、いろんなオプションをONに
するな」という話にまとめたかった。正直にAdderを作って重ねるよりも
LUTで組み合わせ回路を作ったほうが、良くなる場合もある。
回路はここ

そんな事よりも、上のように思うがままに書いた素人回路が、73MHzで動く
事の方が驚きですよ。

| | Comments (0) | TrackBack (0)

2006.01.04

謹賀新年

あけましておめでとうございます。

今年も、ぼちぼちと更新していきますので
よろしくお願いいたします。

| | Comments (0) | TrackBack (0)

2006.01.02

populoation count (個体数計算)

ハッカーのたのしみより。

bitの数え上げのアルゴリズム。
シフトをしながら数え上げる方法、テーブルを使う方法、2bitずつ足す方法
など、実用的な物もそうでないアルゴリズムも紹介されている。
2bitずつ足す方法からの最適化は秀逸なので、一読をお勧め。

中で紹介されていた、無意味っぽいアルゴリズム。

pop(x) = -Σ(x <<< i)
<<<はrotate命令で、i=0から、bit幅-1までの足し算。

どういうことかというと、左にrotateしながら足し込んで、2の補数を
取るとビットの数え上げが完了する。rotateの仕組みから行って、右方向
でも左方向でも結果は同じである。

なんでこうなるのかが分からないのですが、例えば8bitでbitが1つだけ
立っている例(1,2,4等)で考えると、順にローテートしていくと、
1,2,4,8,16,32,64,-128になる。全部足し込んで-1、符号を反転させると
1になる。すげー。

納得いかないので、Cでプログラミングしてみる。

0:0
1:1
2:1
3:2
4:1
5:2
6:2
7:3
(省略)
252:6
253:7
254:7
255:8

と、8bit(左)に対して、ちゃんと数え上げてる(右)。
この本を勉強している趣旨としては、Cの小粋なアルゴリズムの
HDL化なので、Veriogで書き直し。

assign rot0 = data[7:0];
assign rot1 = {data[6:0], data[7]};

こんな感じで、rotateデータを作り、

sum <= rot0 + rot1 + rot2 + rot3 + rot4 + rot5 + rot6 + rot7;
popcount <= - sum;
みたいに足し込む。同じようにできた!

これで、リソース問わなければ、1~2CLKで、数え上げ完了だ。

Cのソースと、Veilogソース、テストベンチなどはここ

ちなみにISEで論理合成させると、Adderを8個使う。
最初の8つの足し合わせに7つと(トーナメント方式で足している)、
最後の反転で一つ使っている。Adderをタイムシェアリングすれば、
もっと少なく行けそうですね。

| | Comments (0) | TrackBack (0)

« December 2005 | Main | February 2006 »