Kapan saya harus melepas pekerjaan ke GPU alih-alih CPU?

15

Sistem yang lebih baru seperti OpenCL sedang dibuat sehingga kami dapat menjalankan lebih banyak kode pada prosesor grafis kami, yang masuk akal, karena kami harus dapat memanfaatkan sebanyak mungkin kekuatan dalam sistem kami.

Namun, dengan semua sistem baru ini, tampaknya seolah-olah GPU lebih baik daripada CPU dalam segala hal . Karena GPU dapat melakukan perhitungan paralel, GPU multi-core sebenarnya tampak jauh lebih baik daripada CPU multi-core; Anda akan dapat melakukan banyak perhitungan sekaligus dan benar-benar meningkatkan kecepatan. Apakah masih ada kasus tertentu di mana pemrosesan serial masih lebih baik, lebih cepat, dan / atau lebih efisien daripada paralel?

RétroX
sumber
6
Bukan pertanyaan tentang perangkat keras. Harus ditulis ulang menjadi "kapan pemrograman CPU lebih baik daripada pemrograman GPU" dan itu adalah pertanyaan yang cukup bagus untuk IMO. Lihat tag GPGPU antara lain di SO. Tapi pertanyaan arsitektur "Apa teknologi untuk menggunakan" lebih baik di sini daripada di sana.
Kate Gregory
1
@ Kate Sudut itu tampaknya sangat tercakup dalam pertanyaan Pengguna Super yang ditautkan. Membaca melalui itu, saya agak terkejut tidak bermigrasi di sini, jujur ​​saja. Ada juga ini di SO. Saya akan membuka kembali pertanyaan (karena Anda benar, aspek pemrogramannya ada di topik di sini). Saya harap kita melihat jawaban yang tidak hanya menunjuk pada cakupan yang ada (sangat baik) dari masalah ini.
Adam Lear
1
Untuk titik @ Anna, saya pikir jawabannya perlu lebih banyak tentang kapan seorang programmer harus menggunakan GPU daripada diskusi murni teoritis tentang apa perbedaan antara GPU dan CPU. Saya telah mengedit judul untuk mencerminkan ini.
2
@RetroX Kami tidak dapat menutup pertanyaan sebagai duplikat jika ada di situs yang berbeda.
Adam Lear

Jawaban:

26

Namun, dengan semua sistem baru ini, tampaknya seolah-olah GPU lebih baik daripada CPU dalam segala hal.

Ini adalah salah pengertian mendasar. Core GPU saat ini masih terbatas dibandingkan dengan CPU top-line saat ini. Saya pikir arsitektur Fermi NVIDIA adalah GPU paling kuat yang tersedia saat ini. Ia hanya memiliki register 32-bit untuk aritmatika integer, dan kurang kemampuan untuk prediksi cabang dan eksekusi spekulatif daripada prosesor Intel komoditas saat ini. Chip Intel i7 menyediakan tiga level caching, Fermi core hanya memiliki dua, dan setiap cache pada Fermi lebih kecil dari cache yang sesuai pada i7. Komunikasi antarproses antara inti GPU cukup terbatas, dan perhitungan Anda harus disusun untuk mengakomodasi batasan itu (inti digabungkan menjadi blok, dan komunikasi antara inti dalam blok relatif cepat, tetapi komunikasi antar blok lambat).

Keterbatasan signifikan GPU saat ini adalah bahwa semua core harus menjalankan kode yang sama. Tidak seperti inti pada CPU Anda, Anda tidak dapat memberi tahu satu inti GPU untuk menjalankan klien surel Anda, dan inti lainnya untuk menjalankan server web Anda. Anda memberi GPU fungsi untuk membalikkan matriks, dan semua core menjalankan fungsi itu pada bit data yang berbeda.

Prosesor pada GPU hidup di dunia yang terisolasi. Mereka dapat mengontrol tampilan, tetapi mereka tidak memiliki akses ke disk, jaringan, atau keyboard.

Akses ke sistem GPU memiliki biaya overhead yang besar. GPU memiliki memori sendiri, sehingga perhitungan Anda akan terbatas pada jumlah memori pada kartu GPU. Mentransfer data antara memori GPU dan memori utama relatif mahal. Secara pragmatis ini berarti bahwa tidak ada manfaatnya menyerahkan beberapa perhitungan pendek dari CPU ke GPU, karena biaya pengaturan dan penghancuran akan membanjiri waktu yang diperlukan untuk melakukan perhitungan.

