標準出力

新しいもの、変わらないこと 自分の頭を通して考えてみました (stdout)

OpenLDAP サーバー構築でハマった点

"failed to start slapd"と言われてデーモンのスタートが失敗する場合は、"slapd.conf"の構文を間違えていないかslaptest(BC) をj実行してみる。

objectClass organizationalUnit を用いる場合は、下記2つのスキーマをslapd.confでインクルードする。

/usr/local/etc/openldap/schema/cosine.schema
/usr/local/etc/openldap/schema/inetorgperson.schema


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の仕様らしく断念。

いや違うまたは、別の方法があればどなたか教えてください。