Apakah ada manfaat untuk menggunakan CPU daripada GPU?

63

Saya telah meneliti prosesor dan kartu grafis, dan saya menemukan bahwa GPU jauh lebih cepat daripada CPU. Saya membaca di artikel yang satu ini , sebuah GPU Nvidia yang berusia 2 tahun mengungguli prosesor Intel Core I7 3.2GHz sebanyak 14 kali dalam kondisi tertentu. Jika GPU begitu cepat, mengapa pengembang tidak menggunakannya untuk setiap fungsi dalam game? Mungkinkah GPU melakukan selain grafis?

Daniel Pendergast
sumber
17
Jika Anda berada dalam gim di mana Anda melepas semuanya ke GPU, dan CPU Anda hampir tidak melakukan apa-apa, maka Anda bisa mendapatkan peningkatan kinerja dengan mengembalikan sebagian beban pada CPU.
Tetrad
3
GPU Anda mungkin lebih baik daripada CPU Anda, tetapi saya tidak berpikir kartu video Anda lebih baik dari mainboard Anda (dan saya tidak akan membandingkan OS dengan driver lol)
e-MEE
27
GPU is faster than a CPUadalah mitos keliru bahwa banyak orang dituntun untuk percaya setelah melihat tolok ukur berdasarkan masalah yang secara khusus diarahkan untuk GPU (kelas masalah ini disebut "masalah paralel memalukan"), lihat jawaban saya pada pertanyaan SuperUser ini: Mengapa kita masih menggunakan CPU bukan GPU?
Lie Ryan
5
Satu manfaatnya adalah setiap komputer memiliki CPU :)
Tim Holt

Jawaban:

50

"Aku pernah membaca bahwa mobil F1 lebih cepat daripada yang kita kendarai di jalanan ... mengapa orang tidak menggunakan mobil F1?" Baiklah ... Jawaban untuk pertanyaan ini sederhana: mobil F1 tidak dapat rusak atau berputar secepat mobil kebanyakan (mobil paling lambat bisa mengalahkan F1 dalam kasus itu). Kasus GPU sangat mirip, mereka pandai mengikuti garis lurus pemrosesan, tetapi mereka tidak begitu baik ketika datang untuk memilih jalur pemrosesan yang berbeda.

Suatu program yang dijalankan dalam GPU berarti ketika harus dijalankan berkali-kali secara paralel, misalnya ketika Anda harus menggabungkan semua piksel dari Tekstur A dengan piksel dari Tekstur B dan meletakkan semuanya di Tekstur C. Tugas ini, saat dijalankan di sebuah CPU, akan diproses sebagai sesuatu seperti ini:

for( int i =0; i< nPixelCount; i++ )
     TexC[i] = TexA[i] + TexB[i];

Tapi ini lambat ketika Anda harus memproses banyak piksel, jadi GPU alih-alih menggunakan kode di atas, itu hanya menggunakan yang berikutnya:

     TexC[i] = TexA[i] + TexB[i];

dan kemudian mengisi semua inti dengan program ini (pada dasarnya menyalin program ke inti), memberikan nilai iuntuk masing-masing. Di sinilah keajaiban dari GPU dan membuat semua core menjalankan program pada saat yang sama , membuat banyak operasi lebih cepat daripada yang bisa dilakukan oleh program CPU linier.

Cara kerja ini ok ketika Anda harus memproses dengan cara yang sama input yang sangat kecil, tetapi benar-benar buruk ketika Anda harus membuat program yang mungkin memiliki percabangan bersyarat. Jadi sekarang mari kita lihat apa yang CPU lakukan ketika memeriksa beberapa kondisi:

  • 1: Jalankan program hingga operasi logis pertama
  • 2: Evaluasi
  • 3: Lanjutkan mengeksekusi dari hasil alamat memori perbandingan (seperti dengan instruksi JNZ asm)

