Bagaimana saya tahu jika kode saya sedang di vector oleh kompiler?

9

Seperti yang dicontohkan oleh jawaban Jed Brown untuk Biaya pencarian versus perhitungan , menggunakan operasi floating point yang di-vectorized vs non-vectorized menghasilkan kode yang jauh lebih cepat. Banyak kompiler modern mengklaim bahwa mereka dapat melakukan vektorisasi otomatis. Bagaimana saya bagian mana dari kode saya yang berhasil vektor?

Matthew Emmett
sumber

Jawaban:

10

Dengan kompiler Intel dari segala vintage modern -O3 -vec-report3,. Tingkat tiga optimisasi menjamin bahwa ia berusaha melakukan vektorisasi, dan laporan vektor akan memberi tahu Anda apa yang dilakukannya.

Halaman GNU tentang vektorisasi mengatakan bahwa itu diaktifkan secara default pada level optimisasi 3, tetapi saya tidak dapat menemukan yang setara dengan vec-report.

Bill Barth
sumber
Terima kasih atas tanggapan cepatnya. Saya tidak tahu tentang -vec-report3. Apakah Anda memiliki preferensi penyusun ketika datang ke hal semacam ini (vektorisasi otomatis)?
Matthew Emmett
Kompiler Intel benar-benar bagus, tetapi hanya untuk chip intel. Anda hanya perlu menambahkan semua pragma yang tepat (#pragma ivdep adalah yang termudah) GCC 4.7 telah menjadi jauh lebih baik tetapi melihat beberapa kode dengan seorang rekan masih memiliki bug (seperti tidak ada vektorisasi di dalam pragma openmp).
aterrel
1
Saya akan menyarankan memeriksa ulang bagaimana kompiler Intel tidak dengan vektorisasi pada chip AMD. Saya tidak 100% yakin bahwa masalah lama masih ada.
Bill Barth
2
@ BillBarth Ya, masih menjadi masalah. Lihat Pemberitahuan Pengoptimalan (di banyak tempat, mis. Software.intel.com/sites/products/collateral/hpc/compilers/… ). AMD memenangkan pertarungan pengadilan yang mengharuskan Intel untuk mengungkapkan bahwa mereka anti-persaingan, bukan untuk membuat mereka berhenti menjadi. en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism Agner Fog pada workarounds: agner.org/optimize/blog/read.php?i=49
Jed Brown
@JedBrown, yakin SSE masih aneh, tapi bagaimana dengan AVX? Tautan-tautan itu menunjukkan bahwa semuanya harus baik-baik saja (karena kedua perusahaan menerapkan AVX), tetapi saya belum mengujinya pada mesin Bulldozer.
Bill Barth
8

Dalam koleksi compiler GNU, Anda memiliki pilihan -ftree-vectorizer-verbose=nmana nadalah angka antara 0 dan 6 yang akan mencetak informasi yang serupa dengan icc/ ifort.

Pedro
sumber
5

Dengan kompiler GNU, menambahkan -Wa,-ahl=asm.sakan membuang kode perakitan yang dihasilkan asm.s.

Dengan kompiler Intel, menambahkan -fcode-asm -Faasm.sakan membuang kode yang dihasilkan asm.s.

Anda kemudian dapat memeriksa kode perakitan dan mencari operasi titik float vektor.

Matthew Emmett
sumber
Saya sepenuhnya setuju bahwa memeriksa output perakitan adalah satu-satunya cara yang dapat diandalkan untuk menentukan apakah kode tersebut benar-benar vektor. Tidak ada yang mengharuskan kompiler untuk jujur ​​tentang klaim mereka untuk mengkode kode.
Jeff