Intel Fortran Compiler: tips tentang pengoptimalan saat kompilasi

21

Saya akan mulai dengan pengalaman pribadi saya di lab kami. Kembali ke ifort 9 dan 10 hari, kami dulu cukup agresif dengan optimasi, mengkompilasi dengan -O3 dan flag spesifik prosesor (-xW -xSSE4.2 misalnya). Tetapi mulai dengan ifort 11, kami mulai memperhatikan:
1. beberapa inkonsistensi dalam hasil (karena semantik tidak dipertahankan)
2. keuntungan lebih kecil dibandingkan dengan -O2.

Jadi saat ini, kami biasanya cukup mengompilasi dengan -O2 dan -xhost. Apakah Anda memiliki saran yang lebih baik dengan ifort 11? Apakah ini akan berubah sekali lagi saat kita beralih ke ifort 12? Terima kasih sebelumnya.

FrenchKheldar
sumber
7
Optimalisasi tidak menguntungkan semua kode secara seragam. Jadi, saya pikir pertanyaan yang lebih baik adalah "Bagaimana saya bisa membuat profil kode saya untuk mengetahui optimasi kompiler mana yang efektif?"
Matt Knepley
1
Karena semantik tidak dilestarikan, atau karena sesuatu diatur ulang? Ini mungkin sedikit mengembara dari topik, tetapi akan baik untuk melihat potongan kode yang mereproduksi masalah. Mungkin ada sesuatu yang disusun ulang dengan cara yang tidak Anda sukai tetapi menurut kompiler itu boleh saja. Pengalaman saya adalah bahwa Intel 12 melakukan pekerjaan vektorisasi yang lebih baik daripada pendahulunya, jadi saya berharap lebih banyak perubahan akan terjadi ketika Anda beralih ke yang terbaru.
Bill Barth
Saya pikir mengatakan semantik tidak diawetkan sama dengan memesan tidak dilestarikan. Lagi pula, saya menyadari pertanyaan saya (juga?) Generik, dan saya tidak ingin membahas secara spesifik. Kami memiliki beberapa masalah dengan intel 10, ada yang kompiler bug dan ada yang tidak dapat dijelaskan. Jadi dengan 11, kami telah memainkannya dengan aman dan kami senang dengan performanya. Tapi mungkin kita bermain terlalu aman, dan saya ingin tahu apakah komunitas memiliki beberapa saran.
FrenchKheldar

Jawaban:

16

Kami sangat menyarankan semua pengguna kami mulai dengan -O3 -xHost -ipoifort 11 dan ifort 12. Jika ada transformasi floating point tertentu yang diaktifkan oleh O3 yang memengaruhi ketepatan beberapa perhitungan Anda, Anda dapat mematikannya secara khusus dengan -fp-model precise -fp-model except(atau, lebih drastis, -fp-model strict) sementara mempertahankan optimasi lainnya yang dimungkinkan O3, seperti pemblokiran loop untuk cache, loop fusion dan unrolling, dan optimisasi akses memori.

Saya akan menyarankan mencoba hal-hal model floating point pada file individual dan mencari tahu di mana itu membuat perbedaan, daripada mematikannya secara global; itu bisa berupa benjolan kecepatan ~ 15%, dan Anda ingin dapat mempertahankannya di tempat yang tidak memengaruhi perhitungan Anda. Jika Anda tidak yakin di mana ketepatan dipengaruhi, Anda dapat bermain dengan menghidupkan dan mematikan flag model floating point untuk file-file itu, atau bermain dengan mode pembulatan .

Kami baru-baru ini memberikan ceramah singkat kepada pengguna kami tentang flag optimasi, dengan fokus pada kompiler gnu dan intel untuk x86; Anda dapat melihat slide dari pembicaraan itu di sini .

Kebetulan, sementara kita berbicara tentang memilih flag optimasi untuk kode Anda, kadang-kadang juga layak melihat output -vec-report untuk melihat di mana kompiler berusaha untuk membuat vektor loop dan tidak bisa; kadang-kadang ada perubahan kecil yang dapat Anda lakukan untuk loop Anda yang dapat mengakibatkan vektorisasi menjadi mungkin (yang dapat menjadi 4x speedup). Demikian pula untuk -opt-report yang lebih umum .

nullglob
sumber
Aku seperti jawaban Anda, tetapi saya sudah mencoba lagi dengan salah satu testcase kami dan -O3 -xhost -fp-model precise -fp-model exceptmenghasilkan 30% perlambatan . Saya akan melihat lagi pada profiling dan -vec-reportuntuk mencoba melihat apa yang terjadi ...
FrenchKheldar
2
Over -O2 -xhost? Itu menarik; ini sangat tidak biasa tetapi bisa terjadi. Dalam kasus seperti ini, pengoptimal melakukan sesuatu yang memiliki alasan bagus untuk berpikir akan meningkatkan kecepatan, tetapi ternyata membuat segalanya menjadi lebih buruk. Biasanya untuk kode ilmiah, yang memiliki struktur yang cukup mudah, itu tidak terjadi. Dalam kasus seperti ini, Pengoptimalan Terpandu Profil - software.intel.com/sites/products/documentation/hpc/compilerpro/… - sering dapat membantu.
5

Saya bekerja untuk sebuah perusahaan yang menghasilkan aplikasi besar, sangat teknis di Fortran dengan IFort - aplikasi ini sangat penting kinerjanya, karena kecepatan (sambil mempertahankan akurasi) adalah titik penjualan utama.

Kami selalu mengkompilasi dengan -O3, dan setahu saya, hal-hal utama yang -O3 lakukan adalah loop membuka gulungan dan membuat prefetching. Saya menduga bahwa sebagian besar aplikasi komputasi ilmiah mendapat banyak manfaat dari ini, khususnya optimasi loop. Kami belum pernah melihat kesalahan kompiler dalam beberapa waktu (meskipun kami telah melihat beberapa kesalahan linker ketika menggunakan Ifort pada Mac). Kami menggunakan 11.1.095.

Saya harap ini membantu.

OscarB
sumber
4

Saya menyadari jawaban ini mungkin jauh, sangat terlambat, tetapi untuk optimasi yang agresif, opsi "-cepat" sepertinya solusi termudah. Kutipan dari halaman manual:

-fast
    Maximizes speed across the entire program.
    Description:
    This option maximizes speed across the entire program.

    It sets the following options:
     - On Linux* systems: -ipo, -O3, -no-prec-div, -static, and -xHost
     - On OS X* systems: -ipo, -mdynamic-no-pic, -O3, -no-prec-div, and -xHost
     - On Windows*  systems:  /O3,  /Qipo,  /Qprec-div-,  and /QxHost

    NOTE: Option fast sets some aggressive optimizations that may not be appropriate for all
    applications. The resulting executable may not run on processor types different from the
    one on which you compile. You should make sure that you understand the individual optimi-
    zation options that are enabled by option fast.
pengguna5428
sumber