2015-02-07 2 views
0

Я пытаюсь выполнить двоичный файл на сопроцессоре xeon phi, и он возвращается с «bash: не может выполнить двоичный файл». Поэтому я пытаюсь найти, как либо просмотреть журнал ошибок, либо показать, что происходит, когда я говорю ему выполнить, что вызывает его неработоспособность. Я уже пробовал bash --verbose, но он не отображал никакой дополнительной информации. Есть идеи?Xeon Phi не может выполнить двоичный файл

+1

Обычно это означает, что исполняемый файл был скомпилирован для несовместимой операционной системы. 'bash --verbose' не помогает, потому что это ядро ​​определяет, может ли он что-то выполнить, а не bash. – Barmar

+0

Попробуйте использовать команду 'file' для проверки программы. – Barmar

+0

при использовании команды 'file' выдает следующее: ' ELF 64-разрядный исполняемый файл LSB, x86-64, версия 1 (GNU/Linux), динамически связанный (использует общие библиотеки), для GNU/Linux 2.6.24, BuildID [sha1] = 0x5716658b4548777cfbbac018225dee322b261efe, not stripped' – Eric

ответ

1

Update: Что ниже не отвечает на вопрос, что ОП в - это один возможное объяснение ошибки cannot execute binary file, но тот факт, что сообщение об ошибке с префиксом bash: указывает, что двоичный файл является вызывается правильно (by bash), но является несовместимым с исполняемой платформой (скомпилирован для другой архитектуры) - как @Barmar уже заявил в комментарии.

Таким образом, в то время как следующее содержит некоторую (надеюсь, еще несколько полезную) общую информацию, она не затрагивает проблему OP.


Один Возможной причиной cannot execute binary file является ошибочно передать двоичный (исполняемый) файл - вместо сценария оболочки (текст файл, содержащий код оболочки) - как операнд (аргумент имени файла) в bash.

Следующая демонстрирует проблему:

bash printf # fails with '/usr/bin/printf: /usr/bin/printf: cannot execute binary file' 

Обратите внимание, как путь в ошибке Пройдена двоичном в префиксов сообщение об ошибке дважды; Если первый префикс говорит bash:, причина, скорее всего, не является проблемой неправильного вызова, но один из попыток вызвать несовместимый двоичный (скомпилированный для другой архитектуры).

Если вы хотите Баш ссылаться на двоичный код, вы должны использовать опцию -c передать его, что позволяет указать всю командную строку; то есть двоичный плюс аргументы; например:

bash -c '/usr/bin/printf "%s\n" "hello"' # -> 'hello' 

Если передать простого бинарного файла вместо полного пути - например -c 'program ...' - тот бинарный под этим именем должен существовать в одном из каталогов перечисленных в $PATH переменной что bash видит, в противном случае вы получите ошибку command not found.

Если, напротив, двоичный расположен в текущего каталога, необходимо предварить имя файла с ./ для Баша, чтобы найти его; например-c './program ...'

+0

Я пробовал это: ' [root @ Xeon-Phi-mic0 src] # bash -c ' program'' и получил 'bash: program: command not found' Может ли это быть чем-то конкретным для xeon phi или я просто неправильно понял вас? – Eric

+0

@ Эрик: Это означает, что 'program' не находится в вашей' $ PATH' - см. Мое обновление. – mklement0

+0

Я выполняю из каталога, в котором находится двоичный файл, поэтому у меня нет пути – Eric

2

Вы не указываете, где вы скомпилировали исполняемый файл и где вы пытались выполнить. Для компиляции программы на хост-системе должна быть выполнена непосредственно на сопроцессора, вы должны либо:

  • при использовании один из составителей Intel, добавьте -mmic в компилятор командной строки
  • при использовании GCC , использовать кросс-компилятор, поставляемые с MPSS (/usr/linux-k1om-4.7) - отмечает, однако, что GCC компилятор не воспользоваться векторизациями на сопроцессоре

Если вы хотите скомпилируйте непосредственно на сопроцессоре, вы можете установить необходимые файлы из дополнительных файлов rpm, предоставленных для сопроцессора (найдены в mpss-/k1om), используя указания из руководства пользователя MPSS для установки дополнительных файлов rpm. Для запуска программы на сопроцессоре, если вы собрали его на хосте, вы должны либо:

  • скопировать исполняемый файл и необходимые библиотеки для сопроцессора с помощью УПП, прежде чем SSH к сопроцессору себя, чтобы выполнить код .
  • используйте команду micnativeloadex на хосте - вы можете найти справочную страницу для этого на хосте.

Если вы пишете программу, используя модель выгрузки (часть работы выполняются с помощью узла, то часть работы передается от до сопроцессора), вы можете скомпилировать на хосте с использованием компиляторов Intel с нет специальных вариантов. Обратите внимание, что независимо от того, какой метод вы используете, любые библиотеки, которые будут использоваться с исполняемым файлом для сопроцессора, должны быть созданы для сопроцессора. Библиотеки по умолчанию существуют, но любые библиотеки, которые вы добавляете, вам нужно создать версию для сопроцессора в дополнение к любой версии, которую вы делаете для хост-системы. Я очень рекомендую статьи, которые вы найдете под https://software.intel.com/en-us/articles/programming-and-compiling-for-intel-many-integrated-core-architecture. Эти статьи написаны людьми, которые разрабатывают и/или поддерживают различные инструменты программирования для сопроцессора и должны отвечать на большинство ваших вопросов.

Смежные вопросы