[Armadillo:04681] Re: [a500fx] VFP について
URATAN Shigenobu
email@hidden
2009年 10月 21日 (水) 13:24:53 JST
うらたんです。
(スレッドが繋がらなかったらごめんなさい)
引き続き、以下の環境で、Armadillo-500 FX のあたりをとっております。
・Armadillo-500 FX 液晶モデル開発セット
・atmark-dist-20090318.tar.gz
・linux-2.6.26-at6.tar.gz
・atde2-20090403.zip
・「[Armadillo:04155] Re: Armadillo-500 VFP 環境構築」の
「以下のサイトにある*.debファイルを"dpkg -i"で全てインストールし」た状態。
<http://lists.atmark-techno.com/pipermail/armadillo/2009-March/004155.html>
In article <email@hidden>, URATAN Shigenobu <email@hidden> writes:
uratan> (arm-vfp-linux-gcc でスタティックリンクすれば/できればいいんですかね?)
Yasushi> それが一番良いかもしれません。
uratan> なにはともあれ まずはここからですかね。
と、当時はよくわかっていなかったんですが…、
非 VFP kernel 環境で 自分のプロセスだけ VFP を使いたい場合、
アセンブラがコードを吐きさえすれば行ける、のはそうなのだが、
kernel は process context として VFP レジスタ(VFP resources) を
管理(退避・復帰)してくれないわけだから、以下の条件が
必要になる、んですよね?
・VFP を使うプロセスは一つしか立ち上げてはいけない。
・他の user process や kernel は VFP レジスタを一切いじってはいけない。
(kernel 治外法権なリソースを自己管理で使う感じ?)
#...と思って試してみたらプロセス 2つぶつけても おかしな数値にならんなぁ
あと、もう一つ質問を。
現 kernel は 浮動小数点演算例外を受けて kernel でソフトウェア
エミュレーションしているとすると、エミュレーション処理中は
他のハードウェア割り込みを受け付けないと思っていいんでしょうか?
(あるいはハードウェア割り込みは多重で受け付けるが、ソフトウェア
(エミュレーションが終了しない限りは user process には戻らない?
(あるいは所詮加減乗除だから大した時間はかからないから気にすんな?
- * - * -
ところで、所望の「自分の実行ファイルだけ」というのは
やってみたら意外と簡単でした。
(ソースは末尾に)
(vfp 対応のライブラリが すべて揃っているわけではない)
(めざせ、vfp-libX11.a)
a500fx で実行 (double 値のバイナリの上下が逆なのがちょっと気になります)
+------------------------------------------
|a500fx# time ./a.out-fpu
|sizeof(float) is 4
|sizeof(double) is 8
| 100001.00000133294088300318 ..(0x40f86a10_000165cf)
| 10000.10000013329408830032 ..(0x40c3880c_cccdeb0c)
| 0.54030230586813976501 ..(0x3fe14a28_0fb5068c)
| 0.500000000000000 ..(0x3f000000)
| 1.666666626930237 ..(0x3fd55555)
| 0.540302276611328 ..(0x3f0a5140)
|real 0m 3.23s
|user 0m 0.20s
|sys 0m 3.03s
|a500fx#
|a500fx# time ./a.out-vfp
|sizeof(float) is 4
|sizeof(double) is 8
| 100001.00000133294088300318 ..(0x000165cf_40f86a10)
| 10000.10000013329408830032 ..(0xcccdeb0c_40c3880c)
| 0.54030230586813976501 ..(0x0fb5068c_3fe14a28)
| 0.500000000000000 ..(0x3f000000)
| 1.666666626930237 ..(0x3fd55555)
| 0.540302276611328 ..(0x3f0a5140)
|real 0m 0.02s
|user 0m 0.03s
|sys 0m 0.00s
+------------------------------------------
参考: ATDE2で実行
+------------------------------------------
|atde$ time ./a.out
|sizeof(float) is 4
|sizeof(double) is 8
| 100001.00000133294088300318 ..(0x000165cf_40f86a10)
| 10000.10000013329408830032 ..(0xcccdeb0c_40c3880c)
| 0.54030230586813976501 ..(0x0fb5068c_3fe14a28)
| 0.500000000000000 ..(0x3f000000)
| 1.666666626930237 ..(0x3fd55555)
| 0.540302276611328 ..(0x3f0a5140)
|
|real 0m0.058s
|user 0m0.048s
|sys 0m0.008s
+------------------------------------------
当初は -static を付けてなくてこの状況であせりました。
なんにもエラーがでません。
+------------------------------------------
|a500fx# ./a.out-vfp-non-static
|sizeof(float) is 4
|sizeof(double) is 8
| 0.00000000000000000000 ..(0x000165cf_40f86a10)
|-96153245267219184301118951576085554651401452059363788126683136.00000000000000000000 ..(0xcccdeb0c_40c3880c)
| 0.00000000000000000000 ..(0x00000000_3ff00000)
| 0.000000000000000 ..(0x3f000000)
| -0.000000000000000 ..(0x3fd55555)
| -0.000000000000000 ..(0xbf121fb5)
+------------------------------------------
ちなみにファイルの大きさは こんな感じです。
+------------------------------------------
|a500fx# ls -l a.o*
|-rwxr-xr-x 1 root root 3964 Oct 21 11:48 a.out-fpu*
|-rwxr-xr-x 1 root root 476832 Oct 21 11:48 a.out-vfp*
|-rwxr-xr-x 1 root root 3928 Oct 21 11:48 a.out-vfp-non-static*
+------------------------------------------
以上ですが、よろしくお願いいたします。
--
email@hidden
========== 8< ========== Makefile ここから ========== >8 ==========
#
# Makefile for VFP test
#
OP=-O2
all: asm aout
asm: test2-fpu.s test2-vfp.s
aout: a.out-fpu a.out-vfp a.out
clean:
rm -f test2-fpu.s test2-vfp.s
rm -f a.out-fpu a.out-vfp
rm -f a.out
test2-fpu.s: test2.c
arm-linux-gcc -S -o test2-fpu.s ${OP} test2.c
test2-vfp.s: test2.c
arm-vfp-linux-gcc -S -o test2-vfp.s ${OP} test2.c
a.out-fpu: test2.c
arm-linux-gcc -o a.out-fpu ${OP} test2.c -lm
arm-linux-strip a.out-fpu
a.out-vfp: test2.c
arm-vfp-linux-gcc -o a.out-vfp ${OP} test2.c -lm -static
arm-linux-strip a.out-vfp
a.out: test2.c
gcc -o a.out ${OP} test2.c -lm
========== 8< ========== Makefile ここまで ========== >8 ==========
========== 8< ========== test2.c ここから ========== >8 ==========
#include <stdio.h>
#include <math.h>
int main()
{
int i, j;
union {
double x;
unsigned long l[2];
} dl;
union {
float x;
unsigned long l;
} fl;
printf("sizeof(float) is %d\n", sizeof(float));
printf("sizeof(double) is %d\n", sizeof(double));
dl.x = 1.0;
for(i=0; i<10; i++){
for(j=0; j<100000; j++){
dl.x += 0.1;
}
}
printf("%30.20f ..(0x%08x_%08x)\n", dl.x, dl.l[0], dl.l[1]);
dl.x *= 0.1;
printf("%30.20f ..(0x%08x_%08x)\n", dl.x, dl.l[0], dl.l[1]);
dl.x = cos(1.0);
printf("%30.20f ..(0x%08x_%08x)\n", dl.x, dl.l[0], dl.l[1]);
/* - * - * - */
fl.x = 0.5;
printf("%25.15f ..(0x%08x)\n", fl.x, fl.l);
fl.x /= 0.3;
printf("%25.15f ..(0x%08x)\n", fl.x, fl.l);
fl.x = cosf(1.0);
printf("%25.15f ..(0x%08x)\n", fl.x, fl.l);
return 0;
}
========== 8< ========== test2.c ここまで ========== >8 ==========
armadillo メーリングリストの案内