Mengapa menggunakan SIMD jika kita memiliki GPGPU?

13

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?

Jonfrazen
sumber
2
Merupakan tantangan tersendiri untuk memberi makan GPU dengan data yang cukup untuk membuatnya tetap sibuk. Transfer data antara host dan perangkat praktis selalu menjadi hambatan. Operasi tertentu didukung lebih baik pada CPU (mis. Multiplikasi bebas-bawa; lihat PCLMULQDQ).
Juho
2
@ Juho Bukankah perangkat baru seperti APU AMD memiliki GPU dan CPU pada die yang sama? Apakah ini menghilangkan hambatan?
jonfrazen
1
Ketika semua dikatakan dan dilakukan, instruksi vektor masih merupakan instruksi tunggal, dan biaya untuk menjadwalkan dan melaksanakannya sama dengan instruksi tunggal lainnya. Masuk akal untuk menjalankan pekerjaan pada GPU ketika manfaatnya melebihi biaya. Juga pertimbangkan bahwa Anda mendapatkan satu unit SIMD per inti, tetapi biasanya hanya satu GPU per sasis, dan GPU saat ini merupakan sumber daya bersama. Ini membatasi jumlah pekerjaan yang dapat Anda jalankan pada GPU. (Jumlah core meningkat setiap saat, tetapi jumlah GPU tidak.)
Nama samaran
Intel tidak melakukan banyak hal dalam hal GPU (selain dari Larrabee / Knights Landing :)), jadi saya rasa wajar bagi mereka untuk mencoba mendorong AVX sebagai gantinya. Meskipun penggunaan AVX yang berat mungkin sangat berkinerja, sekarang menghasilkan downclocking pada CPU baru mereka, sehingga mereka mungkin mencapai batas dengan sesuatu.
nsandersen

Jawaban:

16

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.

Logika Pengembaraan
sumber