Saya pikir pertanyaan ini lebih baik disajikan di bagian CS Stack Exchange. Sekarang kita memiliki GPGPU dengan bahasa seperti CUDA dan OpenCL, apakah ekstensi SIMD multimedia (SSE / AVX / NEON) masih melayani tujuan?
Saya membaca sebuah artikel baru-baru ini tentang bagaimana instruksi SSE dapat digunakan untuk mempercepat penyortiran jaringan. Saya pikir ini cukup rapi tetapi ketika saya mengatakan kepada profesor arch arch saya dia tertawa dan mengatakan bahwa menjalankan kode yang sama pada GPU akan menghancurkan versi SIMD. Saya tidak meragukan hal ini karena SSE sangat sederhana dan GPU adalah akselerator besar yang sangat kompleks dengan paralelisme yang jauh lebih banyak, tetapi hal itu membuat saya berpikir, apakah ada banyak skenario di mana ekstensi SIMD multimedia lebih berguna daripada menggunakan GPU?
Jika GPGPU membuat SIMD berlebihan, mengapa Intel meningkatkan dukungan SIMD mereka? SSE adalah 128 bit, sekarang 256 bit dengan AVX dan tahun depan akan menjadi 512 bit. Jika GPGPU lebih baik memproses kode dengan paralelisme data, mengapa Intel mendorong ekstensi SIMD ini? Mereka mungkin dapat menempatkan sumber daya yang setara (penelitian dan area) ke dalam cache yang lebih besar dan alat prediksi cabang sehingga meningkatkan kinerja serial.
Mengapa menggunakan SIMD, bukan GPGPU?
sumber
Jawaban:
Tidak ada yang gratis. GPGPU adalah SIMD. Instruksi SIMD pada GPGPU cenderung lebih luas daripada instruksi SIMD pada CPU. GPGPU cenderung multi-threaded halus (dan memiliki lebih banyak konteks perangkat keras daripada CPU). GPGPU dioptimalkan untuk streaming . Mereka cenderung mencurahkan persentase area yang lebih besar ke unit floating point, persentase area yang lebih rendah untuk cache, dan persentase area yang lebih rendah untuk kinerja integer.
Mari kita lakukan perbandingan. Intel Core i7-5960x memiliki 8 core, masing-masing dengan SIMD 4-lebar (presisi ganda), berjalan pada 3 GHz (turbo 3.5GHz), cache L3 20M, mengkonsumsi 356mm ^ 2 dan 140W dan biaya $ 1000. Jadi 8 * 4 * 3 * 4 = 384 GFlops presisi ganda. (4x tambahan adalah karena Anda dapat melakukan dua penggabungan-gandakan-tambah per jalur vektor per siklus.) Dapat melakukan 768 GFlops presisi tunggal. Itu sekitar 1,08 DP GFlops / mm ^ 2 dan 2,75 DP GFlops / Watt. Ada juga 57,5 KB / mm ^ 2 cache on-chip.
NVIDIA GeForce GTX Titan Black memiliki 15 SMX, masing-masing dengan SIMD presisi ganda 32-lebar, berjalan pada 890MHz (980MHz turbo), 3,5M L1 + L2 cache, mengkonsumsi 561mm ^ 2, 250W dan biaya $ 1000. Jadi 15 * 32 * .89 * 4 = 1709 GFlops presisi ganda. (Sama 4x dari dua fused-multiply-menambahkan per jalur vektor per siklus.) Hal ini dapat melakukan 5126 GFlops presisi tunggal. Itu sekitar 3,05 DP GFlops / mm ^ 2 dan 6,8 DP GFlops / Watt. Jadi 3x kepadatan floating point DP per unit area dan 3x efisiensi daya floating point DP. Dan pengorbanannya? 6,4 KB / mm ^ 2 cache on-chip. Tentang 9x kurang padat dari CPU.
Jadi perbedaan utama adalah bahwa GPU telah memilih keseimbangan area yang sangat mendukung floating point (dan terutama floating point presisi tunggal) daripada cache. Bahkan mengabaikan fakta bahwa Anda perlu menyalin hal-hal bolak-balik antara CPU dan GPU untuk melakukan I / O, seberapa baik GPU akan dilakukan dibandingkan dengan CPU tergantung pada program yang Anda jalankan.
Jika Anda memiliki program floating point paralel data dengan sedikit divergensi kontrol (semua jalur vektor melakukan hal yang sama pada saat yang sama) dan program Anda streaming (tidak dapat mengambil manfaat dari caching), maka GPU akan menjadi sekitar 3x lebih efisien per satuan luas atau per Watt. Tetapi jika Anda memiliki sejumlah besar kontrol divergen, pekerjaan non-data-paralel yang dapat dilakukan, atau dapat mengambil manfaat dari struktur data baca-berkali-kali besar, CPU mungkin akan melakukan yang lebih baik.
sumber