Intinya adalah bahwa GPU berguna ketika Anda memiliki banyak (seperti dalam ratusan atau ribuan) salinan perhitungan panjang yang dapat dihitung secara paralel. Tugas umum yang umum terjadi adalah komputasi ilmiah, encoding video, dan rendering gambar. Untuk aplikasi seperti editor teks, satu-satunya fungsi di mana GPU mungkin berguna adalah rendering jenis pada layar.

Charles E. Grant
sumber
dukungan presisi ganda adalah bagian dari Shader Model 5, dan AMD / ATI juga memilikinya.
Ben Voigt
@ Ben, terima kasih atas koreksinya. Saya telah menghapus pernyataan yang salah.
Charles E. Grant
11

GPU bukan prosesor generalis seperti CPU. Mereka berspesialisasi dalam melakukan satu hal yang sangat spesifik - menerapkan kode yang sama ke sejumlah besar data - dan mereka melakukannya dengan sangat, sangat baik, jauh lebih baik daripada CPU. Tetapi sebagian besar aplikasi kebanyakan bukan tentang menerapkan kode yang sama untuk sejumlah besar data; ini tentang perulangan acara: menunggu input, membaca input, bertindak padanya, dan kemudian menunggu lebih banyak input. Itu proses yang cukup serial, dan GPU menyedot "serial."

Ketika Anda memiliki sejumlah besar data yang perlu Anda proses, dan setiap item dapat diproses secara paralel, terlepas dari yang lain, kemudian lanjutkan dan kirimkan ke GPU. Tetapi jangan menganggap ini sebagai "paradigma baru" yang harus diperas semuanya.

Pertanyaan ini ditandai "optimisasi," jadi ingatlah untuk memperlakukannya sebagai satu. Menerapkan pengoptimalan GPU di mana pengujian dan profil mengungkapkan bahwa pengoptimalan diperlukan dan sifat tugas adalah sedemikian sehingga pengoptimalan GPU dapat diterapkan. Kalau tidak, jangan repot-repot dengan itu, karena itu akan menjadi optimasi prematur atau salah, yang menyebabkan lebih banyak masalah daripada perbaikannya.

Mason Wheeler
sumber
8

Jawaban sederhananya adalah bahwa GPU berfungsi paling baik ketika Anda perlu melakukan perhitungan yang cukup kecil, cukup sederhana untuk masing-masing item yang sangat besar. Untuk mencapai banyak hal seperti ini, perhitungan untuk setiap item harus independen dari perhitungan untuk item lainnya. Jika ada (biasanya) beberapa ketergantungan antara satu item dengan item lainnya, Anda biasanya perlu mencari cara untuk memecahkannya sebelum Anda akan mendapatkan banyak manfaat dari mengeksekusi kode itu pada GPU. Jika dependensi tidak dapat dipatahkan sama sekali, atau membutuhkan terlalu banyak pekerjaan untuk dipecahkan, kode mungkin mengeksekusi lebih cepat pada CPU.

Sebagian besar CPU saat ini juga mendukung beberapa jenis operasi yang tidak didukung oleh GPU saat ini sama sekali (misalnya, perlindungan memori untuk multitasking).

Melihatnya dari arah yang sedikit berbeda, CPU telah (sebagian besar) dirancang agar cukup nyaman bagi programmer, dan orang-orang perangkat keras telah melakukan yang terbaik (dan yang terbaik yang sangat buruk itu!) Untuk membuat perangkat keras yang mempertahankan model yang nyaman untuk programmer, tetapi masih mengeksekusi secepat mungkin.

GPU datang pada hal-hal dari arah yang berlawanan: mereka dirancang sebagian besar agar nyaman bagi perancang perangkat keras, dan hal-hal seperti OpenCL telah berusaha untuk menyediakan model pemrograman yang masuk akal mungkin karena kendala perangkat keras.

Menulis kode untuk dijalankan pada GPU biasanya akan membutuhkan lebih banyak waktu dan upaya (sehingga akan lebih mahal) daripada melakukan hal yang sama pada CPU. Dengan demikian, melakukannya terutama masuk akal ketika / jika salah satu dari:

  1. Masalahnya sangat paralel sehingga Anda dapat mengharapkan keuntungan besar dari usaha minimal, atau
  2. Peningkatan kecepatan sangat penting sehingga membenarkan banyak pekerjaan ekstra.