Ini sangat cepat untuk CPU sebagai pengaturan indeks, tetapi untuk GPU melakukan hal yang sama, itu jauh lebih rumit. Karena daya dari GPU berasal dari mengeksekusi instruksi yang sama pada saat yang sama (mereka adalah SIMD core), mereka harus disinkronkan untuk dapat mengambil keuntungan dari arsitektur chip. Harus menyiapkan GPU untuk menangani cabang menyiratkan kurang lebih:

  • 1: Buat versi program yang hanya mengikuti cabang A, isi kode ini di semua core.
  • 2: Jalankan program hingga operasi logis pertama
  • 3: Evaluasi semua elemen
  • 4: Lanjutkan memproses semua elemen yang mengikuti cabang A, enqueue semua proses yang memilih jalur B (yang tidak ada program dalam inti!). Sekarang semua core yang memilih jalur B, akan menjadi IDLE !! - kasus terburuk adalah eksekusi satu inti dan setiap inti lainnya hanya menunggu.
  • 5: Setelah semua selesai diproses, aktifkan versi cabang B dari program (dengan menyalinnya dari buffer memori ke beberapa memori inti kecil).
  • 6: Jalankan cabang B.
  • 7: Jika perlu, campur / gabungkan kedua hasil.

Metode ini dapat bervariasi berdasarkan banyak hal (mis. Beberapa sangat kecilcabang dapat berjalan tanpa perlu perbedaan ini) tetapi sekarang Anda sudah dapat melihat mengapa percabangan akan menjadi masalah. Cache GPU sangat kecil. Anda tidak bisa hanya menjalankan program dari VRAM secara linier, cache harus menyalin blok instruksi kecil ke core yang akan dieksekusi dan jika Anda memiliki cukup cabang GPU Anda sebagian besar akan terhenti daripada menjalankan kode apa pun, yang tidak masuk akal saat menjalankan program yang hanya mengikuti satu cabang, seperti yang dilakukan sebagian besar program - meskipun berjalan di banyak utas. Dibandingkan dengan contoh F1, ini akan seperti harus membuka parasut pengereman di setiap sudut, kemudian keluar dari mobil untuk mengemasnya kembali di dalam mobil sampai sudut berikutnya Anda ingin berbelok lagi atau menemukan semafor merah (sudut berikutnya yang paling disukai).

Maka tentu saja ada masalah arsitektur lain yang begitu baik dalam tugas operasi logis, jauh lebih murah dan lebih dapat diandalkan, terstandar, lebih dikenal, hemat daya, dll. Kartu video baru hampir tidak kompatibel dengan yang lebih lama tanpa emulasi perangkat lunak, mereka menggunakan instruksi asm berbeda di antara mereka bahkan dari produsen yang sama, dan untuk saat ini sebagian besar aplikasi komputer tidak memerlukan jenis arsitektur paralel ini, dan bahkan jika mereka membutuhkannya, mereka dapat menggunakan melalui standar apis seperti OpenCL sebagai disebutkan oleh eBusiness, atau melalui apis grafis. Mungkin dalam beberapa dekade kita akan memiliki GPU yang dapat menggantikan CPU tetapi saya tidak berpikir itu akan terjadi dalam waktu dekat.

Saya merekomendasikan dokumentasi dari AMD APP yang menjelaskan banyak tentang arsitektur GPU mereka dan saya juga melihat tentang NVIDIA dalam manual CUDA, yang banyak membantu saya dalam memahami hal ini. Saya masih tidak mengerti beberapa hal dan saya mungkin salah, mungkin seseorang yang tahu lebih banyak dapat mengkonfirmasi atau menyangkal pernyataan saya, yang akan bagus untuk kita semua.

