2

MinGWでATLASをコンパイルしようとしています。私は問題を解決し始めましたが、今は単純な問題で立ち往生しています。ATLASのMakefileは、MinGWで提供されるuname.exeを使用してOSをプローブしようとします。

MinGWシェル(sh.exe)を実行すると、unameを呼び出すことができます。Windowsコマンドプロンプトを開くと、unameを呼び出すことができます(したがって、%PATH%変数と$ PATH変数が正しく設定されています)。

このコードは、system( "uname -s> \ tempfilneame&2> 1")のようなものを内部的に呼び出します。主な問題は、(FileMonの出力を分析したところ)アプリケーション(sh.exe)がcmd.exeプロセスを作成し、コマンドを実行したが、unameが見つからないことです。システム( "d:/.../ bin / uname -s> \ tempfilename&2> 1")をコードに追加すると、すべて正常に機能します。したがって、PATH変数に問題があるはずです。必要がなければ、コード内のすべての呼び出しを変更することはありません。問題は、開始されたcmd.exeプロセスの何が特別で、unameを認識しないのか、そしてこの問題をどのように解決できるのかということです。

4

1 に答える 1

2

Msysの目的は、プログラム、コマンド、およびシェルスクリプトを「*」のように実行するための最小限の準「* nix」(つまり、非POSIX)Bourne Shell(「* nix」コマンドラインインタープリター)を提供することです。 nix」システム(http://www.mingw.org/を参照)。何らかの理由で、MSWindowsコマンドラインインタープリター(cmd.exe)からMinGW/binおよびMsys/1.0 / bin実行可能ファイルを実行する場合は、MS Windows環境の%PATH%変数にこれら2つの「bin」へのパスを含める必要があります。 "サブディレクトリ-"。;C:\ MinGW \ bin; C:\ MinGW \ msys \ 1.0 \ bin;%PATH%"など。

以下の情報は、MinGWが提供するGCC 4.6.2コンパイラスイートを使用して、msys.batで呼び出されたMsyssh.exe内からATLASライブラリを構築することを厳密に示しています。

Msys $ PATH環境変数に「。:MinGWおよびMsys binディレクトリへのパス」が含まれていることを確認します。つまり、「。:/ C / MinGW / bin:/ C / MinGW / msys / 1.0 / bin:$PATH」の場合ここにMinGWとMsysをインストールしました(これは、\ msys \ 1.0 \ msys.batファイルのように、shログインが発生したときに/ etc / profileスクリプトによって実行する必要があります)。

system()関数を使用してシェルコマンドまたは実行可能ファイル(「make」以外)を呼び出すATLASプログラムステートメントには、次の変更を加える必要があります。

1)MS Windows cmd.exeシェル(より正確には、呼び出されたMS Windowsシステムライブラリルーチン)が「./executable」を実行可能ファイルとして解釈するため、「。/executable」を「。\\executable」または「executable」に変更します。 。 ' コマンドオプション「/executable」を使用すると、エラーメッセージ「」が表示されます。内部または外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されません。」問題のあるsystem()呼び出しを見つけるために、必ず「-v2」を指定してATLAS/configureを呼び出してください。

ATLAS/bin/atlas_install.c
ATLAS/CONFIG/src/atlbench.c
ATLAS/CONFIG/src/config.c
ATLAS/tune/blas/gemm/userindex.c
ATLAS/tune/blas/ger/r1search.c
ATLAS/tune/sysinfo/emit_buildinfo.c

2)MS Windows cmd.exeは「;」を使用した複合コマンドステートメントを受け入れないため、「command;command」を「command&&command」に変更します。他の「*nix」シェルまたは「make」のようにセパレータ。

3)system()呼び出しに渡されるコマンドのsprintf()ステートメントで、単一引用符の出現箇所を文字列形式指定子を区切る二重引用符に置き換えます。特にATLAS/CONFIG / src/config.cファイルのSpewItForth関数で。たとえば、「...'%s'...」を「...\ "%s\"...」に変更します。これは、system()呼び出しで呼び出される「make」コマンドには必要ありません。MS Windows cmd.exeシェルはCRLFの行末終了を想定しているため、ATLAS / bin/atlas_install.cファイルとATLAS/tune / sysinfo/emit_buildinfo.cファイルに次の変更を加える必要があります。

ATLAS / bin / atlas_install.cの133行目:

    if ( (sp == NULL) || (str[0] == '\0') || (str[0] == '\n') )

