3

ディストリビューションで利用可能な x86 ではなく、x64 用の Python 拡張機能 IGRAPH をソースからコンパイルしています。VS 2012 ですべてを整理し、src/math.c で次のようにコメントアウトするとコンパイルされます。

#ifndef HAVE_LOGBL
long double igraph_logbl(long double x) {
long double res;
/**#if defined(_MSC_VER)
  __asm { fld [x] }
  __asm { fxtract }
  __asm { fstp st }
  __asm { fistp [res] }
 #else
 __asm__ ("fxtract\n\t"
 "fstp  %%st" : "=t" (res) : "0" (x));
 #endif*/
    return res;
 }
#endif

問題は、私が asm をよく知らないことと、x86 から x64 に移行する際に問題があるかどうかを知るのに十分ではないことです。これは、私が見ることができる、x64 組み込み関数に変換する必要がある 4 つのアセンブリ命令の短いスニペットです。

ポインタはありますか?本質的に正しい方向に進んでいますか?それとも、サブルーチンまたは純粋な C である必要がありますか?

編集: 誰かがhttp://igraph.sourceforge.net/download.htmlを見たい場合は、igraph 拡張機能へのリンク

4

1 に答える 1

2

x64 では、浮動小数点は一般に SSE2 命令を使用して実行されます。ここでの唯一の問題は、SSE に fxtract op に相当するものがないことです (これは一般に、FPU バージョンが複合命令として実装されるため、非常に遅いことを意味します)。そのため、C 関数として実装すると、x64 でも同様に高速になる可能性があります。

関数を読むのは少し難しいと思いますが、fxtract を呼び出してから、long double が指すアドレスに整数値を格納していることがわかります。これは、long double に「部分的に」未定義の値が含まれることを意味します。上記のコード アセンブリは機能しないはずですが、x87 コードを作成してから非常に長い時間が経過しているため、おそらく錆びているだけです。

とにかく、関数は、MSVC に実装されていないlogbの実装のようです。ただし、frexp 関数を使用して次のように実装できます。

long double igraph_logbl(long double x) 
{
    int exp = 0;
    frexpl( x, &exp );
    return (long double)exp;
 }
于 2012-10-30T20:57:43.250 に答える