Hirdetés

Automatikusan OpenCL 1.2-re portolja a CUDA kódokat a Coriander

A gyártófüggő alternatívák mellett ez az első olyan projekt, amely teljesen szabványos alternatívát kínál erre a problémára.

Az OpenCL és a CUDA régóta létezik egymás mellett, de lényegi átjárhatóságot nem kínálnak. Ez azért problémás, mert CUDA-ról OpenCL-re és fordítva portolni igen drága az ipar számára, pedig maga a probléma annyira jelentős, hogy bőven lenne igény egy ilyen megoldásra.

Eddig a piacon egy értékelhető alternatíva volt a CUDA kódok egyszerű portolására. Ez az AMD HIP nyelve, amihez tartozik a HIPify eszköz is. Utóbbi tekinthető egy olyan konverternek, amely egy CUDA kódból HIP kódot generál, és ezt tulajdonképpen úgy éri el, hogy átnevezi az API hívásokat. Maga a módszer tehát kifejezetten egyszerűen dolgozik, továbbá a CUDA kód teljesítménye is átmenthető vele, miközben a forráskódban manuális módosításra gyakorlatilag alig van szükség. A HIP azonban ugyanazokkal a hátrányokkal küzd, mint a CUDA, csak éppen nem az NVIDIA, hanem az NVIDIA és az AMD hardvereihez van kötve, vagyis egy harmadik gyártóra már nem fordítható le a kód. A teljes szabványosításra törekvő ipar problémáját tehát egyáltalán nem oldja meg, noha kétségtelen, hogy fontos tényezőként lehet rá tekinteni, többek között azért, mert amennyiben csak az említett két gyártó kiszolgálása számít, akkor CUDA helyett már érdemes HIP kódban fejleszteni.

A szabvány szempontjából leginkább a SYCL kódokat lehet kiemelni, amelyek a SPIR-nek hála portolhatók is voltak. Ilyen megoldás a ComputeCpp és a triSYCL, de mindkettőnek az a hátránya, hogy annyira különböznek a CUDA, vagy akár a HIP API-tól, hogy az így írt alkalmazásokat manuálisan kell átírni rájuk.


[+]

A CUDA-on-CL volt az a projekt, amiben sokan bízhattak, hiszen átfogó módon próbálta kezelni az iparág nagy problémáját. Ez a rendszer arról szólt, hogy ha valaki CUDA kódot fejleszt (esetleg valamiért áttért HIP-re, ami igazából mindegy, mert az API hívások cseréjével ide-oda nagyon könnyen portolható ez a két nyelv), akkor elég csak egy fordítást bevállalni, és az eredeti CUDA kód, módosítás nélkül futni fog bármilyen OpenCL 1.2 API-t támogató hardveren. Ez mára vált igen jól használhatóvá, ami miatt a projekt elvesztette az eredeti megjelölését, és mostantól hivatalosan is Coriander néven folytatja a pályafutását, jelezvén az új lehetőségek a piac számára a portolható fejlesztés tekintetében.


[+]

A Coriander két lépcsőben dolgozik. Az eredeti CUDA C++11 kernelből a CLANG fordítót bevetve egy bájtkódot kreál, amiből egy OpenCL generátor biztosítja az OpenCL 1.2-n futó programot. A fejlesztés a jelenlegi állapotában igen jól működik, ráadásul pár meglehetősen komplex kernellel is elbánik, miközben gyártófüggetlen programfuttatást kínál. A Corianderrel portolt program sebessége az unáris és bináris operációkkal, valamint az egytengelyű redukcióban nagyon hasonló az eredeti CUDA kódhoz, de a teljes redukció határozottan lassabb, és jelenleg azt vizsgálják a fejlesztők, hogy miért. Amint ez kiderül, megpróbálják korrigálni a gondot egy új Coriander verzióban.

A nyílt forráskódú projekt elérhető az alábbi GitHUB oldalról. Az új verziók folyamatosan fognak érkezni, így érdemes sűrűn visszanézni.

Előzmények

Hirdetés