Компиляция для конкретной машины на другой машине - PullRequest
0 голосов
/ 25 сентября 2018

Это может быть на самом деле смешной вопрос, но в компиляторах / компиляции столько всего, что я не понимаю.Мне известны концепции кросс-компиляции, кросс-нативной компиляции и т. Д. Однако я не знаю, что применимо к моему сценарию:

Я хочу сделать следующее.

Допустим, у меня есть два компьютера с различным оборудованием: A и B .

Предположим, что единственное сходство между A и B Я точно знаю:

  1. Оба имеют некоторый процессор Intel, способный к 64-разрядным вычислениям.
  2. Оба работают под управлением Windows 10 и, таким образом, могут получить доступ к Linuxдругими способами (например, WSL).
  3. Оба A и B имеют все программы, необходимые для компиляции (произвольного) кода.

Предположим, что у меня также есть административный доступ к A (то есть я могу делать / запускать / устанавливать все, что захочу / на него).Это , а не в случае B .

. Кроме того, (это может быть неактуально), к A можно получить физический доступ (и удаленно).если необходимо). B можно только получить удаленный доступ (через SSH, RDP и т. Д.)


Теперь скажите, что я хочу скомпилировать какой-нибудь произвольно сложный код C / C ++ оптимизировано специально для аппаратного обеспечения на A с некоторым компилятором.Например, я считаю, что -march=native может достичь этого, если я использую gcc на A .

Однако, скажем, A является особенным, и его вычислительная мощность не может быть «потрачена впустую» при компиляции, поскольку у него есть более важные задачи.Другими словами, я не хочу пройти через процесс компиляции, требующий много времени и энергии on A .

Вместо этого я хочу сделать эту компиляцию для A на B .

Как получить конечный результатэквивалентно "-march=native" выполненной компиляции для A (, если используется gcc)?Другими словами, как я могу скомпилировать код на B , оптимизированный точно для аппаратного обеспечения на A ?

Дляgcc, это просто, как найти эквивалентные флаги для -march=native на A , чтобы затем выполнить execute на B ?Если да, есть ли способ упростить этот процесс, а если нет, как это можно сделать (если вообще?).

Может ли процесс выполняться с помощью компиляторов, отличных от gcc (а именно компиляторы Visual C ++ и Intel C ++)?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Компилятор Intel можно использовать для генерации исполняемых файлов, предназначенных для других архитектур, либо с помощью параметра, совместимого с GCC, который является параметром -march, либо для параметра ICC, который имеет значение -x.Эти опции задокументированы в https://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-x-qx и https://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-march.

0 голосов
/ 26 сентября 2018

Предполагая, что вы знаете архитектуру сервера назначения (в вашем случае A), просто передайте его gcc на B как -march.

Пример

Архитектура - это skylake

поэтому для B используйте

gcc -march=skylake ..... (rest of the flags)

, если A - ryzen

gcc -march=znver1 ..... (rest of the flags)

, а затем копируйте файлы из B в A.

...