Цель Msys - предоставить минимальный квази - "* nix" (т. Е. Не POSIX) Bourne Shell (интерпретатор командной строки "* nix"), в котором можно выполнять программы, команды и сценарии оболочки, как будто на система "* nix" (см. http://www.mingw.org/). Если по какой-либо причине желательно запускать исполняемые файлы MinGW / bin и Msys / 1.0 / bin из интерпретатора командной строки MS Windows (cmd .exe), переменная% PATH% среды MS Windows должна содержать пути к этим двум подкаталогам bin, таким как ".; C: \ MinGW \ bin; C: \ MinGW \ msys \ 1.0 \ bin;% PATH %».
Следующая информация относится строго к созданию библиотек ATLAS из Msys sh.exe, вызываемого с помощью msys.bat с использованием набора компиляторов GCC 4.6.2, предоставляемого MinGW.
Убедитесь, что переменная среды Msys $ PATH содержит ".: Путь к каталогам bin MinGW и Msys" - т.е. ".: / C / MinGW / bin: /C/MinGW/msys/1.0/bin: $ PATH ", если вы установили MinGW и Msys (это должно быть выполнено сценарием / etc / profile при входе в систему sh, например, файлом \ msys \ 1.0 \ msys.bat).
Следующие изменения должны быть внесены в любой оператор программы ATLAS, который вызывает команду оболочки или исполняемый файл (кроме «make») с использованием функции system ():
1) Измените «./executable» на «. \\ исполняемый файл» или «исполняемый файл», поскольку оболочка cmd.exe в MS Windows (или, вернее, вызываемые процедуры системной библиотеки MS Windows) интерпретирует «./executable» как исполняемый файл "." с параметром команды «/ исполняемый файл», таким образом, сообщение об ошибке: «». не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл. " Обязательно вызовите ATLAS / configure с помощью «-v 2», чтобы найти любые вызывающие вызовы system () - их всего несколько !!!
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 не принимает составные операторы команды, использующие «;» разделитель, как в других оболочках "* nix" или "make".
3) Заменить любое вхождение одинарных кавычек на двойные кавычки, разделяющие спецификаторы формата строки в операторах sprintf () для команд, передаваемых вызовам system (); особенно в функции SpewItForth файла ATLAS / CONFIG / src / config.c. Например, измените "... '% s' ..." на "... \"% s \ "...". Это не требуется для команд «make», вызываемых с помощью вызовов system (). Поскольку оболочка 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 Windows cmd.exe «date» предложит «Введите новую дату: (mm-dd-yy)» и дождитесь ответа, который никогда не будет введен.
Несмотря на то, что я внес вышеупомянутые изменения в каждый затронутый файл, соблюдение базовых принципов разработки программного обеспечения и управления конфигурацией потребовало бы объединения дублирующегося кода в отдельные процедуры, заключенные в некоторую форму «#iffined (ATL_OS_WinNT) && определено (__ MINGW32__)» директива по обработке, предотвращающая негативное влияние изменений на установку ATLAS в других операционных системах "* nix". В связи с этим я не рекомендовал бы использовать подход «патча» для включения специфических изменений MinGW32 в дистрибутив ATLAS, но включал необходимые изменения в последнюю версию разработки ATLAS. Конечно, «исправление» может быть единственной альтернативой исправлению неподдерживаемых выпусков ATLAS.
За последние несколько дней мне удалось создать настроенные статические библиотеки ATLAS 3.8.4 с MinGW, Msys и набором компиляторов GCC 4.6.2, загруженным из:
http://sourceforge.net/projects/mingw/files/
и устанавливается вместе с mingw-get-inst-20111118.exe на 11-летнюю рабочую станцию Dell 530 с двумя процессорами Intel Xeon (Pentium 4 с MMX, SSE и SSE2 [кэш-память первого уровня 8 КБ, кэш-память второго уровня 256 КБ], но без Hyperthreading) 1.5Процессоры ГГц, 400 МГц FSB и 1024 МБ RDRAM под управлением Windows 2000 Professional SP4.
Вышеуказанные модификации не являются исчерпывающими, но помогут вам продвинуться дальше.Я планирую задокументировать все свои изменения в дистрибутиве ATLAS 3.8.4 и опубликовать его на форуме «ATLAS в Windows» по адресу http://sourceforge.net/projects/math-atlas/forums/ после того, как я проверил свою настроенную конфигурацию и выполнил полную сборку общей библиотеки с использованием LAPACK3.4.0.
Надеюсь, эта информация будет полезна вам и другим, кто пытается построить ATLAS с MinGW и без Cygwin, на платформе Windows.
СПЕЦИАЛЬНОЕ ПРИМЕЧАНИЕ:
Вызовы system () с командами, направляющими вывод во временное имя файла, полученное в результате обращения к tmpnam (), приведут к созданию временных файлов в корневом каталоге текущего диска.Временные имена файлов имеют префикс «\\», который определяется в MinGW / include / stdio.h (см. P_tmpdir).
ВАЖНОЕ ДОБАВЛЕНИЕ:
(A) Обязательно используйтеполные пути при указании каталогов источника и сборки с использованием параметров команды '-s' и '-b' для ATLAS / configure.В моем случае следующий скрипт sh показывает, как я вызывал ATLAS / configure из ATLAS_build:
#!/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) Я считаю, что предпочтительным каталогом сборки считается подкаталог в исходном каталоге ATLAS, такой какATLAS / ATLAS_build, так как файл ../../CONFIG/error.txt не может быть найден ATLAS / bin / atlas_install.c, если исходный каталог и каталог сборки находятся на одном уровне.
(C) Не делайте ошибку, которую я сделал, предполагая, что опция конфигурации '-m ####' неявно создает флаг конфигурации '-D c DPentiumCPS = ####'.Вам может понадобиться явно передать '-D c -DPentiumCPS = ####' или '-D c -DWALL', как описано в разделе 3.4, «Изменение способа синхронизации времени в ATLAS», «Руководства по установке ATLAS», которое можетможно посмотреть здесь:
http://math -atlas.sourceforge.net / atlas_install / atlas_install.html # SECTION00044000000000000000
Если не использовать точный цикл настенного таймера, результатыиз проверок работоспособности, таких как "xsslvtst.exe -n 167 -r 83 -O 2 cr -U 2 ul", выглядел следующим образом:
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, возможно, в результате арифметического деления на очень, очень, очень маленькое ненулевое значение.После перестройки ATLAS с использованием -D c -DWALL эти результаты MFLOP (и, без сомнения, другие временные меры) были исправлены.
(D) Строка 35 ATLAS / CONFIG / src / probe_OS.c нуждается в проверкедля MinGW как это:
else if(strstr(ln, "WIN") || strstr(ln, "MINGW"))
и вставьте следующее после блока «IRunArchInfo_linux: xarchinfo_linux» в файле ATLAS / CONFIG / src / Makefile (просто вырезайте, вставляйте и редактируйте блок IRunArchInfo_linux в файле Makefile):
IRunArchInfo_winnt: xarchinfo_x86
- rm -f config0.out
$(MAKE) $(atlrun) atldir=$(mydir) exe=xarchinfo_x86 args="$(args)" \
redir=config0.out
- cat config0.out
(E) Возможно, потребуется изменить строки gcc-4 на gcc в файле ATLAS / CONFIG / src / atlconf.txt, поскольку исполняемый файл MinGW gcc - это просто gcc.exe, а не gcc-4.exe для этой последней версии пакета компилятора gcc MinGW32.Использование флагов конфигурации для переопределения выбора компилятора и изменения / добавления флагов компиляции, вероятно, предпочтительнее, чем редактирование файла atlconf.txt (см. Раздел 3.2 «Руководства по установке ATLAS») разработчиками ATLAS;но я был нетерпелив.
(F) Если вы укажете SSE2 с опцией '-V 8' ATLAS / configure, как для моей архитектуры, в файл ATLAS / include / atlas_asm.h необходимо внести следующее изменение.
Строка 133 от:
#if defined(ATL_SSE1) && !defined(ATL_3DNow)
до:
#if (defined(ATL_SSE1) || defined(ATL_SSE2)) && !defined(ATL_3DNow)
atlas-win32 mingw32 msys