Ini mungkin terdengar jelas, tetapi komputer tidak menjalankan formula , mereka mengeksekusi kode , dan berapa lama eksekusi itu tergantung langsung pada kode yang mereka jalankan dan hanya secara tidak langsung pada konsep apa pun yang diterapkan oleh kode tersebut. Dua potongan kode yang identik secara logis dapat memiliki karakteristik kinerja yang sangat berbeda. Beberapa alasan yang cenderung muncul dalam perkalian matriks secara khusus:
- Menggunakan banyak utas. Hampir tidak ada CPU modern yang tidak memiliki banyak core, banyak yang memiliki hingga 8 core, dan mesin khusus untuk komputasi kinerja tinggi dapat dengan mudah memiliki 64 di beberapa soket. Menulis kode dengan cara yang jelas, dalam bahasa pemrograman normal, hanya menggunakan salah satunya . Dengan kata lain, mungkin menggunakan kurang dari 2% dari sumber daya komputasi yang tersedia dari mesin itu berjalan.
- Menggunakan instruksi SIMD (membingungkan, ini juga disebut "vektorisasi" tetapi dalam arti yang berbeda dari kutipan teks dalam pertanyaan). Intinya, alih-alih 4 atau 8 atau lebih instruksi skalar skalar, berikan CPU satu instruksi yang melakukan aritmatika pada 4 atau 8 atau lebih register secara paralel. Ini benar-benar dapat membuat beberapa perhitungan (ketika mereka sangat independen dan cocok untuk set instruksi) 4 atau 8 kali lebih cepat.
- Memanfaatkan cache dengan lebih cerdas . Akses memori lebih cepat jika mereka sementara dan spasial koheren , yaitu, akses berturut-turut ke alamat terdekat dan ketika mengakses alamat dua kali Anda mengaksesnya dua kali berturut-turut dengan cepat daripada dengan jeda panjang.
- Menggunakan akselerator seperti GPU. Perangkat ini adalah binatang yang sangat berbeda dari CPU dan pemrograman mereka secara efisien adalah bentuk seni tersendiri. Misalnya, mereka memiliki ratusan inti, yang dikelompokkan ke dalam kelompok beberapa lusin inti, dan kelompok-kelompok ini berbagi sumber daya - mereka berbagi beberapa KiB memori yang jauh lebih cepat daripada memori normal, dan ketika setiap inti dari kelompok mengeksekusi
if
pernyataan semua yang lain dalam grup itu harus menunggu.
- Bagikan pekerjaan melalui beberapa mesin (sangat penting dalam superkomputer!) Yang memperkenalkan serangkaian besar sakit kepala baru, tetapi tentu saja dapat memberikan akses ke sumber daya komputasi yang jauh lebih besar.
- Algoritma yang lebih cerdas. Untuk perkalian matriks, algoritma O (n ^ 3) yang sederhana, dioptimalkan dengan tepat dengan trik-trik di atas, seringkali lebih cepat daripada yang sub-kubik untuk ukuran matriks yang masuk akal, tetapi kadang-kadang mereka menang. Untuk kasus khusus seperti matriks jarang, Anda dapat menulis algoritma khusus.
Banyak orang pintar telah menulis kode yang sangat efisien untuk operasi aljabar linier umum , menggunakan trik di atas dan banyak lagi dan biasanya bahkan dengan trik bodoh platform-spesifik. Oleh karena itu, mengubah rumus Anda menjadi perkalian matriks dan kemudian menerapkan perhitungan dengan memanggil pustaka aljabar linier yang matang akan mendapat manfaat dari upaya pengoptimalan tersebut. Sebaliknya, jika Anda cukup menuliskan formula dengan cara yang jelas dalam bahasa tingkat tinggi, kode mesin yang pada akhirnya dihasilkan tidak akan menggunakan semua trik itu dan tidak akan secepat itu. Ini juga benar jika Anda mengambil formulasi matriks dan mengimplementasikannya dengan memanggil rutin perkalian matriks naif yang Anda tulis sendiri (sekali lagi, dengan cara yang jelas).
Membuat kode dengan cepat membutuhkan kerja , dan seringkali cukup banyak pekerjaan jika Anda ingin kinerja yang terakhir. Karena begitu banyak perhitungan penting dapat dinyatakan sebagai kombinasi dari beberapa operasi aljabar linier, adalah ekonomis untuk membuat kode yang sangat dioptimalkan untuk operasi ini. Kasus penggunaan khusus Anda yang sekali pakai? Tidak ada yang peduli tentang itu kecuali Anda, jadi mengoptimalkan hal itu tidak ekonomis.