デフォルトのLANGの変更
Ubuntu でシステム全体のデフォルトのLANGの変更は、
/etc/default/locale
に対して行う。
Unmask floating point exception #2
この投稿の追加投稿。
Gcc 4.4.7 にて下記の除算のみを行うソースをコンパイルして逆アセンブルすると除算は、SSE2の命令である"DIVSD" (*1 p.728)が出力されていることが確認できます。
-div.c-
#include
int
main(void)
{
double a,b,c;
a=3.0;
b=0.0;
c=a/b;
return 0;
}
$ gcc -o div div.c
$ objdump -d div > div.d
-div.d のmainの一部-
40048f: f2 0f 10 45 e8 movsd -0x18(%rbp),%xmm0
400494: f2 0f 5e 45 f0 divsd -0x10(%rbp),%xmm0
400499: f2 0f 11 45 f8 movsd %xmm0,-0x8(%rbp)
前回投稿したコードは、x87 FPUのFPE(Floating Point Exception)のマスクを解除するものであり、当たり前ですがSSE2のFPEを解除しているわけではないので、mainの最後でdouble同士の除算をしてもSSE2の命令が出力されているのでFPEは発生しません。
今回は、SSE2のFPEのマスクを外すコードをメモ。
- sse2.c -
1 #include
2
3 int
4 main(void)
5 {
6 double a,b,c;
7 unsigned char buff[512] __attribute__*1;
26
27 c = a/b;
28
29 return 0;
30 }
fxsave(*1 P.846)/fxstor(*1 P.843) は、指定されたメモリ領域から/にMXCSR(*1 P.230)というSSE2の浮動小数点演算時に用いる情報を保持するレジスターに/の値を保存する。
20行目で該当するビットをクリアすることで、ゼロ割によるFPEのマスクを外している。
$ gcc --o sse2 sse2.c
$ ./sse2
SSE2 FPE bit mask= 1F
SSE2 FPE bit mask= 1D
Floating exception (core dumped)
[補足]
ちなみに、-mfpmath=387 というオプションをつけてコンパイルするとx87 FPUの除算命令を出力する。
*1 Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B, and 3C
*1:aligned(16)));
8
9 a=3.0;
10 b=0.0;
11 c=1.0;
12
13 c = a/b;
14
15 asm volatile(
16 "fxsave %0" // get valueof mxcsr register
17 :"=m"(buff):);
18
19 printf("SSE2 FPE bit mask= %X\n", buff[25]);
20 buff[25] = buff[25] ^ 0x2;
21 printf("SSE2 FPE bit mask= %X\n", buff[25]);
22
23 asm volatile(
24 "fxrstor %0" // set operand to mxcsr register
25 : :"m"(*buff
UEFI設定画面の確実な入り方
Windows 8.1がインストールされたPCで用があってUEFIの下記設定変更を行い。
・ディバイスの起動順の変更
・UEFIのセキュアブートの無効化
別のディバイスからブートして作業。作業終了後UEFIの設定を元にもどそうと設定画面に入るためのキーを押すが設定画面が表示されないし、Windowsも起動しない。
しょうがなく、電源ボタン長押しで電源断後、再度電源ボタンを押して暫くするとWindowsは起動した。
そんな事があったので対処法をメモ。
管理者権限のあるコマンドプロンプトで
shutdown /r /o
/r - Full shutdown and restart computer
/o - Go to the advanced options menu and restart computer. Must be used with /r option.
すると再起動後に"オプションの選択"という画面が表示されるので、トラブルシューティング]-[詳細オプション]-[UEFI ファームウェアの設定]の順にクリックする。
Unmask floating point exception
x86 なプロセッサ上のLinuxでは、浮動小数点同士の除算でゼロ割を行ってもSIGFPEは普通発生しない。これは、FPU control word*1 というFPUのレジスタ中のFloating point exception のマスク状態を表すフラグが立っているためである。
gfortran -ffpe-trap=zero というオプションを指定すると浮動小数点のゼロ割でSIGFPEが発生するようになる。今回は、gcc インラインアセンブラでFloating point exception のマスクを解除してみた。
#include
int
main(void)
{
double a,b,c;
unsigned short int fctr;
a=3.0;
b=0.0;
c=1.0;
asm volatile(
"fstcw %w1\n\t" // get FPU control word
"fdiv %3,%2"
:"=&t;"(c):"m"(fctr),"f"(a),"f"(b));
printf("c= %f FPU control word= %X\n", c, fctr);
fctr = fctr ^ 0x4;
printf("Value for FPU control word= %X\n", fctr);
asm volatile(
"fldcw %w1\n\t" // set operand to FPU control word
"fdiv %3,%2"
:"=&t;"(c):"m"(fctr),"f"(a),"f"(b));
printf("c= %f FPU control word= %X\n", c, fctr);
return 0;
}
[実行結果]
$ ./a.out
c= inf FPU control word= 37F
Value for FPU control word= 37B
Floating exception (core dumped)
*1 Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B, and 3C p.p.189-190
DEM データビュワー by webGL
地理情報プロファイル Ver.2.XでフォーマットされたDEMデータのビュワーを作ってみた。
というか手段(webGL)が完璧に目的化しているけど。。。
とりあえず形には、なったので公開。
本当は、file apiでクライアント側のテキスチャ画像を選択できる様にしたかったが、サーバー上の画像ファイルしか貼れないのがthree.jsの仕様らしく断念。
いや違うまたは、別の方法があればどなたか教えてください。