Pablo Ariel
sumber
6
analogi aneh tapi itu poin yang bagus the fastest isn't always the fastest.
Lie Ryan
1
Terima kasih! Saya pikir ini adalah topik yang menarik karena mengikat banyak konsep pemrograman game dengan cara perangkat keras bekerja, yang agak terlupakan di tanah bahasa tingkat tinggi saat ini. Ada beberapa hal lain yang ingin saya tambahkan tetapi menulis jawabannya sudah lama jadi saya akan mencoba untuk memperbaruinya nanti, seperti kemampuan "mode terlindungi" dari CPU, kecepatan bus memori, dll. Tapi saya harap ini menjelaskan beberapa kelemahan teknis dari mengeksekusi semua yang ada di GPU.
Pablo Ariel
6
Analogi akan jauh lebih baik jika akurat. Mobil F1 memiliki kemampuan pengereman luar biasa yang memungkinkan mereka mempertahankan kecepatan tinggi lebih jauh ke dalam kurva alih-alih mulai mengerem jauh di muka. Menikung dengan kecepatan tinggi juga lebih baik berkat daya turun yang tinggi, meskipun radius belokan mungkin tidak bagus untuk tempat parkir. Alasan yang lebih baik mungkin termasuk kurangnya ruang penyimpanan, kaca spion, AC, cruise control, perlindungan dari elemen, kursi penumpang, suspensi dan ground clearance untuk menangani jalan yang buruk, atau berbagai hal lain yang umum pada kendaraan penumpang.
GargantuChet
5
@Pablo Ariel Saya menanggapi pernyataan: "Mobil F1 tidak dapat rusak atau berputar secepat mobil kebanyakan". Anda menyarankan bahwa mobil F1 hanya dapat berakselerasi dalam garis lurus, dan tidak terlalu baik dalam belokan atau selama perlambatan. Tapi mobil F1 sebenarnya dapat rem jauh lebih cepat daripada "kebanyakan mobil", dan sangat baik di tikungan kecepatan tinggi.
GargantuChet
4
Analogi ini lebih akurat jika Anda berpikir dalam Dragsters daripada mobil F1
Agustin Meriles
32

GPU adalah tugas paralel yang sangat baik. Bagus sekali ... jika Anda menjalankan tugas paralel.

Game adalah jenis aplikasi yang paling tidak dapat diparalelkan. Pikirkan tentang loop permainan utama. AI (anggaplah pemain ditangani sebagai kasus khusus AI) perlu merespons tabrakan yang terdeteksi oleh fisika. Karena itu, harus dijalankan sesudahnya. Atau paling tidak, fisika perlu memanggil rutinitas AI dalam batas sistem fisika (yang umumnya bukan ide yang baik karena berbagai alasan). Grafik tidak dapat berjalan sampai fisika telah berjalan, karena fisika adalah yang memperbarui posisi objek. Tentu saja, AI perlu dijalankan sebelum rendering juga, karena AI dapat menelurkan objek baru. Suara perlu dijalankan setelah kontrol AI dan pemain

Secara umum, game dapat menyambung sendiri dengan sangat sedikit cara. Grafik dapat diputar dalam utas; lingkaran permainan dapat mendorong sekelompok data di utas grafik dan berkata: render ini. Ini dapat melakukan interpolasi dasar, sehingga loop permainan utama tidak harus disinkronkan dengan grafik. Suara adalah utas lainnya; lingkaran permainan mengatakan "mainkan ini", dan itu dimainkan.

Setelah itu, semuanya mulai terasa menyakitkan. Jika Anda memiliki algoritme lintasan yang rumit (seperti untuk RTS), Anda dapat utas itu. Mungkin diperlukan beberapa frame untuk menyelesaikan algoritme, tetapi setidaknya akan bersamaan. Di luar itu, cukup sulit.

Jadi Anda melihat 4 utas: game, grafik, suara, dan kemungkinan pemrosesan AI jangka panjang. Itu tidak banyak. Dan itu hampir tidak cukup untuk GPU, yang dapat memiliki ratusan utas dalam penerbangan sekaligus. Itulah yang memberi GPU kinerja mereka: bisa memanfaatkan semua utas itu sekaligus. Dan game tidak bisa melakukan itu.

Sekarang, mungkin Anda mungkin bisa "melebar" untuk beberapa operasi. AI, misalnya, biasanya tidak tergantung satu sama lain. Jadi Anda bisa memproses beberapa lusin AI sekaligus. Sampai Anda benar-benar harus membuat mereka saling bergantung. Maka Anda dalam kesulitan. Objek fisika sama-sama independen ... kecuali ada batasan antara mereka dan / atau mereka bertabrakan dengan sesuatu. Kemudian mereka menjadi sangat tergantung.

