The artikel Wikipedia pada EPIC telah digariskan banyak bahaya umum untuk VLIW dan EPIC.
Jika ada yang tidak menangkap rasa fatalisme dari artikel itu, izinkan saya menyoroti ini:
Memuat respons dari hierarki memori yang mencakup cache CPU dan DRAM tidak memiliki penundaan deterministik.
Dengan kata lain, setiap desain perangkat keras yang gagal mengatasi (*) latensi non-deterministik dari akses memori hanya akan menjadi kegagalan yang spektakuler.
(*) Dengan "mengatasi", perlu untuk mencapai kinerja eksekusi yang cukup baik (dengan kata lain, "biaya-kompetitif"), yang mengharuskan tidak membiarkan CPU jatuh menganggur selama puluhan hingga ratusan siklus begitu sering.
Perhatikan bahwa strategi mengatasi yang digunakan oleh EPIC (disebutkan dalam artikel Wikipedia yang ditautkan di atas) tidak benar-benar menyelesaikan masalah. Itu hanya mengatakan bahwa beban mengindikasikan ketergantungan data sekarang jatuh pada kompiler. Tidak apa-apa; kompiler sudah memiliki informasi itu, sehingga mudah bagi compiler untuk mematuhinya. Masalahnya adalah bahwa CPU masih akan menganggur selama puluhan hingga ratusan siklus melalui akses memori. Dengan kata lain, itu mengeksternalkan tanggung jawab sekunder, sementara masih gagal mengatasi tanggung jawab utama.
Pertanyaannya dapat diulangi sebagai: "Mengingat platform perangkat keras yang ditakdirkan untuk gagal, mengapa (1) tidak (2) tidak bisakah penulis kompiler membuat upaya heroik untuk menebusnya?"
Saya harap kalimat ulang saya akan membuat jawaban untuk pertanyaan itu jelas.
Ada aspek kedua dari kegagalan yang juga fatal.
Strategi coping (disebutkan dalam artikel yang sama) mengasumsikan bahwa prefetching berbasis perangkat lunak dapat digunakan untuk memulihkan setidaknya sebagian dari kehilangan kinerja karena latensi non-deterministik dari akses memori.
Pada kenyataannya, pengambilan awal hanya menguntungkan jika Anda melakukan operasi streaming (membaca memori secara berurutan, atau sangat dapat diprediksi).
(Yang mengatakan, jika kode Anda membuat akses sering ke beberapa area memori lokal, caching akan membantu.)
Namun, sebagian besar perangkat lunak untuk keperluan umum harus membuat banyak akses memori acak. Jika kami mempertimbangkan langkah-langkah berikut:
- Hitung alamatnya, lalu
- Baca nilainya, lalu
- Gunakan dalam beberapa perhitungan
Untuk sebagian besar perangkat lunak serba guna, ketiganya harus dijalankan secara berurutan. Dengan kata lain, tidak selalu mungkin (dalam batas-batas logika perangkat lunak) untuk menghitung alamat di muka, atau untuk menemukan cukup banyak pekerjaan yang harus dilakukan untuk mengisi kios di antara tiga langkah ini.
Untuk membantu menjelaskan mengapa tidak selalu mungkin menemukan pekerjaan yang cukup untuk mengisi kedai, berikut adalah bagaimana orang dapat memvisualisasikannya.
- Katakanlah, untuk menyembunyikan warung secara efektif, kita perlu mengisi 100 instruksi yang tidak bergantung pada memori (jadi tidak akan menderita latensi tambahan).
- Sekarang, sebagai seorang programmer, silakan memuat semua perangkat lunak pilihan Anda menjadi disassembler. Pilih fungsi acak untuk analisis.
- Bisakah Anda mengidentifikasi di mana saja urutan 100 instruksi (*) yang secara eksklusif bebas dari akses memori?
(*) Jika kita bisa NOP
melakukan pekerjaan yang bermanfaat ...
CPU modern mencoba untuk mengatasi hal yang sama dengan menggunakan informasi dinamis - dengan secara bersamaan melacak kemajuan setiap instruksi ketika mereka beredar melalui pipa. Seperti yang saya sebutkan di atas, bagian dari informasi dinamis tersebut adalah karena latensi memori yang non-deterministik, oleh karena itu tidak dapat diprediksi pada tingkat akurasi apa pun oleh kompiler. Secara umum, tidak ada cukup informasi yang tersedia pada waktu kompilasi untuk membuat keputusan yang mungkin dapat mengisi kios-kios itu.
Menanggapi jawaban oleh Pemrogram
Bukannya "compiler ... mengekstraksi paralelisme itu sulit".
Penataan ulang memori dan instruksi aritmatika oleh kompiler modern adalah bukti bahwa ia tidak memiliki masalah mengidentifikasi operasi yang independen dan dengan demikian secara bersamaan dapat dieksekusi.
Masalah utama adalah bahwa latensi memori non-deterministik berarti bahwa "pasangan instruksi" apa pun yang telah dikodekan untuk prosesor VLIW / EPIC pada akhirnya akan terhenti karena akses memori.
Mengoptimalkan instruksi yang tidak terhenti (hanya register, aritmatika) tidak akan membantu dengan masalah kinerja yang disebabkan oleh instruksi yang sangat mungkin terhenti (akses memori).
Ini adalah contoh kegagalan untuk menerapkan aturan optimasi 80-20: Mengoptimalkan hal-hal yang sudah cepat tidak akan secara bermakna meningkatkan kinerja keseluruhan, kecuali hal-hal yang lebih lambat juga dioptimalkan.
Menanggapi jawaban oleh Basile Starynkevitch
Ini bukan "... (apa pun) yang sulit", EPIC tidak cocok untuk platform apa pun yang harus mengatasi dinamika tinggi dalam latensi.
Misalnya, jika sebuah prosesor memiliki semua hal berikut:
- Tidak ada akses memori langsung;
- Setiap akses memori (baca atau tulis) harus dijadwalkan dengan transfer DMA;
- Setiap instruksi memiliki latensi eksekusi yang sama;
- Eksekusi dalam pesanan;
- Unit eksekusi lebar / vektor;
Maka VLIW / EPIC akan cocok.
Di mana orang menemukan prosesor seperti itu? DSP. Dan di sinilah VLIW berkembang.
Jika dipikir-pikir, kegagalan Itanium (dan upaya R&D yang terus-menerus mengalir ke dalam kegagalan, terlepas dari bukti nyata) adalah contoh kegagalan organisasi, dan layak untuk dipelajari secara mendalam.
Memang, usaha vendor lainnya, seperti hyperthreading, SIMD, dll., Tampaknya sangat sukses. Ada kemungkinan bahwa investasi dalam Itanium mungkin memiliki efek yang memperkaya pada keterampilan para insinyurnya, yang mungkin memungkinkan mereka untuk menciptakan generasi berikutnya dari teknologi yang sukses.