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?

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 .


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

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'

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 ...

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.