Ada beberapa kemungkinan yang jelas untuk masing-masing - tetapi sejumlah besar aplikasi jelas bahkan tidak dekat dengan keduanya. Saya akan sangat terkejut melihat (misalnya) aplikasi CRUD berjalan pada GPU dalam waktu dekat (dan jika itu terjadi, itu mungkin akan terjadi karena seseorang menetapkan dengan tujuan yang tepat dalam pikiran, belum tentu apa pun mendekati optimal rasio biaya / manfaat).

Kenyataannya adalah bahwa untuk banyak (saya tergoda untuk mengatakan "sebagian besar") aplikasi, CPU yang khas jauh lebih cepat, dan kenyamanan pemrograman (mengarah pada hal-hal seperti pengembangan fitur baru yang lebih mudah) jauh lebih penting daripada kecepatan eksekusi.

Jerry Coffin
sumber
3

Anda akan dapat melakukan banyak perhitungan sekaligus dan benar-benar meningkatkan kecepatan.

meningkatkan kecepatan? terus? Sepanjang tahun lalu saya hanya dapat mengingat satu atau dua kali ketika dibutuhkan. Sebagian besar waktu saya diminta untuk memodifikasi atau memperbaiki logika, untuk menyesuaikan sumber data yang berbeda, untuk meningkatkan interaksi pengguna dll. Satu-satunya kecepatan pelanggan tertarik pada kasus ini adalah kecepatan membuat perubahan. "Silakan lepaskan fitur baru dalam sebulan, atau lebih baik lagi - dalam dua minggu".

Jangan salah paham - sebagai pembuat kode, saya menikmati memeras kutu CPU secara menyeluruh. Hanya saja seni ini biasanya tidak banyak diminati.

Apakah masih ada kasus tertentu di mana pemrosesan serial masih lebih baik, lebih cepat, dan / atau lebih efisien daripada paralel?

Saya akan mengatakan ada banyak kasus. Pemrosesan serial lebih sederhana daripada paralel, yang membuatnya lebih efisien dalam semua kasus ketika kecepatan bukan persyaratan penting. Pemrosesan serial memungkinkan implementasi logika rumit dan antarmuka pengguna yang lebih mudah, lebih mudah untuk menentukan dan menguji, memelihara, dan mengubah.

Sebagai aturan, pemrosesan serial memungkinkan ekspresi maksud programmer yang lebih jelas dan pembacaan kode yang lebih mudah. Saya akan mengatakan itu menghemat sumber daya yang paling berharga dan langka - otak programmer.

agas
sumber
2

CPU masih lebih fleksibel. Misalnya, GPU lebih efisien daripada CPU dalam presisi tunggal, tetapi tidak dalam presisi ganda. Ada lebih banyak pustaka untuk CPU daripada GPU.

quant_dev
sumber
3
Bisakah Anda sedikit lebih detail? Anda telah memberikan tiga pernyataan tanpa informasi atau penjelasan tentang kebenarannya.
Yah, kurangnya perhitungan presisi ganda yang efisien adalah pengetahuan umum: en.wikipedia.org/wiki/GPGPU
quant_dev
@quant: Informasi Anda setidaknya 2 tahun kedaluwarsa: 544 GigaFLOPS jauh lebih cepat daripada CPU mainstream.
Ben Voigt
@Ben Saya tidak melihat di mana tautan Anda menyebutkan kinerja presisi ganda.
quant_dev
@quant: awurl.com/Tt7LAX8lH
Ben Voigt
2

Aturan sederhananya adalah, jika apa yang Anda lakukan dapat diringkas dalam bentuk konstruksi dari aljabar linier dan bersifat kritis waktu, lakukan pada GPU jika tidak gunakan CPU.

GPU tidak seperti CPU dalam jumlah besar, mereka memiliki karakteristik kinerja yang sangat berbeda.

dan_waterworth
sumber
Jika "kritis waktu", Anda mungkin tidak punya waktu untuk mengkonfigurasi ulang GPU untuk penghitung komputasi dan mengunggah data. Ini masalah besar yang paling diuntungkan.
Ben Voigt
@ Ben, saya pikir kita memiliki definisi berbeda tentang "waktu kritis", yang saya maksud adalah bahwa perhitungannya berada di jalur kritis untuk sejumlah waktu yang signifikan.
dan_waterworth
1

Jika Anda membutuhkan angka-angka kasar, GPU adalah cara yang tepat. Namun, semua ALU itu berarti bahwa ada lebih sedikit transistor yang didedikasikan untuk mengontrol aliran (percabangan) sirkuit. Jadi, jika Anda perlu menulis sesuatu yang membutuhkan banyak aliran kontrol yang kompleks, banyak persyaratan, dll, maka CPU akan lebih cepat.

Alex
sumber