Plus, ada fakta bahwa GPU tidak memiliki akses ke input pengguna, yang seperti yang saya pahami agak penting untuk gim. Jadi itu harus disediakan. Itu juga tidak memiliki akses file langsung atau metode nyata berbicara ke OS; jadi sekali lagi, harus ada semacam cara untuk menyediakan ini. Oh, dan semua pemrosesan suara itu? GPU tidak mengeluarkan suara. Jadi mereka harus kembali ke CPU dan kemudian keluar ke chip suara.

Oh, dan coding untuk GPU sangat buruk. Sulit untuk mendapatkan yang benar, dan apa yang "benar" untuk satu arsitektur GPU bisa sangat, sangat salah untuk yang lain. Dan itu bahkan bukan hanya beralih dari AMD ke NVIDIA; yang bisa beralih dari GeForce 250 ke GeForce 450. Itu perubahan dalam arsitektur dasar. Dan itu bisa dengan mudah membuat kode Anda tidak berjalan dengan baik. C ++ dan bahkan C tidak diizinkan; yang terbaik yang Anda dapatkan adalah OpenCL, yang agak mirip C tetapi tanpa basa-basi. Seperti rekursi . Itu benar: tidak ada rekursi pada GPU.

Debugging? Oh, saya harap Anda tidak suka fitur debugging IDE Anda, karena itu pasti tidak akan tersedia. Bahkan jika Anda menggunakan GDB, cium selamat tinggal itu. Anda harus menggunakan printfdebug ... tunggu, tidak ada printfpada GPU. Jadi Anda harus menulis ke lokasi memori dan meminta program rintisan CPU Anda membacanya kembali.

Benar: debugging manual . Semoga beruntung dengan itu.

Juga, perpustakaan bermanfaat yang Anda gunakan di C / C ++? Atau mungkin Anda lebih menyukai .NET, menggunakan XNA dan sebagainya. Atau terserah. Tidak masalah, karena Anda tidak dapat menggunakan setiap dari mereka di GPU. Anda harus mengkodekan semuanya dari awal. Dan jika Anda memiliki basis kode yang sudah ada, sulit: waktu untuk menulis ulang semua kode itu.

Jadi ya. Sungguh mengerikan untuk melakukan semua jenis permainan yang kompleks. Dan itu bahkan tidak akan berhasil, karena game tidak cukup paralel untuk bisa membantu.

Nicol Bolas
sumber
21

Mengapa tidak begitu mudah untuk dijawab - penting untuk dicatat bahwa GPU adalah prosesor khusus yang tidak benar-benar dimaksudkan untuk penggunaan umum seperti CPU biasa. Karena spesialisasi ini, tidak mengherankan bahwa GPU dapat mengungguli CPU untuk hal-hal yang secara khusus dirancang (dan dioptimalkan), tetapi itu tidak berarti dapat menggantikan fungsionalitas penuh dan kinerja CPU yang digeneralisasi.

Saya menduga bahwa pengembang tidak melakukan ini karena berbagai alasan, termasuk:

  • Mereka ingin grafik menjadi secepat dan kualitas setinggi mungkin, dan menggunakan sumber daya GPU yang berharga dapat mengganggu ini.

  • Kode khusus GPU mungkin harus ditulis, dan ini kemungkinan akan memperkenalkan kompleksitas tambahan untuk keseluruhan pemrograman permainan (atau aplikasi) yang ada.

  • GPU biasanya tidak memiliki akses ke sumber daya seperti kartu jaringan, keyboard, mouse, dan joystick, sehingga tidak mungkin untuk menangani setiap aspek permainan.

Sebagai jawaban untuk bagian kedua dari pertanyaan Anda: Ya, ada kegunaan lain. Misalnya, proyek seperti SETI @ Home (dan mungkin proyek BOINC lainnya) menggunakan GPU (seperti yang dilakukan oleh nVidia) untuk perhitungan rumit berkecepatan tinggi:

  Jalankan SETI @ home di NVIDIA GPU Anda
  http://setiathome.berkeley.edu/cuda.php

( Saya suka pertanyaan Anda karena ini merupakan ide yang menarik. )

Randolf Richardson
sumber
18

CPU lebih fleksibel, umumnya lebih mudah untuk memprogram mereka, mereka dapat menjalankan utas lebih cepat.

