[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 メーリングリストの案内