Berapa banyak Antrian Direct / Compute / Copy yang bermakna?

11

DirectX 12 memperlihatkan antrian perintah untuk grafik (disebut "Direct"), menghitung atau menyalin tugas. Dalam hal fungsionalitas yang disediakan, masing-masing adalah super-set yang berikut ini. The Spesifikasi menyatakan bahwa antrian perintah dapat dijalankan secara bersamaan oleh perangkat. Namun, API tidak membatasi jumlah antrian perintah dengan cara apa pun (setidaknya saya tidak mengetahui adanya batasan).

Tampaknya, berbagai vendor menangani ini sangat berbeda:

  • Intel menyatakan dalam presentasi baru - baru ini (slide 23) bahwa saat ini GPU mereka tidak mampu menangani Grafik & Komputasi secara paralel dan bahwa mesin fotokopi memiliki throughput yang lemah. Mereka menyarankan agar tidak menggunakan banyak grafik / menghitung antrian.
  • AMD mulai sejak lama untuk mengiklankan penggunaan antrian / "asynchronous shaders" yang dimulai dengan Mantle dan konsol gen saat ini. Ada juga beberapa pengembang ( contoh ) yang mengkonfirmasi keuntungan kinerja yang signifikan dengan menjalankan tugas komputasi dan grafik secara paralel.
  • Baru-baru ini ada beberapa keributan tentang Nvidia yang tidak mendukung asynchronous shader di perangkat keras: Menggunakan grafik yang terpisah dan antrian Compute secara bersamaan tampaknya membuat hal-hal lebih lambat yang menunjukkan emulasi driver. Operasi penyalinan paralel, di sisi lain, telah didukung oleh CUDA untuk waktu yang sangat lama, yang membuatnya jelas bahwa mesin DMA dapat bekerja secara independen.

Apakah ada cara untuk memutuskan pada saat runtime jika itu berarti untuk melakukan CommandLists ke beberapa CommandQueues alih-alih satu? (mengingat bahwa kasus sebelumnya tidak melibatkan banyak overhead teknik)

Walaupun saya dapat dengan mudah melihat bagaimana melakukan operasi memori secara paralel untuk menghitung / operasi grafis, saya merasa sangat rumit untuk menjalankan banyak proses komputasi dan grafik secara paralel (kecuali tidak ada manfaat utama perf). Juga tidak jelas bagi saya, bagaimana hal ini dapat menyebabkan kinerja yang jauh lebih baik; kecuali untuk kasus patologis di mana banyak tugas sekuensial kecil tidak dapat menghasilkan beban GPU yang cukup.

Wumpf
sumber
1
Saya tidak berpikir bahwa ada cara yang berarti untuk melakukan penilaian semacam itu saat ini, selain memeriksa siapa yang membuat GPU. Pada akhirnya ada lebih banyak faktor dari sekadar "dapatkah perangkat keras mengeksekusi perintah dari banyak antrian secara bersamaan", dan D3D12 memisahkan detail-detail itu. Bahkan D3D12 bahkan tidak membedakan antara perangkat keras yang dapat mengeksekusi antrian secara bersamaan dan yang mungkin melakukannya secara berurutan, dokumen hanya mengatakan bahwa abstraksi mereka memungkinkan untuk eksekusi bersamaan.
MJP
1
Pertanyaan bagus ! Saya juga merasa akan istimewa untuk mendapatkan kinerja untuk menghitung dan menaungi secara bersamaan. mungkin keuntungan dapat terjadi berkat fakta yang sama yang membuat hyperthreading entah bagaimana lebih cepat. operasi interleaving ketika beberapa unit sibuk untuk antrian lainnya. seperti shader menyumbat unit tekstur, yang tidak digunakan oleh tahap komputasi, yang dengan sendirinya menyumbat FPU atau DPU.
v.oddou
Sayang sekali. Mungkin kemudian "selain memeriksa siapa yang membuat GPU, tidak" sudah dianggap sebagai jawaban jika tidak ada lebih dari itu. Setelah membaca semua hal pemasaran AMD saya senang mendengar bahwa saya tidak sendirian dengan kebingungan saya.
Wumpf
1
Anda tahu hanya untuk mengangkat sedikit berat ke pentingnya (sebenarnya tidak penting) dari masalah ini. SDK PS4 memiliki bug yang tidak memungkinkan memancarkan ke antrian lain selain antrian 0. Saya pikir jika itu sangat penting itu akan diperbaiki lebih cepat.
v.oddou

Jawaban:

1

Kirimkan aplikasi Anda dengan urutan tolok ukur menguji platform yang sebenarnya. (Kemungkinan jawabannya untuk banyak pertanyaan, kurasa ...)

Saya menduga kinerjanya sangat tergantung pada bagaimana Anda menggunakan perangkat keras. Karena perangkat keras tidak mungkin untuk menginstruksikan aplikasi Anda ke belakang, memberi tahu Anda apa yang harus dilakukan, saya akan menggunakan apa pun yang terlihat bagus dalam desain Anda.

"... perintah antrian dapat dieksekusi secara bersamaan oleh perangkat ..."

Kata kunci adalah CAN. Saya tidak melihat alasan mengapa vendor mana pun akan mengacaukannya. Pada akhirnya itu adalah penyedia platform (Intel / AMD / Nvidia) yang bertanggung jawab membuat Anda driver yang cukup baik bagi Anda untuk tidak mempertimbangkan beralih vendor. Jika mereka memang memiliki "masalah pengetahuan" dengan fungsi ini (yang omong-omong tidak memiliki arti fungsional, hanya kinerja) maka mereka juga harus menyelesaikannya menggunakan apa yang mereka ketahui. Maksud saya untuk menangis dengan keras, fallback adalah sesuatu yang telah mereka terapkan; eksekusi selaras.

Perangkat keras sudah cukup voodoo bagi kami pengembang.

Andreas
sumber
AMD GCN akan mengeksekusi grafik dan menghitung secara bersamaan bahkan ketika keduanya dikeluarkan pada antrian grafis, tetapi umumnya tidak melintasi beberapa buffer perintah (beberapa panggilan undian bahkan mungkin samar). Pengemudi (atau aplikasi - saya pikir dalam DX12 atau Vulkan) harus memeriksa dependensi data dan memblokir antara gambar (grafik) dan pengiriman (menghitung) jika diperlukan. Beberapa perintah antrian mungkin akan berguna jika Anda telah menghitung yang benar-benar tidak sinkron dari grafik (seperti fisika untuk frame berikutnya), tetapi saya tidak punya pengalaman langsung dengan ini.
Daniel M Gessel