OpenCL dalam tugas sehari-hari

Baru-baru ini, kami berbicara tentang HSA dan selama diskusi tentang keuntungan dari pendekatan baru untuk membangun PC, kami menyentuh topik yang menarik seperti GPGPU - komputasi tujuan umum pada akselerator grafis. Saat ini, akselerator video AMD menyediakan akses ke sumber dayanya menggunakan OpenCL, sebuah kerangka kerja yang menyediakan sistem paralel-tinggi yang relatif dapat diprogram dan intuitif.


Saat ini, teknologi OpenCL didukung oleh semua pemain utama di pasar: kemampuan untuk menyediakan program dengan akses ke akselerasi "maju" (juga gratis, karena OpenCL tidak menyiratkan royalti dan royalti) jelas sepadan, dan semua orang mendapat manfaat dari fleksibilitas API semacam itu. yang mengimplementasikan dukungan OpenCL dalam produk mereka.

Baca lebih lanjut tentang di mana Anda dapat bertemu OpenCL dalam kehidupan sehari-hari hari ini, bagaimana hal itu mempercepat perangkat lunak perkantoran biasa dan peluang apa yang terbuka untuk pengembang hari ini dan kita akan bicara.

GPGPU, OpenCL dan sedikit sejarah


Tentu saja, OpenCL bukan satu-satunya cara untuk mengimplementasikan komputasi GPU umum. Selain OpenCL, ada CUDA, OpenACC, dan C ++ AMP di pasaran, tetapi dua teknologi pertama sangat populer dan terkenal.

Orang yang sama yang memberi dunia teknologi OpenGL dan OpenAM: Khronos Group, sedang mengembangkan standar OpenCL. Merek dagang OpenCL sendiri dimiliki oleh Apple, tetapi, untungnya bagi pemrogram dan pengguna di seluruh dunia, teknologi ini tidak tertutup atau terikat dengan produk-produk perusahaan "apel". Selain Apple, Khronos Goup termasuk raksasa pasar seperti Activision Blizzard, AMD, IBM, Intel, NVidia dan selusin perusahaan lainnya (terutama produsen solusi ARM) yang bergabung dengan konsorsium nanti.

Dalam batas tertentu, OpenCL dan CUDA secara ideologis dan sintaksis serupa, dari mana masyarakat hanya mendapat manfaat. Karena kesamaan metode dan pendekatan tertentu, lebih mudah bagi programmer untuk menggunakan kedua teknologi, untuk beralih dari "tertutup" dan perangkat keras NVidia CUDA terikat ke universal dan bekerja di mana-mana (termasuk CPU multi-core biasa, dan superkomputer berbasis arsitektur CELL) OpenCL .

OpenCL dalam penggunaan sehari-hari


Sekarang Anda akan berpikir, "yeah, mereka akan berbicara tentang permainan dan photoshop." Tidak, OpenCL mampu mempercepat komputasi di luar grafis saja. Salah satu aplikasi paling populer yang menggunakan kapabilitas GPGPU adalah ... suite kantor lintas platform LibreOffice. Dukungan OpenCL muncul di dalamnya pada tahun 2014 dan digunakan untuk mempercepat perhitungan di manajer tabel Calc.

Berikut perbandingan visual kinerja sistem dengan AMD A10-7850K dengan inti grafis R7 dan Intel Core I5 ​​dengan HD4600 on board:



Dalam tes sintetik, AMD A10-7850K yang sama dalam komputasi heterogen menggunakan OpenCL mengungguli i5-4670K / 4690 yang hampir dua kali lebih mahal :


Ngomong-ngomong, dalam sains dan bidang terapannya ada banyak tugas yang dengan sempurna bergeser ke prosesor vektor akselerator video dan memungkinkan Anda untuk melakukan perhitungan puluhan dan ratusan kali lebih cepat daripada pada CPU.

Misalnya, berbagai bagian aljabar linier. Penggandaan vektor dan matriks adalah apa yang dilakukan GPU setiap hari, bekerja dengan grafik. Dalam tugas ini, mereka praktis tidak ada bandingannya, karena arsitektur mereka telah diasah untuk memecahkan masalah seperti itu selama bertahun-tahun.

Ini juga termasuk transformasi Fourier cepat dan semua yang terhubung dengannya: menyelesaikan persamaan diferensial kompleks dengan berbagai metode. Secara terpisah, kita dapat membedakan masalah gravitasi N-bodyyang digunakan untuk menghitung aero- dan hidrodinamika, pemodelan cairan dan plasma. Kompleksitas perhitungan terletak pada kenyataan bahwa setiap partikel berinteraksi dengan yang lain, hukum interaksi cukup rumit, dan perhitungannya perlu dilakukan secara paralel. Untuk tugas-tugas seperti itu, kemampuan OpenCL dan AMD GPU sangat cocok, seperti komputasi paralel dengan banyak objek dan dengan demikian berhasil diselesaikan pada prosesor jenis ini setiap hari: dalam pixel shaders .

Grid terstruktur sering digunakan dalam grafik raster. Perhitungan tidak terstruktur - dalam bidang hidrodinamika dan dalam berbagai perhitungan dengan elemen yang grafiknya memiliki bobot berbeda. Perbedaan antara kisi-kisi terstruktur dan yang tidak terstruktur dalam jumlah "tetangga" dari setiap elemen: kisi terstruktur memiliki perbedaan yang sama, kisi-kisi terstruktur memiliki yang berbeda, tetapi keduanya sangat cocok dengan kemampuan OpenCL untuk mempercepat perhitungan. Kesulitan dalam mentransfer perhitungan sebagian besar adalah matematika. Artinya, tugas utama programmer tidak hanya untuk "menulis" kerja sistem, tetapi juga untuk mengembangkan deskripsi matematis yang mentransfer data ke kemampuan perangkat keras menggunakan OpenCL.