に:

    if ( (sp == NULL) || (str[0] == '\0') || (str[0] == '\r') || (str[0] == '\n') )

165行目:

    else if (ln[0] == '\0' || ln[0] == '\n') ch=def;

に:

    else if (ln[0] == '\0' || ln[0] == '\r' || ln[0] == '\n') ch=def;

175行目:

    else if (ln[0] == '\0' || ln[0] == '\n') ch=def;

に:

    else if (ln[0] == '\0' || ln[0] == '\r' || ln[0] == '\n') ch=def;

ATLAS / tune / sysinfo / emit_buildinfo.cの66行目:

    for (i=0; ln[i]; i++) if (ln[i] == '"' || ln[i] == '`') ln[i] = '\'';

に:

    for (i=0; ln[i]; i++) if (ln[i] == '"' || ln[i] == '`') ln[i] = '\"';

行68から:

    for (i--; i >= 0 && (ln[i] == ' ' || ln[i] == '\n' || ln[i] == '\t'); i--);

に:

    for (i--; i >= 0 && (ln[i] == ' ' || ln[i] == '\r' || ln[i] == '\n' || ln[i] == '\t'); i--);

また、ATLAS / tune / sysinfo / emit_buildinfo.cファイルで、次を変更します。

  if (CommandOneLine("date",DATE)) strcpy(DATE, "UNKNOWN");

に:

  if (CommandOneLine("date /t",DATE)) strcpy(DATE, "UNKNOWN");

MS Windowscmd.exeの「date」コマンドは「Enterthenewdate:(mm-dd-yy)」というプロンプトを表示し、決して入力されない応答を待つためです。

影響を受ける各ファイルに上記の変更を加えましたが、基本的なソフトウェアエンジニアリングと構成管理の原則を順守することで、重複するコードを、何らかの形式の「#if defined(ATL_OS_WinNT)&& defined(__ MINGW32__)」処理ディレクティブでラップされた単一のプロシージャに統合する必要があります。変更が他の「*nix」オペレーティングシステムへのATLASのインストールに悪影響を与えないようにしてください。この点で、「パッチ」アプローチを使用してMinGW32固有の変更をATLASディストリビューションに組み込むことはお勧めしませんが、必要な変更を最新のATLAS開発バージョンにマージします。もちろん、「パッチ適用」は、サポートされていないATLASリリースを修正するための唯一の代替手段である可能性があります。

過去数日間、MinGW、Msys、および以下からダウンロードしたGCC 4.6.2コンパイラスイートを使用して、調整されたATLAS3.8.4静的ライブラリを構築することができました。

http://sourceforge.net/projects/mingw/files/

デュアルIntelXeonを搭載した11年前のDellWorkstation530にmingw-get-inst-20111118.exeをインストール(MMX、SSE、SSE2を搭載したPentium 4[L1キャッシュ8Kバイト、L2キャッシュ256 Kバイト]、ハイパースレッディングなし)1.5 GHzプロセッサ、400 MHz FSB、およびWindows 2000ProfessionalSP4を実行する1024MバイトのRDRAM。

上記の変更は包括的ではありませんが、さらに進んでいく必要があります。ATLAS 3.8.4ディストリビューションへのすべての変更を文書化し、調整した構成を確認した後、 http: //sourceforge.net/projects/math-atlas/forums/の「ATLASonWindows」フォーラムに投稿する予定です。LAPACK-3.4.0を使用して完全な共有ライブラリビルドを実行します。

この情報が、WindowsプラットフォームでMinGWを使用し、Cygwinを使用せずにATLASビルドを試みるあなたや他の人に役立つことを願っています。

特記事項:

tmpnam()の呼び出しから取得した一時ファイル名に出力を送信するコマンドを使用してsystem()を呼び出すと、現在のドライブのルートディレクトリに一時ファイルが作成されます。一時ファイル名には、MinGW / include / stdio.hで定義されている「\\」というプレフィックスが付いています(P_tmpdirを参照)。

重要な補遺:

(A)ATLAS /configureの「-s」および「-b」コマンドオプションを使用してソースおよびビルドディレクトリを指定するときは、必ずフルパス名を使用してください。私の場合、次のshスクリプトは、ATLAS_buildからATLAS/configureを呼び出す方法を示しています。

#!/bin/sh