Sementara GPU modern dapat diprogram untuk menyelesaikan hampir semua tugas, mereka hanya mendapatkan keuntungan kecepatan ketika mereka dapat memanfaatkan arsitektur paralel mereka. Ini biasanya terjadi dengan tugas-tugas "sederhana" yang sangat berulang. Banyak kode yang kita tulis bercabang terlalu tidak terduga untuk berjalan secara efisien pada GPU.

Yang paling penting, Anda bisa menghabiskan banyak waktu untuk mengoptimalkan kode chip grafis yang berbeda. Sementara OpenCL tersedia untuk membuat kode yang sama berjalan di banyak chip grafis yang berbeda, Anda akan memperdagangkan beberapa keunggulan kecepatan untuk kemewahan ini.

Dari perspektif programmer game, kami biasanya juga ingin game kami berjalan di komputer dengan kartu grafis yang lebih rendah. Beberapa chip terintegrasi tidak memiliki kemampuan pemrograman yang diperlukan, tetapi jika mereka melakukannya mereka sangat lambat sehingga mereka tidak akan mengalahkan prosesor dengan margin yang sangat besar, bahkan untuk jenis pekerjaan yang harus mereka lakukan dengan baik. Dan tentu saja jika Anda memanfaatkan GPU low-end untuk sebuah game, Anda akan membutuhkan daya pemrosesan yang sangat dibutuhkan dari rendering grafis.

Memang prospeknya bagus, tetapi ketika Anda membuat permainan alih-alih memecahkan kata sandi, masalah praktis dalam kebanyakan kasus lebih besar daripada manfaatnya.

aaaaaaaaaaaa
sumber
6

GPU sangat sulit diprogram. Anda harus mencari cara mengurutkan daftar pada GPU . Banyak tesis mencari untuk melakukannya.

Gunakan CPU dengan satu utas mudah, gunakan multi-utas lebih sulit, gunakan banyak komputer dengan perpustakaan paralel karena PVM atau MPI sulit dan gunakan gpu adalah yang paling sulit.

Ellis
sumber
4

Selain apa yang dijawab Randolf Richardson, ada beberapa fungsi tertentu yang tidak dapat ditangani oleh prosesor GPU sendiri. Sebagai contoh, beberapa perintah manajemen memori grafis diproses oleh CPU karena GPU tidak dapat menanganinya.

Dan ada satu alasan besar lainnya, GPU dirancang untuk perhitungan multithreaded. Ini berarti pembuat GPU dapat dengan mudah menambahkan inti kapan pun mereka ingin meningkatkan daya komputasi. Tetapi ada banyak tugas yang tidak dapat dibagi dalam masalah yang lebih kecil seperti menghitung angka kesembilan dalam seri Fibonacci . Dalam situasi ini, CPU jauh lebih cepat karena lebih dioptimalkan untuk tugas single-threaded.

Ali1S232
sumber
4

Ada banyak jawaban yang menunjukkan bahwa GPU hanya lebih cepat karena mereka menangani tugas secara paralel. Ini sedikit melebih-lebihkan masalah ini. GPU dapat lebih efisien karena alasan lain, seperti dapat memiliki akses memori yang lebih terbatas, tidak harus mendukung banyak tipe data, mampu memiliki set instruksi yang lebih efisien, dll. GPU awal masih dapat hanya menarik 1 pixel pada suatu waktu, tetapi itu adalah fakta bahwa mereka dapat melakukan 1 setiap siklus yang penting.

Perbedaan sebenarnya adalah karena mereka adalah 2 jenis mesin yang berbeda yang dikustomisasi untuk bekerja dengan baik pada berbagai kategori tugas yang tampak serupa tetapi sebenarnya sangat berbeda. Ini seperti membandingkan pesawat terbang dengan mobil. Pesawat ini memiliki kecepatan tertinggi yang jauh lebih tinggi tetapi memiliki lebih banyak pembatasan tentang bagaimana dapat digunakan. Pada kesempatan di mana Anda dapat melakukan perjalanan yang sama dengan jenis apa pun, pesawat tampak lebih unggul.