Logika kombinatorial (perhitungan hash juga berlaku di sini), metode Monte Carlo- yang portingnya baik ke GPU. Banyak modul komputasi, kinerja tinggi dalam komputasi paralel adalah apa yang benar-benar mempercepat algoritma ini.

Apa lagi yang bisa dipercepat dengan OpenCL dan GPU yang kuat?


Cari jalan kembali. Perhitungan grafik dan pemrograman dinamis: penyortiran, deteksi tabrakan (kontak, persimpangan), pembuatan struktur reguler, berbagai seleksi dan algoritma pencarian. Dengan beberapa keterbatasan, tetapi mereka cenderung mengoptimalkan dan mempercepat pekerjaan jaringan saraf dan struktur terkait, tetapi di sini, masalahnya lebih mungkin bahwa struktur saraf hanya "mahal" untuk divirtualisasi, lebih menguntungkan untuk menggunakan solusi FPGA. Pekerjaan mesin keadaan terbatas (yang sudah digunakan dalam bekerja dengan GPU, misalnya, ketika datang ke kompresi / dekompresi video atau pekerjaan menemukan elemen berulang) sangat baik.

OpenCL vs CUDA


Membandingkan secara langsung kinerja OpenCL dan CUDA tidak masuk akal. Pertama, jika kita membandingkannya pada kartu video AMD dan NVidia, adapter video AMD akan menang dalam perlombaan komputasi yang sulit: akselerator NVidia modern memiliki sejumlah batasan kinerja dalam format FP64 yang diperkenalkan oleh NVidia sendiri untuk menjual kartu video “profesional” untuk komputasi (Tesla dan Titan Z series). Harga mereka jauh lebih tinggi daripada rekan FLOPS mereka berdasarkan pada solusi AMD dan kartu "terkait" mereka di garis nomor NVidia, yang membuat perbandingannya agak rumit. Anda dapat mempertimbangkan produktivitas-per-watt atau produktivitas-per-dolar, tetapi ini hampir tidak ada hubungannya dengan perbandingan murni daya komputasi: "FLOPS dengan biaya berapa pun" sangat tidak cocok dengan situasi keuangan saat ini,dan dalam hal kinerja per dolar, "wanita tua" Edisi 7970 GHz (alias R9 280X) masih merupakan salah satu kartu video yang paling menguntungkan.

Kedua, Anda dapat mencoba membandingkan OpenCL dan CUDA pada kartu video dari NVidia, tetapi NVidia sendiri mengimplementasikan OpenCL melalui CUDA pada level driver, sehingga perbandingannya akan agak tidak jujur ​​karena alasan yang jelas.

Di sisi lain, jika Anda memperhitungkan tidak hanya kinerja, maka beberapa analisis masih bisa dilakukan.

OpenCL berjalan pada daftar perangkat keras yang jauh lebih besar daripada NVidia CUDA. Hampir semua CPU mendukung set instruksi SSE 3, akselerator video dari Radeon HD5xxx dan NVidia GT8600 ke Fury / Fury-X dan 980Ti / Titan X terbaru, APU dari AMD, grafis terintegrasi Intel - secara umum, hampir semua perangkat keras modern dengan beberapa core dapat manfaatkan teknologi ini.

Fitur implementasi CUDA dan OpenCL (serta dokumentasi yang agak rumit, karena pemrograman paralel secara keseluruhan jauh dari area pengembangan yang paling mudah), agak tercermin dalam kemampuan dan alat pengembangan spesifik, dan bukan di bidang produktivitas.

Misalnya, OpenCL memiliki beberapa masalah alokasi memori karena "Dokumentasi OpenCL sangat tidak jelas di sini".

Pada saat yang sama, CUDA lebih rendah daripada OpenCL di bidang sinkronisasi arus - data, instruksi, memori, apa pun. Selain itu, menggunakan OpenCL, Anda dapat menggunakan antrian dan instruksi yang tidak sesuai pesanan, dan CUDA masih hanya tahu cara melakukan pemesanan. Dalam praktiknya, ini menghindari waktu henti prosesor saat menunggu data, dan efeknya lebih terlihat, semakin lama penutup prosesor dan semakin besar perbedaan antara kecepatan memori dan kecepatan modul komputasi. Singkatnya: semakin banyak kekuatan yang Anda alokasikan di bawah OpenCL, semakin besar kesenjangan dalam kinerja. CUDA akan membutuhkan penulisan kode yang jauh lebih kompleks untuk mencapai hasil yang sebanding.

Alat pengembangan (debugger, profiler, compiler) CUDA agak lebih baik daripada yang serupa di OpenCL, tetapi CUDA mengimplementasikan API melalui C, dan OpenCL melalui C ++, menyederhanakan pekerjaan dengan pemrograman berorientasi objek, sementara kedua kerangka kerja penuh dengan "lokal »Trik, batasan, dan fitur.



Pendekatan NVidia dalam hal ini sangat mirip dengan cara Apple bekerja. Solusi tertutup, dengan sejumlah besar batasan dan aturan ketat, tetapi dipertajam dengan baik untuk bekerja pada perangkat keras tertentu.

OpenCL menawarkan alat dan kemampuan yang lebih fleksibel, tetapi membutuhkan tingkat pelatihan yang lebih tinggi dari pengembang. Kode umum pada OpenCL murni harus dijalankan pada perangkat keras apa pun yang mendukungnya, tetapi pada saat yang sama "dioptimalkan" untuk solusi spesifik (katakanlah, akselerator video AMD atau prosesor CELL) akan bekerja lebih cepat.

Source: https://habr.com/ru/post/id388421/


All Articles