SRCDIR=/g/Progs/MinGW/msys/1.0/home/GaryD/temp/ATLAS
BLDDIR=/g/Progs/MinGW/msys/1.0/home/GaryD/temp/ATLAS_build
LAPACK=/g/Progs/MinGW/lib/gcc/mingw32/4.6.2/liblapack.dll.a

CC=gcc
C_DEFS="-D c -DL2SIZE=262144"  # Not used, set using -f 256
F_DEFS="-D f ''"               # Not used, let configure set these
C_FLGS="--cc=$CC --with-netlib-lapack=$LAPACK"
D_FLGS="-d s $SRCDIR -d b $BLDDIR"
A_FLGS="-O 8 -s 1 -A 20 -V 8 -b 32 -f 256 -t 2 -m 1495"
S_FLGS="-Si bozol1 1 -Si archdef 0 -Si cputhrchk 0"

$SRCDIR/configure $C_FLGS -v 2 $D_FLGS $A_FLGS $S_FLGS

(B)ファイル../../CONFIG/error.txtはATLAS / bin /で見つけることができない可能性があるため、優先ビルドディレクトリはATLAS/ATLAS_buildなどのATLASソースディレクトリの下のサブディレクトリであると想定されていると思います。ソースディレクトリとビルドディレクトリが同じレベルにある場合は、atlas_install.c。

(C)'-m####'構成オプションが暗黙的に'-D c DPentiumCPS=####'構成フラグを作成すると仮定したときに私が犯した間違いをしないでください。「ATLASインストールガイド」のセクション3.4「ATLASのタイミングの変更」に記載されているように、「-D c -DPentiumCPS=####」または「-Dc-DWALL」を明示的に渡す必要がある場合があります。ここで見る:

http://math-atlas.sourceforge.net/atlas_install/atlas_install.html#SECTION00044000000000000000

サイクル精度の高いウォールタイマーを使用しないことにより、「xsslvtst.exe -n 167 -r 83 -O 2 cr -U 2 u l」などの健全性テストの結果は、次のようになります。

    ORD  UPLO       N    NRHS     lda     ldb       TIME     MFLOP        RESID
    ===  ====  ======  ======  ======  ======  =========  ========  ===========

      C     U     167      83     167     167      0.015    257.82  1.762022e-003
      C     L     167      83     167     167      0.016    241.70  1.870298e-003
      R     U     167      83     167     167      0.000 2229332063710638100.00  1.870298e-003
      R     L     167      83     167     167      0.000 2229332063710638100.00  1.762022e-003

    4 TESTS RUN, ALL PASSED.

テストを呼び出すたびに、MFLOPに対して異なるスプリアス値が生成されました。これは、非常に非常に小さい非ゼロ値による算術除算の結果である可能性があります。'-D c -DWALL'を使用してATLASを再構築した後、これらのMFLOP結果(および間違いなく他のタイミング測定値)が修正されました。

(D)ATLAS / CONFIG / src / probe_OS.cの35行目では、次のようにMinGWをチェックする必要があります。

else if(strstr(ln, "WIN") || strstr(ln, "MINGW"))

ATLAS / CONFIG / src / Makefileの「IRunArchInfo_linux:xarchinfo_linux」ブロックの後に以下を挿入します(MakefileのIRunArchInfo_linuxブロックを切り取り、貼り付け、編集するだけです)。

IRunArchInfo_winnt: xarchinfo_x86
    - rm -f config0.out
    $(MAKE) $(atlrun) atldir=$(mydir) exe=xarchinfo_x86 args="$(args)" \
            redir=config0.out
    - cat config0.out

(E)MinGW gcc実行可能ファイルはgcc.exeであり、この最新バージョンのgcc-4.exeではないため、ATLAS / CONFIG / src/atlconf.txtファイルでgcc-4行をgccのみに変更する必要がある場合があります。 MinGW32gccコンパイラスイート。コンパイラの選択を上書きし、コンパイルフラグを変更/追加するための構成フラグの使用は、ATLAS開発者によるatlconf.txtファイル(「ATLASインストールガイド」のセクション3.2を参照)の編集よりもおそらく好まれます。でも焦りました。

(F)私のアーキテクチャのように「-V8」ATLAS / configureオプションでSSE2を指定する場合、ATLAS / include/atlas_asm.hファイルに次の変更を加える必要があります。

133行目:

    #if defined(ATL_SSE1) && !defined(ATL_3DNow)

に:

    #if (defined(ATL_SSE1) || defined(ATL_SSE2)) && !defined(ATL_3DNow)

于 2012-03-25T07:01:08.700 に答える