Hangi bayrakları -march = native etkinleştirir?


165

GCC 4.3 kullanarak C ++ uygulamamı derliyorum. Kullandığım optimizasyon bayraklarını manuel olarak seçmek yerine, -march=nativeteoride derlediğim donanıma uygulanabilir tüm optimizasyon bayraklarını eklemesi gerekir. Ancak hangi bayrakları kullandığını nasıl kontrol edebilirim?

Yanıtlar:


150

-Q --help=targetSeçenekleri kullanabilirsiniz :

gcc -march=native -Q --help=target ...

-vSeçeneği de yarayabilir.

Buradaki--help seçenekle ilgili belgeleri görebilirsiniz .


10
Bunun yetersiz olduğunu söyleyeceğim. --Help = target çıktısı, hem elias hem de 42n4 yöntemlerinin listelediği CPU önbellek bilgilerini görüntülemez. Özellikle, bir Phenom üzerinde gcc 4.9.2, çıktı şunları içerir:--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512
Daniel Santos

@DanielSantos: sistemimde bu parametreleri komut satırının bir -vparçası olsa da seçenekle görüntülüyor cc1...
thkala

mükemmel değil. gcc sürüm 5.4.0'da (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) karşılığında hataya neden olur: Birleştirici iletileri: Hata: bilinmeyen mimari yerel Hata: tanınmayan seçenek -march = native. Yani, gevşek -march=nativeve sadece aşağıdaki her yerde çalışır: gcc -Q --help=target.
Oleg Kokorin

@Oleg - GCC 5'te bir hata gibi görünüyor. Sorun GCC 7'de mevcut değil.
jww

111

Komut satırı bayraklarını görmek için şunu kullanın:

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1

Derleyici / ön derleyici tanımlarının belirli parametreler tarafından ayarlandığını görmek istiyorsanız, bunu yapın:

echo | gcc -dM -E - -march=native

1
Bu cevap, özellikle nativegerçekten neye eşit olduğunu listelemek için kabul edilen kadar çok oyu hak ediyor .
Iwillnotexist Idonotexist

4
çapraz-yerli-derlemek istiyorsanız, ben hem derleyici hem tanımları VE bağımsız değişkenleri beslemek gerekir? ya da argümanlar yeterli mi?
hanshenrik

25

Olmalı ( -###buna benzer -v):

echo | gcc -### -E - -march=native 

Gcc için "gerçek" yerel bayrakları göstermek için.

Bir komutla daha "açık" görünmelerini sağlayabilirsiniz:

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )//g'

ve -mno- * ile bayraklardan kurtulabilirsiniz:

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )|( -mno-[^\ ]+)//g'

10

Yerel olmayan bir çapraz derlemeyi nasıl kuracağınızı öğrenmek istiyorsanız, bunu yararlı buldum:

Hedef makinede,

% gcc -march=native -Q --help=target | grep march
-march=                               core-avx-i

Sonra bunu yapı makinesinde kullanın:

% gcc -march=core-avx-i ...

Bu maalesef tüm bayrakları içermeyecek.
Baptiste Wicht

@BaptisteWicht -march = native'nin -march = core-avx-i'nin bu durumda içermeyeceği veya hangi bayrakları içermeyeceği bayraklar var? Teşekkürler!
rogerdpack

2
@rogerdpack Bu bilgisayarda (sandybridge) mart = sandybridge AVX'yi etkinleştirmiyor (neden bilmiyorum) mart = native bunu yapıyor. Bir diğer önemli fark, önbellek boyutlarının yalnızca mart = native ile özütlenmesidir
Baptiste Wicht

1
@BaptisteWicht burada çalışıyor gibi görünüyor (sanırım): echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1ama önbellek boyutları yok gibi görünüyor.
rogerdpack

7

İki sentimi bu soruya atacağım ve elias'ın cevabının biraz daha ayrıntılı bir uzantısını önereceğim. Gcc 4.6 itibariyle, gcc -march=native -v -E - < /dev/nullgereksiz -mno-*bayraklar şeklinde artan miktarda spam yayar . Aşağıdakiler bunları kesecektir:

gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'

Ancak, bunun sadece iki farklı CPU'da (Intel Core2 ve AMD Phenom) doğruluğunu doğruladım, bu yüzden bu -mno-*bayrakların hepsinin güvenli bir şekilde çıkarılabileceğinden emin olmak için aşağıdaki komut dosyasını çalıştırmanızı da öneriyorum .

#!/bin/bash

gcc_cmd="gcc"

# Optionally supply path to gcc as first argument
if (($#)); then
    gcc_cmd="$1"
fi

with_mno=$(
    "${gcc_cmd}" -march=native -mtune=native -v -E - < /dev/null 2>&1 |
    grep cc1 |
    perl -pe 's/^.* - //g;'
)
without_mno=$(echo "${with_mno}" | perl -pe 's/ -mno-\S+//g;')

"${gcc_cmd}" ${with_mno}    -dM -E - < /dev/null > /tmp/gcctest.a.$$
"${gcc_cmd}" ${without_mno} -dM -E - < /dev/null > /tmp/gcctest.b.$$

if diff -u /tmp/gcctest.{a,b}.$$; then
    echo "Safe to strip -mno-* options."
else
    echo
    echo "WARNING! Some -mno-* options are needed!"
    exit 1
fi

rm /tmp/gcctest.{a,b}.$$

Alıntı yapılan bazı parametreler - ve özel karakter içermeyen parametreler arasında gcc -march=native -v -E - < /dev/nullve gcc -march=native -### -E - < /dev/nulldışında bir fark bulamadım , bu nedenle hangi koşullar altında gerçek bir fark yarattığından emin değilim.

Son olarak, --march=nativegcc 4.2'de tanıtıldığını, bundan önce sadece tanınmayan bir argüman olduğunu unutmayın.


Güzel, bu gleans de önbellek boyutlarına sahip
rogerdpack

gcc sürüm 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) döndürür: Hata: bilinmeyen mimari `` doğal ''
Oleg Kokorin

Oleg: Hangi kemeri kullanıyorsun? "Yerli" yalnızca bazı mimarilerde desteklenmiş olabilir.
Daniel Santos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.