Kylotan
sumber
Analogi tentang pesawat sangat bagus (+1), tetapi berkenaan dengan CPU yang mendukung berbagai tipe data yang sebenarnya lebih merupakan konsep bahasa tingkat tinggi karena CPU (setidaknya dalam ruang Intel) cenderung hanya berurusan dengan data dalam bentuk yang sangat mendasar (misalnya, bit, byte, kata, kata kunci, dll.). Ada beberapa instruksi loop ketat untuk memindai atau menyalin data yang diakhiri dengan byte nol, tetapi data dalam contoh ini tidak benar-benar dikenali oleh CPU sebagai tipe tertentu (selain sebagai potongan data yang diakhiri nol) dalam konteks loop ini).
Randolf Richardson
@ Randolf: CPU memiliki instruksi dan register yang berbeda yang berhubungan dengan tipe data level rendah yang berbeda (mis. Ditandatangani vs. tidak ditandatangani, integral vs titik mengambang). Ini adalah kasus di 8086 dan memang sebagian besar arsitektur modern, dan itu tidak sepenuhnya gratis.
Kylotan
Saya yakin mereka masih melakukan banyak pemrosesan linier dalam arsitektur yang mendasarinya. Dari sisi pemrograman hanya diperlukan instruksi ke GPU tetapi core tidak mengeksekusi secara paralel karena ketergantungan mereka pada perangkat keras lain yang tidak paralel seperti membaca dari memori, mungkin GPU dapat memberikan data ke satu inti pada sebuah waktu.
Pablo Ariel
3

Pengembang memang menggunakan GPU untuk semua fungsi yang mereka kuasai. Mereka menggunakan CPU untuk semua fungsi yang mereka kuasai. Apa yang membuatmu berpikir mereka tidak melakukannya?

GPU bagus dalam tugas-tugas yang dapat lumpuh secara besar-besaran dan membutuhkan sejumlah besar perhitungan dengan persyaratan memori yang rendah atau korelasi temporal yang tinggi dengan hanya sejumlah kecil pengambilan keputusan. Ini termasuk rendering gambar, simulasi fisika (partikel, tabrakan, kain, air, refleksi) dan sebagainya. Jadi inilah tepatnya game modern yang menggunakan GPU.

CPU bagus dalam tugas-tugas yang tidak paralel dengan baik dan membutuhkan pengambilan keputusan dalam jumlah besar. Mereka dapat mentoleransi persyaratan memori tinggi bahkan dengan hanya korelasi temporal yang sedang. Ini termasuk kecerdasan buatan, antarmuka pengguna, disk dan I / O jaringan, dan sebagainya. Jadi inilah tepatnya game modern yang menggunakan CPU.

David Schwartz
sumber
1

Readback adalah alasan lain yang bisa saya pikirkan untuk sesekali lebih suka CPU. Bukan dalam hal bandwidth (seperti GPU -> CPU bandwidth tidak begitu banyak masalah pada perangkat keras modern) tetapi dalam hal menunda pipa. Jika Anda perlu mengambil kembali hasil dari perhitungan dan melakukan sesuatu yang menarik atau berguna dengannya, menggunakan GPU bukanlah pilihan yang bijaksana (dalam kasus umum - akan ada kasus khusus di mana ia dapat tetap sesuai) karena membaca kembali akan selalu membutuhkan GPU untuk menghentikan apa pun yang dilakukannya, siram semua perintah yang tertunda, dan tunggu hingga readback selesai. Ini dapat mematikan kinerja sejauh tidak hanya menghilangkan manfaat penggunaan GPU, tetapi sebenarnya mungkin jauh lebih lambat.

Maximus Minimus
sumber
0

Ini adalah utas lama, tetapi makalah yang baru-baru ini diterbitkan dapat menjawab pertanyaan ini. Makalah ini, yang diterbitkan dalam ACM Computing Survei 2015 menunjukkan bahwa masing-masing CPU dan GPU memiliki keunggulan unik dan karenanya, makalah ini membuat kasus untuk beralih dari paradigma "CPU vs GPU" ke "Komputasi kolaboratif CPU-GPU" ke CPU.

Sebuah Survei Teknik Komputasi heterogen CPU-GPU

pengguna984260
sumber