Apa implementasi BLAS / LAPACK tercepat yang tersedia atau rutinitas aljabar linear lainnya pada sistem GPU?

11

nVidia, misalnya, memiliki CUBLAS, yang menjanjikan peningkatan 7-14x. Naifnya, ini sama sekali tidak mendekati throughput teoritis kartu GPU nVidia. Apa saja tantangan dalam mempercepat aljabar linier pada GPU, dan apakah sudah ada rute aljabar linier yang lebih cepat?

Jiahao Chen
sumber

Jawaban:

9

Saya tidak bisa menjawab bagian kedua dari pertanyaan Anda sejauh implementasi lain di luar sana tapi saya bisa memberikan beberapa wawasan tentang tantangan. Untuk referensi, saya pribadi menggunakan ViennaCL pada nVidia GTX 560 Ti dengan memori 2GB untuk tolok ukur saya.

Lebih dari kode serial pada i5 mid-range, saya melihat percepatan untuk perkalian matriks padat sekitar 40x. Untuk operasi seperti vektor-skalar, saya melihat kecepatan 1000x lebih tinggi. Namun, gorila 800 pon di ruangan itu adalah bandwidth memori. Untuk sebagian besar GPU komersial, Anda akan menggunakan sesuatu seperti PCIe yang membatasi Anda untuk sekitar 6GB / s dari throughput. Dalam kasus saya, sementara perhitungannya 40x lebih cepat, tiga salinan matriks (dua untuk GPU, dan satu kembali) masing-masing menghabiskan waktu sebanyak hanya melakukan perhitungan pada CPU.

Masalahnya dengan perpustakaan umum untuk aljabar linear GPU adalah bahwa mereka tidak dapat benar-benar menggunakan kembali objek pada GPU, karena mereka tidak tahu apa yang akan Anda lakukan dengan mereka. Jadi setiap panggilan ke kernel komputasi kemungkinan akan membutuhkan penyalinan ke GPU, kemudian menyalin hasilnya kembali. Ini akan memakan sebagian besar keuntungan.

Jika Anda dapat menggunakan kembali objek seperti matriks, maka Anda dapat menulis algoritma level yang lebih tinggi untuk menghindari manajemen memori sebanyak mungkin, tetapi perpustakaan akan sulit sekali melakukannya secara efisien.

Saya harap ini membantu, dan saya yakin ada orang lain di sini yang jauh lebih berpengalaman dalam hal ini, tetapi ini adalah pengalaman dan kesan yang saya dapatkan selama terjun singkat dalam komputasi GPU.

Pelihat Godric
sumber
3
Inilah sebabnya mengapa Anda menginginkan objek yang hidup pada GPU untuk jangka waktu yang lama daripada disalin kembali ke CPU. Misalnya, matriks dan vektor PETSc berisi bendera yang menunjukkan apakah CPU dan / atau GPU saat ini. Operasi pada GPU menandai versi CPU sebagai kotor dan sebaliknya. Salinan dilakukan secara transparan jika Anda meminta memori di tempat yang kotor, tetapi itu jarang terjadi jika semua komponen algoritmik yang menyentuh struktur data besar dapat dieksekusi di tempat yang sama.
Jed Brown
5

Biarkan saya fokus hanya pada CUDA dan BLAS.

Mempercepat implementasi host BLAS bukanlah metrik yang baik untuk menilai throughput, karena itu tergantung pada terlalu banyak faktor, meskipun saya setuju bahwa speedup biasanya menjadi perhatian orang.

Jika Anda melihat tolok ukur yang diterbitkan oleh NVIDIA dan memperhitungkan bahwa Tesla M2090 memiliki kinerja puncak 1331 Gigaflops (presisi tunggal) dan 665 Gigaflops (presisi ganda), Anda akan melihat bahwa untuk SGEMM dan DGEMM kami memiliki throughput yang terukur hampir pada 60% dari yang teoritis, yang cukup bagus.

2mnkm×kk×n

Sehubungan dengan throughput floating point yang berkelanjutan, saya pikir jepit harus dihitung tanpa memperhitungkan data akun dan hasil waktu transfer, dan ini membuat perbandingan speedup menjadi sulit. Selain itu Anda harus memperhitungkan ukuran matriks, karena kinerja terbaik adalah untuk matriks besar.

Intinya: mempercepat aplikasi kehidupan nyata bisa sangat berbeda dari kinerja pengukuran puncak pada rutinitas aljabar linier, karena Anda harus mempertimbangkan inisialisasi GPU, waktu transfer data, dll.

Jadi saya tidak akan menjawab pertanyaan Anda tentang perpustakaan tercepat, karena pertanyaan itu tidak masuk akal kecuali metrik dan masalah yang tepat didefinisikan. Semua ini dikatakan, saya berpikir bahwa cuBLAS dan MAGMA adalah titik awal yang sangat baik.

Stefano M
sumber