Bagaimana cara melihat flag -march = asli mana yang akan diaktifkan?

165

Saya mengkompilasi aplikasi C ++ saya menggunakan GCC 4.3. Alih-alih memilih secara manual flag optimasi yang saya gunakan -march=native, yang secara teori harus menambahkan semua flag optimisasi yang berlaku untuk perangkat keras yang saya kompilasi. Tetapi bagaimana saya bisa memeriksa flag mana yang sebenarnya digunakan?

vartec
sumber

Jawaban:

150

Anda dapat menggunakan -Q --help=targetopsi:

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

The -vpilihan juga mungkin digunakan.

Anda dapat melihat dokumentasi pada --helpopsi di sini .

thkala
sumber
10
Saya akan menyarankan bahwa ini adalah suboptimal. Output dari --help = target tidak menampilkan informasi cache CPU, di mana metode elias dan 42n4 di bawah ini telah terdaftar. Secara khusus, pada gcc 4.9.2 pada Phenom, output meliputi ini:--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512
Daniel Santos
@DanielSantos: pada sistem saya ia menampilkan parameter-parameter itu dengan -vopsi, meskipun sebagai bagian dari cc1baris perintah ...
thkala
tidak sempurna. pada versi gcc 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) itu akan menyebabkan kesalahan sebagai balasannya: Pesan assembler: Kesalahan: arsitektur asli tidak diketahui Kesalahan: opsi yang tidak dikenali -march = asli. Jadi, longgar -march=nativedan akan bekerja di mana-mana hanya mengikuti: gcc -Q --help=target.
Oleg Kokorin
@Oleg - Kedengarannya seperti bug di GCC 5. Masalahnya tidak ada di GCC 7.
jww
111

Untuk melihat bendera baris perintah, gunakan:

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

Jika Anda ingin melihat definisi compiler / precompiler yang ditetapkan oleh parameter tertentu, lakukan ini:

echo | gcc -dM -E - -march=native
elias
sumber
1
Jawaban ini layak mendapatkan banyak upvotes dari yang diterima untuk, khususnya, mendaftar apa yang nativesebenarnya sama dengan.
Iwillnotexist Idonotexist
4
jadi jika saya ingin melakukan cross-native-compile, saya harus memberi makan kedua kompiler, baik mendefinisikan DAN argumen? atau adakah argumen yang memadai?
hanshenrik
25

Seharusnya ( -###mirip dengan -v):

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

Untuk menampilkan bendera asli "asli" untuk gcc.

Anda dapat membuatnya tampak lebih "jelas" dengan perintah:

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

dan Anda dapat menyingkirkan flag dengan -mno- * dengan:

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

Jika Anda ingin mengetahui cara mengatur kompilasi lintas non-asli, saya menemukan ini berguna:

Di mesin target,

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

Kemudian gunakan ini pada mesin build:

% gcc -march=core-avx-i ...
Mark Lakata
sumber
Sayangnya, ini tidak mencakup semua bendera.
Baptiste Wicht
@BaptisteWicht apakah ada flag yang -march = asli akan menyertakan -march = core-avx-i tidak akan, dalam hal ini, atau flag yang mana? Terima kasih!
rogerdpack
2
@rogerdpack Di komputer ini (sandybridge), march = sandybridge tidak mengaktifkan AVX (tidak tahu mengapa) sementara march = asli tidak. Perbedaan penting lainnya adalah bahwa ukuran cache hanya diekstraksi dengan march = asli
Baptiste Wicht
1
@BaptisteWicht yang aneh sepertinya berfungsi di sini (saya kira): echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1tetapi ukuran cache sepertinya tidak ada.
rogerdpack
7

Saya akan melemparkan dua sen saya ke pertanyaan ini dan menyarankan perpanjangan jawaban elias yang sedikit lebih verbal. Pada gcc 4.6, menjalankan gcc -march=native -v -E - < /dev/nullmemancarkan jumlah spam yang meningkat dalam bentuk -mno-*bendera berlebihan . Berikut ini akan menghapus ini:

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

Namun, saya hanya memverifikasi kebenaran ini pada dua CPU yang berbeda (Intel Core2 dan AMD Phenom), jadi saya sarankan juga menjalankan skrip berikut untuk memastikan bahwa semua -mno-*bendera ini dapat dilucuti dengan aman.

#!/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}.$$

Saya belum menemukan perbedaan antara gcc -march=native -v -E - < /dev/nulldan gcc -march=native -### -E - < /dev/nullselain beberapa parameter yang dikutip - dan parameter yang tidak mengandung karakter khusus, jadi saya tidak yakin dalam keadaan apa ini membuat perbedaan nyata.

Akhirnya, perhatikan itu --march=native diperkenalkan di gcc 4.2, yang sebelumnya hanya merupakan argumen yang tidak diakui.

Daniel Santos
sumber
Bagus, gleans ini memiliki ukuran cache juga
rogerdpack
gcc versi 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) mengembalikan: Kesalahan: arsitektur tidak dikenal `asli '
Oleg Kokorin
Oleg: Lengkungan apa yang Anda gunakan? Bisa jadi "asli" hanya didukung pada beberapa arsitektur.
Daniel Santos